@akta/sdk 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/auction/index.js +5 -5
  2. package/dist/auction/index.mjs +4 -4
  3. package/dist/{chunk-C3Q3DYPD.mjs → chunk-2AR3LS5J.mjs} +3 -3
  4. package/dist/{chunk-C3Q3DYPD.mjs.map → chunk-2AR3LS5J.mjs.map} +1 -1
  5. package/dist/{chunk-IZTB6YOJ.js → chunk-2WOYNNPV.js} +8 -8
  6. package/dist/{chunk-IZTB6YOJ.js.map → chunk-2WOYNNPV.js.map} +1 -1
  7. package/dist/{chunk-WPATZWNC.mjs → chunk-4ANINCSI.mjs} +3 -3
  8. package/dist/{chunk-BP23PXOA.js → chunk-5M6DY6Q7.js} +7 -7
  9. package/dist/{chunk-BP23PXOA.js.map → chunk-5M6DY6Q7.js.map} +1 -1
  10. package/dist/{chunk-N4PQF2XF.mjs → chunk-6MGMITC7.mjs} +3 -3
  11. package/dist/{chunk-IOSDIJTT.mjs → chunk-6PHYDWAI.mjs} +3 -3
  12. package/dist/{chunk-I2AH4XA6.js → chunk-76JFN4TN.js} +6 -6
  13. package/dist/{chunk-I2AH4XA6.js.map → chunk-76JFN4TN.js.map} +1 -1
  14. package/dist/{chunk-KMVWSUUI.js → chunk-AXS7YUII.js} +21 -10
  15. package/dist/chunk-AXS7YUII.js.map +1 -0
  16. package/dist/{chunk-VARI5DBW.js → chunk-B3ANVNAW.js} +31 -31
  17. package/dist/{chunk-VARI5DBW.js.map → chunk-B3ANVNAW.js.map} +1 -1
  18. package/dist/{chunk-APOVSDCN.mjs → chunk-CPU7YHCB.mjs} +2 -2
  19. package/dist/{chunk-BTVZKNNI.js → chunk-FQEKBA3B.js} +5 -5
  20. package/dist/{chunk-BTVZKNNI.js.map → chunk-FQEKBA3B.js.map} +1 -1
  21. package/dist/{chunk-ZABE6CV7.mjs → chunk-FZXOT7SC.mjs} +3 -3
  22. package/dist/{chunk-TGH7PFXC.mjs → chunk-GRR6MUNV.mjs} +3 -3
  23. package/dist/{chunk-M5QOSPKZ.js → chunk-GVPFBZMF.js} +5 -5
  24. package/dist/{chunk-M5QOSPKZ.js.map → chunk-GVPFBZMF.js.map} +1 -1
  25. package/dist/{chunk-LW57YWGF.js → chunk-HHXP4XDJ.js} +5 -5
  26. package/dist/{chunk-LW57YWGF.js.map → chunk-HHXP4XDJ.js.map} +1 -1
  27. package/dist/{chunk-5CPWIJNS.js → chunk-HIDVSX3C.js} +7 -7
  28. package/dist/{chunk-5CPWIJNS.js.map → chunk-HIDVSX3C.js.map} +1 -1
  29. package/dist/{chunk-7C2J3XNH.js → chunk-HT2LVEDG.js} +5 -5
  30. package/dist/{chunk-7C2J3XNH.js.map → chunk-HT2LVEDG.js.map} +1 -1
  31. package/dist/{chunk-VNBPUJXA.mjs → chunk-IERRX2GS.mjs} +3 -3
  32. package/dist/{chunk-QZWXM2GR.mjs → chunk-IWPVSICN.mjs} +3 -3
  33. package/dist/{chunk-LAANYMUP.mjs → chunk-JMZYQMSW.mjs} +3 -3
  34. package/dist/{chunk-HXF3JLNE.js → chunk-JPV3DVL6.js} +10 -10
  35. package/dist/{chunk-HXF3JLNE.js.map → chunk-JPV3DVL6.js.map} +1 -1
  36. package/dist/{chunk-5F5IFJ2J.mjs → chunk-KPXE4SEJ.mjs} +2 -2
  37. package/dist/{chunk-FVFLY5A6.js → chunk-LYG4MDFV.js} +6 -6
  38. package/dist/{chunk-FVFLY5A6.js.map → chunk-LYG4MDFV.js.map} +1 -1
  39. package/dist/{chunk-XASWHIKG.js → chunk-MDSBD67B.js} +6 -6
  40. package/dist/{chunk-XASWHIKG.js.map → chunk-MDSBD67B.js.map} +1 -1
  41. package/dist/{chunk-WEGE45N2.mjs → chunk-MOHS2K45.mjs} +3 -3
  42. package/dist/{chunk-CC6LCTVW.mjs → chunk-NANBUL67.mjs} +2 -2
  43. package/dist/{chunk-C7GS6GJZ.mjs → chunk-OYSHMZRR.mjs} +4 -4
  44. package/dist/{chunk-ZHFTRBE6.mjs → chunk-SGXO2K4C.mjs} +3 -3
  45. package/dist/{chunk-RZUZCM44.js → chunk-SQH64QTI.js} +4 -4
  46. package/dist/{chunk-RZUZCM44.js.map → chunk-SQH64QTI.js.map} +1 -1
  47. package/dist/{chunk-MATDF7EM.mjs → chunk-TQADXRCE.mjs} +15 -4
  48. package/dist/{chunk-MATDF7EM.mjs.map → chunk-TQADXRCE.mjs.map} +1 -1
  49. package/dist/{chunk-4M6IGGNM.js → chunk-UWAIIBII.js} +3 -3
  50. package/dist/{chunk-4M6IGGNM.js.map → chunk-UWAIIBII.js.map} +1 -1
  51. package/dist/{chunk-MGXVNKUX.js → chunk-V2TNS6B5.js} +8 -8
  52. package/dist/{chunk-MGXVNKUX.js.map → chunk-V2TNS6B5.js.map} +1 -1
  53. package/dist/{chunk-S7HZC5RM.js → chunk-VL2UI54Z.js} +5 -5
  54. package/dist/{chunk-S7HZC5RM.js.map → chunk-VL2UI54Z.js.map} +1 -1
  55. package/dist/{chunk-SXS2YREI.mjs → chunk-VVRQI5IY.mjs} +4 -4
  56. package/dist/{chunk-B54US4TN.mjs → chunk-XNWIPDFE.mjs} +4 -4
  57. package/dist/{chunk-ZW5I4BM7.js → chunk-YHMGRIY5.js} +8 -8
  58. package/dist/{chunk-ZW5I4BM7.js.map → chunk-YHMGRIY5.js.map} +1 -1
  59. package/dist/dao/constants.d.ts +2 -1
  60. package/dist/dao/index.js +5 -5
  61. package/dist/dao/index.mjs +4 -4
  62. package/dist/dao/types.d.ts +5 -1
  63. package/dist/dao-deployable/index.js +7 -7
  64. package/dist/dao-deployable/index.mjs +4 -4
  65. package/dist/escrow/index.js +4 -4
  66. package/dist/escrow/index.mjs +3 -3
  67. package/dist/gates/index.js +4 -4
  68. package/dist/gates/index.mjs +3 -3
  69. package/dist/hyper-swap/index.js +4 -4
  70. package/dist/hyper-swap/index.mjs +3 -3
  71. package/dist/index.js +19 -19
  72. package/dist/index.mjs +18 -18
  73. package/dist/marketplace/index.js +5 -5
  74. package/dist/marketplace/index.mjs +4 -4
  75. package/dist/meta-merkles/index.js +4 -4
  76. package/dist/meta-merkles/index.mjs +3 -3
  77. package/dist/poll/index.js +4 -4
  78. package/dist/poll/index.mjs +3 -3
  79. package/dist/prize-box/index.js +4 -4
  80. package/dist/prize-box/index.mjs +3 -3
  81. package/dist/raffle/index.js +5 -5
  82. package/dist/raffle/index.mjs +4 -4
  83. package/dist/rewards/index.js +4 -4
  84. package/dist/rewards/index.mjs +3 -3
  85. package/dist/social/index.js +3 -3
  86. package/dist/social/index.mjs +2 -2
  87. package/dist/staking/index.js +4 -4
  88. package/dist/staking/index.mjs +3 -3
  89. package/dist/staking-pool/index.js +4 -4
  90. package/dist/staking-pool/index.mjs +3 -3
  91. package/dist/subscriptions/index.js +4 -4
  92. package/dist/subscriptions/index.mjs +3 -3
  93. package/dist/wallet/index.js +4 -4
  94. package/dist/wallet/index.mjs +3 -3
  95. package/package.json +1 -1
  96. package/dist/chunk-KMVWSUUI.js.map +0 -1
  97. /package/dist/{chunk-WPATZWNC.mjs.map → chunk-4ANINCSI.mjs.map} +0 -0
  98. /package/dist/{chunk-N4PQF2XF.mjs.map → chunk-6MGMITC7.mjs.map} +0 -0
  99. /package/dist/{chunk-IOSDIJTT.mjs.map → chunk-6PHYDWAI.mjs.map} +0 -0
  100. /package/dist/{chunk-APOVSDCN.mjs.map → chunk-CPU7YHCB.mjs.map} +0 -0
  101. /package/dist/{chunk-ZABE6CV7.mjs.map → chunk-FZXOT7SC.mjs.map} +0 -0
  102. /package/dist/{chunk-TGH7PFXC.mjs.map → chunk-GRR6MUNV.mjs.map} +0 -0
  103. /package/dist/{chunk-VNBPUJXA.mjs.map → chunk-IERRX2GS.mjs.map} +0 -0
  104. /package/dist/{chunk-QZWXM2GR.mjs.map → chunk-IWPVSICN.mjs.map} +0 -0
  105. /package/dist/{chunk-LAANYMUP.mjs.map → chunk-JMZYQMSW.mjs.map} +0 -0
  106. /package/dist/{chunk-5F5IFJ2J.mjs.map → chunk-KPXE4SEJ.mjs.map} +0 -0
  107. /package/dist/{chunk-WEGE45N2.mjs.map → chunk-MOHS2K45.mjs.map} +0 -0
  108. /package/dist/{chunk-CC6LCTVW.mjs.map → chunk-NANBUL67.mjs.map} +0 -0
  109. /package/dist/{chunk-C7GS6GJZ.mjs.map → chunk-OYSHMZRR.mjs.map} +0 -0
  110. /package/dist/{chunk-ZHFTRBE6.mjs.map → chunk-SGXO2K4C.mjs.map} +0 -0
  111. /package/dist/{chunk-SXS2YREI.mjs.map → chunk-VVRQI5IY.mjs.map} +0 -0
  112. /package/dist/{chunk-B54US4TN.mjs.map → chunk-XNWIPDFE.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-5CPWIJNS.js","../src/staking-pool/index.ts","../src/generated/StakingPoolClient.ts","../src/generated/StakingPoolFactoryClient.ts","../src/staking-pool/factory.ts","../src/staking-pool/types.ts"],"names":["APP_SPEC","BinaryStateValue","_AppFactory","_AppClient","getArc56ReturnValue","PoolStatus","StakingPoolStakingType","DistributionType","DisbursementPhase","microAlgo"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-5CPWIJNS.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport {\n StakingPoolClient,\n StakingPoolFactory,\n StakingPoolArgs,\n StakingPoolState,\n StakingPoolMbrData,\n Reward\n} from '../generated/StakingPoolClient';\nimport { GroupReturn, MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n AddRewardParams,\n AddRewardAsaParams,\n FinalizePoolParams,\n EnterPoolParams,\n StartDisbursementParams,\n RaffleParams,\n DisburseRewardsParams,\n FinalizeDistributionParams,\n OptinAssetParams,\n CheckParams,\n CheckResult,\n IsEnteredParams,\n StakingPoolMbrParams,\n GateCheckParams\n} from \"./types\";\n\nexport * from \"./factory\";\nexport * from \"./types\";\n\ntype PoolContractArgs = StakingPoolArgs[\"obj\"];\n\n/**\n * SDK for interacting with an individual Staking Pool contract.\n * Use this to manage pool state, add rewards, and handle entries.\n */\nexport class StakingPoolSDK extends BaseSDK<StakingPoolClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: StakingPoolFactory, ...params });\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current state of the pool.\n */\n async getState(): Promise<StakingPoolState> {\n const { return: state } = await this.client.send.getState({ args: {} });\n\n if (state === undefined) {\n throw new Error('Failed to get pool state');\n }\n\n return state;\n }\n\n /**\n * Checks if pool signups are currently open.\n */\n async signUpsOpen(): Promise<boolean> {\n const isOpen = await this.client.signUpsOpen();\n return isOpen ?? false;\n }\n\n /**\n * Checks if the pool is currently live (active).\n */\n async isLive(): Promise<boolean> {\n const isLive = await this.client.isLive();\n return isLive ?? false;\n }\n\n /**\n * Checks if an address is entered in the pool.\n */\n async isEntered({ address }: IsEnteredParams): Promise<boolean> {\n const entered = await this.client.isEntered({ args: { address } });\n return entered ?? false;\n }\n\n /**\n * Checks eligibility and stake amount for an address/asset combination.\n */\n async check({ address, asset }: CheckParams): Promise<CheckResult> {\n const { return: result } = await this.client.send.check({ args: { address, asset } });\n\n if (result === undefined) {\n throw new Error('Failed to check eligibility');\n }\n\n return {\n isEligible: result.valid,\n stake: result.balance\n };\n }\n\n async gateCheck({ gateTxn, address, asset }: GateCheckParams): Promise<void> {\n \n \n await this.client.send.gateCheck({ args: { gateTxn, address, asset } });\n }\n\n /**\n * Gets MBR data for the pool based on winning tickets count.\n */\n async getMbr({ winningTickets }: StakingPoolMbrParams): Promise<StakingPoolMbrData> {\n const { return: mbrData } = await this.client.send.mbr({ args: { winningTickets } });\n\n if (mbrData === undefined) {\n throw new Error('Failed to get MBR data');\n }\n\n return mbrData;\n }\n\n\n async getReward(rewardId: number): Promise<Reward> {\n const reward = await this.client.state.box.rewards.value(rewardId);\n\n if (reward === undefined) {\n throw new Error('Failed to get reward');\n }\n\n return reward;\n }\n\n async getRewards(): Promise<Map<number, Reward>> {\n const rewards = await this.client.state.box.rewards.getMap();\n return new Map(Array.from(rewards.entries()).map(([key, value]) => [Number(key), value]));\n }\n\n // ========== Write Methods ==========\n\n /**\n * Initializes the pool after creation.\n */\n async init(params?: MaybeSigner): Promise<void> {\n const sendParams = this.getSendParams(params);\n\n await this.client.send.init({\n ...sendParams,\n args: {}\n });\n }\n\n /**\n * Opts the pool contract into an asset.\n */\n async optIn({ sender, signer, asset }: OptinAssetParams): Promise<GroupReturn> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.client.optInCost({ args: { asset } });\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n const group = this.client.newGroup();\n\n group.optIn({\n ...sendParams,\n args: {\n payment,\n asset\n }\n });\n\n group.opUp({\n ...sendParams,\n args: {},\n });\n\n return await group.send({ ...sendParams, });\n }\n\n /**\n * Adds a reward to the pool.\n */\n async addReward({ sender, signer, reward, amount }: AddRewardAsaParams): Promise<void> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get MBR for reward\n const mbrData = await this.getMbr({ winningTickets: reward.winnerCount });\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.rewards),\n receiver: this.client.appAddress,\n });\n\n const assetXfer = this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(reward.asset),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.addRewardAsa({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n reward\n }\n });\n }\n\n /**\n * Finalizes the pool with signup, start, and end timestamps.\n */\n async finalize({ sender, signer, signupTimestamp, startTimestamp, endTimestamp }: FinalizePoolParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.finalize({\n ...sendParams,\n args: {\n signupTimestamp,\n startTimestamp,\n endTimestamp\n }\n });\n }\n\n /**\n * Gets the cost to enter the pool for a given address and entry count.\n * This calls the contract's enterCost method which accounts for box MBR and any pool funding shortfall.\n */\n async enterCost({ address, entryCount }: { address: string; entryCount: number }): Promise<bigint> {\n return await this.client.enterCost({\n args: { address, entryCount }\n });\n }\n\n /**\n * Enters the pool with specified entries.\n */\n async enter({ sender, signer, entries, gateTxn }: EnterPoolParams): Promise<void> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get the total cost from the contract (includes box MBR + any pool funding shortfall)\n const paymentAmount = await this.enterCost({\n address: sendParams.sender.toString(),\n entryCount: entries.length\n });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(paymentAmount),\n receiver: this.client.appAddress,\n });\n\n // Transform entries to the expected format\n const formattedEntries: [bigint | number, bigint | number, Uint8Array[]][] = entries.map(e => [\n e.asset,\n e.amount,\n e.proofs ?? []\n ]);\n\n const isGated = gateTxn !== undefined;\n\n if (isGated) {\n await this.client.send.gatedEnter({\n ...sendParams,\n extraFee: microAlgo(1000 * entries.length), // Cover inner transactions to Staking contract\n args: {\n payment,\n gateTxn,\n entries: formattedEntries,\n }\n });\n } else {\n await this.client.send.enter({\n ...sendParams,\n extraFee: microAlgo(1000 * entries.length), // Cover inner transactions to Staking contract\n args: {\n payment,\n entries: formattedEntries,\n }\n });\n }\n }\n\n /**\n * Starts the disbursement phase for a reward.\n */\n async startDisbursement({ sender, signer, rewardId }: StartDisbursementParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.startDisbursement({\n ...sendParams,\n args: { rewardId }\n });\n }\n\n /**\n * Runs a raffle for a raffle-type reward.\n */\n async raffle({ sender, signer, rewardId }: RaffleParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.raffle({\n ...sendParams,\n args: { rewardId }\n });\n }\n\n /**\n * Disburses rewards to participants.\n */\n async disburseRewards({ sender, signer, rewardId, iterationAmount }: DisburseRewardsParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.disburseRewards({\n ...sendParams,\n args: {\n rewardId,\n iterationAmount\n }\n });\n }\n\n /**\n * Finalizes the distribution for a reward.\n */\n async finalizeDistribution({ sender, signer, rewardId }: FinalizeDistributionParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.finalizeDistribution({\n ...sendParams,\n args: { rewardId }\n });\n }\n\n /**\n * Updates the Akita DAO escrow reference.\n */\n async updateAkitaDAOEscrow({ sender, signer, app }: MaybeSigner & PoolContractArgs['updateAkitaDAOEscrow(uint64)void']): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDaoEscrow({\n ...sendParams,\n args: { app }\n });\n }\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDAO({ sender, signer, akitaDao }: MaybeSigner & PoolContractArgs['updateAkitaDAO(uint64)void']): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao }\n });\n }\n}\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"StakingPool\",\"structs\":{\"ObjectC3416591\":[{\"name\":\"valid\",\"type\":\"bool\"},{\"name\":\"balance\",\"type\":\"uint64\"}],\"RootKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"name\",\"type\":\"string\"}],\"AddRewardParams\":[{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"distribution\",\"type\":\"uint8\"},{\"name\":\"rate\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"},{\"name\":\"interval\",\"type\":\"uint64\"},{\"name\":\"winnerCount\",\"type\":\"uint64\"}],\"EntryData\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"quantity\",\"type\":\"uint64\"},{\"name\":\"gateArgs\",\"type\":\"byte[][]\"},{\"name\":\"disqualified\",\"type\":\"bool\"}],\"EntryKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"}],\"RaffleCursor\":[{\"name\":\"ticket\",\"type\":\"uint64\"},{\"name\":\"stake\",\"type\":\"uint64\"},{\"name\":\"disbursed\",\"type\":\"uint64\"}],\"Reward\":[{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"distribution\",\"type\":\"uint8\"},{\"name\":\"rate\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"},{\"name\":\"interval\",\"type\":\"uint64\"},{\"name\":\"qualifiedStakers\",\"type\":\"uint64\"},{\"name\":\"qualifiedStake\",\"type\":\"uint64\"},{\"name\":\"winnerCount\",\"type\":\"uint64\"},{\"name\":\"winningTickets\",\"type\":\"uint64[]\"},{\"name\":\"raffleCursor\",\"type\":\"RaffleCursor\"},{\"name\":\"vrfFailureCount\",\"type\":\"uint64\"},{\"name\":\"phase\",\"type\":\"uint8\"},{\"name\":\"disbursementCursor\",\"type\":\"uint64\"},{\"name\":\"activeDisbursementId\",\"type\":\"uint64\"},{\"name\":\"activeDisbursementRoundStart\",\"type\":\"uint64\"},{\"name\":\"lastDisbursementTimestamp\",\"type\":\"uint64\"}],\"StakingPoolMBRData\":[{\"name\":\"entries\",\"type\":\"uint64\"},{\"name\":\"uniques\",\"type\":\"uint64\"},{\"name\":\"entriesByAddress\",\"type\":\"uint64\"},{\"name\":\"rewards\",\"type\":\"uint64\"},{\"name\":\"disbursements\",\"type\":\"uint64\"}],\"StakingPoolState\":[{\"name\":\"status\",\"type\":\"uint8\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"uint8\"},{\"name\":\"signupTimestamp\",\"type\":\"uint64\"},{\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"name\":\"allowLateSignups\",\"type\":\"bool\"},{\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"name\":\"maxEntries\",\"type\":\"uint64\"},{\"name\":\"entryCount\",\"type\":\"uint64\"},{\"name\":\"rewardCount\",\"type\":\"uint64\"},{\"name\":\"totalStaked\",\"type\":\"uint64\"},{\"name\":\"stakeKey\",\"type\":\"RootKey\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint64\"},{\"name\":\"gateId\",\"type\":\"uint64\"},{\"name\":\"creator\",\"type\":\"address\"}],\"FunderInfo\":[{\"name\":\"account\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"address\",\"name\":\"creator\"},{\"type\":\"(address,uint64)\",\"struct\":\"FunderInfo\",\"name\":\"funder\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"(address,string)\",\"struct\":\"RootKey\",\"name\":\"stakeKey\"},{\"type\":\"uint64\",\"name\":\"minimumStakeAmount\"},{\"type\":\"bool\",\"name\":\"allowLateSignups\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"uint64\",\"name\":\"maxEntries\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"init\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delete\",\"args\":[{\"type\":\"address\",\"name\":\"caller\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\",\"events\":[],\"recommendations\":{}},{\"name\":\"addReward\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"(uint64,uint8,uint64,uint64,uint64,uint64)\",\"struct\":\"AddRewardParams\",\"name\":\"reward\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"addRewardAsa\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"(uint64,uint8,uint64,uint64,uint64,uint64)\",\"struct\":\"AddRewardParams\",\"name\":\"reward\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"finalize\",\"args\":[{\"type\":\"uint64\",\"name\":\"signupTimestamp\"},{\"type\":\"uint64\",\"name\":\"startTimestamp\"},{\"type\":\"uint64\",\"name\":\"endTimestamp\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedEnter\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"(uint64,uint64,byte[32][])[]\",\"name\":\"entries\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"enter\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"(uint64,uint64,byte[32][])[]\",\"name\":\"entries\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"startDisbursement\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"raffle\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"disburseRewards\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"},{\"type\":\"uint64\",\"name\":\"iterationAmount\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"finalizeDistribution\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"check\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(bool,uint64)\",\"struct\":\"ObjectC3416591\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gateCheck\",\"args\":[{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"enterCost\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"The address that will be entering\"},{\"type\":\"uint64\",\"name\":\"entryCount\",\"desc\":\"The number of entries being added\"}],\"returns\":{\"type\":\"uint64\",\"desc\":\"The total payment amount needed (includes box MBR + any shortfall to meet min balance)\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"desc\":\"Calculates the total cost required to enter the pool\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"signUpsOpen\",\"args\":[],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean of whether sign ups are open\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"isLive\",\"args\":[],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean of whether the pool is live\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"isEntered\",\"args\":[{\"type\":\"address\",\"name\":\"address\"}],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean indicating if the address has entered the staking pool\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getState\",\"args\":[],\"returns\":{\"type\":\"(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)\",\"struct\":\"StakingPoolState\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"uint64\",\"name\":\"app\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[{\"type\":\"uint64\",\"name\":\"winningTickets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64,uint64)\",\"struct\":\"StakingPoolMBRData\",\"desc\":\"the mbr created for each boxmap entry\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":16,\"bytes\":9},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"status\":{\"keyType\":\"AVMString\",\"valueType\":\"uint8\",\"key\":\"c3RhdHVz\",\"desc\":\"the status the pool is in\"},\"title\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dGl0bGU=\",\"desc\":\"title of the staking pool\"},\"type\":{\"keyType\":\"AVMString\",\"valueType\":\"uint8\",\"key\":\"dHlwZQ==\",\"desc\":\"the method of staking to be used for the pool\"},\"signupTimestamp\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"c2lnbnVwX3RpbWVzdGFtcA==\",\"desc\":\"the timestamp when sign ups for the pool are allowed\"},\"allowLateSignups\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWxsb3dfbGF0ZV9zaWdudXBz\",\"desc\":\"whether signups are allowed after the staking pool begins\"},\"startTimestamp\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"c3RhcnRfdGltZXN0YW1w\",\"desc\":\"the timestamp when the pool starts\"},\"endTimestamp\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZW5kX3RpbWVzdGFtcA==\",\"desc\":\"the timestamp when the pool ends\"},\"maxEntries\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWF4X2VudHJpZXM=\",\"desc\":\"the maximum entries allowed for the pool\"},\"entryID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZW50cnlfY291bnQ=\",\"desc\":\"the number of entries in a pool\"},\"rewardID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cmV3YXJkX2NvdW50\",\"desc\":\"the number of rewards for the pool\"},\"totalStaked\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"dG90YWxfc3Rha2Vk\",\"desc\":\"the total amount staked in the pool\"},\"stakeKey\":{\"keyType\":\"AVMString\",\"valueType\":\"RootKey\",\"key\":\"c3Rha2Vfa2V5\",\"desc\":\"the name for the meta merkle asset group to validate staking\\nstake key can be empty if distribution !== DistributionTypePercentage\"},\"minimumStakeAmount\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWluaW11bV9zdGFrZV9hbW91bnQ=\",\"desc\":\"minimum stake amount\"},\"gateID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9pZA==\",\"desc\":\"the gate id of the pool\"},\"gateSize\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9zaXpl\",\"desc\":\"the size of the gate were using\"},\"creator\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"Y3JlYXRvcg==\",\"desc\":\"the address of the creator of the staking pool\"},\"marketplace\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"bWFya2V0cGxhY2U=\",\"desc\":\"marketplace is pool creation side marketplace\"},\"marketplaceRoyalties\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWFya2V0cGxhY2Vfcm95YWx0aWVz\",\"desc\":\"the amount the marketplaces will get for the sale\"},\"akitaRoyalty\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfcm95YWx0eQ==\",\"desc\":\"the akita royalty for the pool\"},\"akitaRoyaltyAmount\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfcm95YWx0eV9hbW91bnQ=\",\"desc\":\"the amount of royalties that were paid in a disbursement\"},\"salt\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"c2FsdA==\",\"desc\":\"salt for randomness\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow to use\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"},\"funder\":{\"keyType\":\"AVMString\",\"valueType\":\"FunderInfo\",\"key\":\"ZnVuZGVy\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"entries\":{\"keyType\":\"uint64\",\"valueType\":\"EntryData\",\"desc\":\"indexed entries for efficient iteration\",\"prefix\":\"ZQ==\"},\"uniques\":{\"keyType\":\"address\",\"valueType\":\"uint64\",\"desc\":\"the number of unique asset entries by address\",\"prefix\":\"dQ==\"},\"entriesByAddress\":{\"keyType\":\"EntryKey\",\"valueType\":\"uint64\",\"desc\":\"the entries in the pool\",\"prefix\":\"YQ==\"},\"rewards\":{\"keyType\":\"uint64\",\"valueType\":\"Reward\",\"desc\":\"the rewards for this staking pool\",\"prefix\":\"cg==\"},\"disbursements\":{\"keyType\":\"uint64\",\"valueType\":\"AVMBytes\",\"desc\":\"the disbursements this pool as created & finalized\",\"prefix\":\"ZA==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[4429,4531,6827],\"errorMessage\":\"Box must have value\"},{\"pc\":[779,1222,1340,1615,2376,2748,5226,5327,5770,5899,6464],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[2924],\"errorMessage\":\"DAO not opted in to the asset\"},{\"pc\":[4319],\"errorMessage\":\"Disbursement not ready for finalization\"},{\"pc\":[1635],\"errorMessage\":\"Escrow does not exist\"},{\"pc\":[1453,6046],\"errorMessage\":\"Forbidden\"},{\"pc\":[2111],\"errorMessage\":\"Gate check failed\"},{\"pc\":[4984],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[6384],\"errorMessage\":\"Invalid disbursement phase\"},{\"pc\":[1513,5587,6197],\"errorMessage\":\"Invalid payment\"},{\"pc\":[2859,2959,3147,3315],\"errorMessage\":\"Invalid percentage\"},{\"pc\":[3136],\"errorMessage\":\"Invalid percentage of args\"},{\"pc\":[5111],\"errorMessage\":\"Invalid pool type for check\"},{\"pc\":[1877],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[6162],\"errorMessage\":\"Max entries cannot be greater than rate\"},{\"pc\":[6061],\"errorMessage\":\"Must be an Algo asset\"},{\"pc\":[3336,3576,3841],\"errorMessage\":\"Not enough funds\"},{\"pc\":[2519],\"errorMessage\":\"Not ready to disburse\"},{\"pc\":[685],\"errorMessage\":\"OnCompletion must be DeleteApplication && can only call when not creating\"},{\"pc\":[475],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[673],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[4932,4973,5021],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[6130],\"errorMessage\":\"Rate must be greater than winner count\"},{\"pc\":[6169],\"errorMessage\":\"Rate must be greater than zero\"},{\"pc\":[6088],\"errorMessage\":\"Stake key required\"},{\"pc\":[6394],\"errorMessage\":\"Winning tickets already exist\"},{\"pc\":[1645],\"errorMessage\":\"Wrong escrow for this operation\"},{\"pc\":[3332,3562,3827,6015],\"errorMessage\":\"account funded\"},{\"pc\":[1464,1484,1708,1728,2305,2890,2914,2929,4622,4930,4969,5019,5391,5443,5460],\"errorMessage\":\"application exists\"},{\"pc\":[1376],\"errorMessage\":\"call must come from factory\"},{\"pc\":[1141,1175,1180,1286,1294,1306,1381,1388,1400,1451,1461,1476,1481,1540,1640,1725,1920,1927,1946,1981,2074,2092,2098,2155,2232,2259,2281,2568,2576,2629,2677,2700,2807,2854,2887,2910,2954,3044,3052,3062,3222,3302,3310,3345,3353,3474,3567,3585,3593,3721,3832,3850,3858,4323,4474,4488,4493,4512,4614,4619,4650,4662,4673,4682,4747,4752,4757,4762,4767,4772,4777,4782,4786,4793,4800,4805,4810,4815,4820,4923,4961,5012,5093,5103,5169,5180,5277,5288,5365,5526,5533,5542,5592,5677,5692,5783,5794,5837,5847,5865,5915,6044,6066,6143,6151,6202,6419,6871,6883,6894,6903],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[2254],\"errorMessage\":\"distribution window is not open\"},{\"pc\":[5778],\"errorMessage\":\"failed to verify stake requirements\"},{\"pc\":[2094],\"errorMessage\":\"gate id is not set\"},{\"pc\":[2157],\"errorMessage\":\"gate id is set\"},{\"pc\":[1986],\"errorMessage\":\"if the starting round is zero, the signup round must be zero and allowLateSignups must be true\"},{\"pc\":[5648],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[5231],\"errorMessage\":\"invalid number of bytes for (bool1,uint64)\"},{\"pc\":[1628],\"errorMessage\":\"invalid number of bytes for (len+(uint64,bool1)[])\"},{\"pc\":[789,6474],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[957,4952],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[5332,5904],\"errorMessage\":\"invalid number of bytes for (uint64,uint64,uint64)\"},{\"pc\":[1817,1854],\"errorMessage\":\"invalid number of bytes for (uint64,uint8,uint64,uint64,uint64,uint64)\"},{\"pc\":[986],\"errorMessage\":\"invalid number of bytes for (uint8[32],uint64)\"},{\"pc\":[1015,5775],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[1006,1025,1034,1043,1052,1227,1345,1442,1891,1901,1911,2174,2381,2446,2467,2477,2753,4289,4420,4468,4576,4609,4916,5005,5034],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[968],\"errorMessage\":\"invalid number of bytes for uint8\"},{\"pc\":[977,995,1370,4412,4460,4568,4724],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[3165,3421,3668,4008,6768],\"errorMessage\":\"max array length exceeded\"},{\"pc\":[1383],\"errorMessage\":\"only the creator can delete the pool\"},{\"pc\":[1922],\"errorMessage\":\"only the creator can finalize the pool\"},{\"pc\":[1281],\"errorMessage\":\"only the factory can init the pool\"},{\"pc\":[5547],\"errorMessage\":\"pool has reached maximum entries\"},{\"pc\":[5679],\"errorMessage\":\"quantity is less than minimum stake amount\"},{\"pc\":[2190,2490,4300,6350],\"errorMessage\":\"reward does not exist\"},{\"pc\":[2224],\"errorMessage\":\"reward is already in a disbursement phase\"},{\"pc\":[2007],\"errorMessage\":\"the ending round must be zero or after the starting round + 10\"},{\"pc\":[2179,5522],\"errorMessage\":\"the pool is not live\"},{\"pc\":[1406],\"errorMessage\":\"the pool must be in draft or ended\"},{\"pc\":[1930],\"errorMessage\":\"the pool must be in draft state to finalize\"},{\"pc\":[1951],\"errorMessage\":\"the signup round must be zero and late sign ups allowed or in the future\"},{\"pc\":[1966],\"errorMessage\":\"the starting round must be zero or in the future\"},{\"pc\":[2067,4450],\"errorMessage\":\"transaction type is appl\"},{\"pc\":[1845],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[1434,1808,1834,2056,2147],\"errorMessage\":\"transaction type is pay\"},{\"pc\":[3758],\"errorMessage\":\"unknown reward rate type\"},{\"pc\":[5911],\"errorMessage\":\"user does not have enough staked\"},{\"pc\":[5832],\"errorMessage\":\"user does not have min balance\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggOTIgMTAwMDAwIDYzNjQxMzYyMjM4NDY3OTMwMDUgNDAwIDE0NDI2OTUwNDA4ODg5NjM0MDcgMTQ0MjY5NTA0MDg4ODk2MzQwOSA0Mjk0OTY3Mjk1IDUwNjAwIDE4OTAwIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJlbnRyeV9jb3VudCIgMHgxNTFmN2M3NSAweDAwICJ0eXBlIiAweDAwMDAgImFhbCIgImFraXRhX2VzY3JvdyIgMHgwYSAiZSIgInN0YXR1cyIgImNyZWF0b3IiICJnYXRlX2lkIiAweDE0IDB4MWUgImFsbG93X2xhdGVfc2lnbnVwcyIgInN0YXJ0X3RpbWVzdGFtcCIgImVuZF90aW1lc3RhbXAiICJtYXhfZW50cmllcyIgMHg4MCAid2FsbGV0IiAiciIgImFraXRhX3JveWFsdHlfYW1vdW50IiAidSIgInNpZ251cF90aW1lc3RhbXAiICJyZXdhcmRfY291bnQiICJzdGFrZV9rZXkiICJha2l0YV9yb3lhbHR5IiAidGl0bGUiICJtaW5pbXVtX3N0YWtlX2Ftb3VudCIgImEiICJ0b3RhbF9zdGFrZWQiIDB4NzFiOTU3YWYgIm9hbCIgInNhbHQiICJzYWwiICJwYWwiICJjb250cm9sbGVkX2FkZHJlc3MiIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMDAwIDB4YzkwNjg4MDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjAKICAgIC8vIHNpZ251cFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U2lnbnVwVGltZXN0YW1wIH0pCiAgICBieXRlYyAyNCAvLyAic2lnbnVwX3RpbWVzdGFtcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhcnRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE2IC8vICJzdGFydF90aW1lc3RhbXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuZFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW5kVGltZXN0YW1wIH0pCiAgICBieXRlYyAxNyAvLyAiZW5kX3RpbWVzdGFtcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJld2FyZElEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlSZXdhcmRDb3VudCB9KQogICAgYnl0ZWMgMjUgLy8gInJld2FyZF9jb3VudCIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzNAogICAgLy8gdG90YWxTdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVRvdGFsU3Rha2VkIH0pCiAgICBieXRlYyAzMSAvLyAidG90YWxfc3Rha2VkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDUtMTA5CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBjbGFzc2VzKAogICAgLy8gICBCYXNlU3Rha2luZ1Bvb2wsCiAgICAvLyAgIEFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0LAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHB1c2hieXRlc3MgMHhhYjhiMjEzYSAweGVhOTE4MGRkIC8vIG1ldGhvZCAiZGVsZXRlKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAidXBkYXRlKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVANCBtYWluX3VwZGF0ZV9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDUtMTA5CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBjbGFzc2VzKAogICAgLy8gICBCYXNlU3Rha2luZ1Bvb2wsCiAgICAvLyAgIEFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0LAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMgogICAgcHVzaGJ5dGVzcyAweDgzZjE0NzQ4IDB4Mzk0ZWFlYjIgLy8gbWV0aG9kICJpbml0KCl2b2lkIiwgbWV0aG9kICJvcHRJbihwYXksdWludDY0KXZvaWQiCiAgICBieXRlYyAzMiAvLyBtZXRob2QgImFkZFJld2FyZChwYXksKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4YTAwY2NlYzYgMHgxODFlODI5MSAweGZkY2ZkZmY2IDB4YjgyZWQxYjMgMHhhOTQxOGQzNyAweGZjNjk5Y2IzIDB4NmU3NmIyY2EgMHhjZGIwYWM2YSAweGIyMjNkMzVkIDB4YmM1OGFkMDkgMHg4ZTA4MjQ4NCAweDMzZjc4ODA4IDB4NTkyZWUzNDEgMHg4ZmE0YTE2MCAweGUzMzc3MzQyIDB4NzE3MDQ2NDkgMHgxZWFkMjBhOSAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgMHhhNGIzZTc4OSAvLyBtZXRob2QgImFkZFJld2FyZEFzYShwYXksYXhmZXIsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgImZpbmFsaXplKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImdhdGVkRW50ZXIocGF5LGFwcGwsKHVpbnQ2NCx1aW50NjQsYnl0ZVszMl1bXSlbXSl2b2lkIiwgbWV0aG9kICJlbnRlcihwYXksKHVpbnQ2NCx1aW50NjQsYnl0ZVszMl1bXSlbXSl2b2lkIiwgbWV0aG9kICJzdGFydERpc2J1cnNlbWVudCh1aW50NjQpdm9pZCIsIG1ldGhvZCAicmFmZmxlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJkaXNidXJzZVJld2FyZHModWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZURpc3RyaWJ1dGlvbih1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2hlY2soYWRkcmVzcyx1aW50NjQpKGJvb2wsdWludDY0KSIsIG1ldGhvZCAiZ2F0ZUNoZWNrKGFwcGwsYWRkcmVzcyx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZW50ZXJDb3N0KGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNpZ25VcHNPcGVuKClib29sIiwgbWV0aG9kICJpc0xpdmUoKWJvb2wiLCBtZXRob2QgImlzRW50ZXJlZChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldFN0YXRlKCkodWludDgsc3RyaW5nLHVpbnQ4LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LChhZGRyZXNzLHN0cmluZyksdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU9Fc2Nyb3codWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJtYnIodWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGluaXQgb3B0SW4gYWRkUmV3YXJkIGFkZFJld2FyZEFzYSBmaW5hbGl6ZSBnYXRlZEVudGVyIGVudGVyIHN0YXJ0RGlzYnVyc2VtZW50IHJhZmZsZSBkaXNidXJzZVJld2FyZHMgZmluYWxpemVEaXN0cmlidXRpb24gY2hlY2sgc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ10gZW50ZXJDb3N0IG9wdEluQ29zdCBzaWduVXBzT3BlbiBpc0xpdmUgaXNFbnRlcmVkIGdldFN0YXRlIHVwZGF0ZUFraXRhREFPRXNjcm93IHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAyOSBtYnIKICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA1LTEwOQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgY2xhc3NlcygKICAgIC8vICAgQmFzZVN0YWtpbmdQb29sLAogICAgLy8gICBBa2l0YUJhc2VGZWVHZW5lcmF0b3JDb250cmFjdCwKICAgIC8vICAgQ2hpbGRDb250cmFjdAogICAgLy8gKSB7CiAgICBwdXNoYnl0ZXMgMHhhMmYzYzU0NCAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDgsYWRkcmVzcywoYWRkcmVzcyx1aW50NjQpLGFkZHJlc3MsKGFkZHJlc3Msc3RyaW5nKSx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCm1haW5fZGVsZXRlX3JvdXRlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIGRlbGV0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6Ol9fcGNnMzJPdXRwdXQoc3RhdGU6IHVpbnQ2NCkgLT4gdWludDY0OgpfX3BjZzMyT3V0cHV0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoyMwogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIF9fcGNnMzJPdXRwdXQoc3RhdGU6IFBDRzMyU1RBVEUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjI0CiAgICAvLyBjb25zdCB4b3JzaGlmdGVkID0gX19tYXNrVG9VaW50MzIob3Auc2hyKG9wLnNocihzdGF0ZSwgMTgpIF4gc3RhdGUsIDI3KSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgc2hyCiAgICBmcmFtZV9kaWcgLTEKICAgIF4KICAgIHB1c2hpbnQgMjcgLy8gMjcKICAgIHNocgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxMwogICAgLy8gcmV0dXJuIHZhbHVlICYgKG9wLnNobCgxLCAzMikgLSAxKQogICAgaW50YyA5IC8vIDQyOTQ5NjcyOTUKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6MjUKICAgIC8vIGNvbnN0IHJvdCA9IG9wLnNocihzdGF0ZSwgNTkpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNTkgLy8gNTkKICAgIHNocgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoyNgogICAgLy8gcmV0dXJuIG9wLnNocih4b3JzaGlmdGVkLCByb3QpIHwgX19tYXNrVG9VaW50MzIob3Auc2hsKHhvcnNoaWZ0ZWQsIF9fdWludDY0VHdvcyhyb3QpICYgMzEpKQogICAgZHVwMgogICAgc2hyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjgKICAgIC8vIGNvbnN0IFssIGFkZExvd10gPSBvcC5hZGR3KH52YWx1ZSwgMSkKICAgIHN3YXAKICAgIH4KICAgIGludGNfMSAvLyAxCiAgICBhZGR3CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6MjYKICAgIC8vIHJldHVybiBvcC5zaHIoeG9yc2hpZnRlZCwgcm90KSB8IF9fbWFza1RvVWludDMyKG9wLnNobCh4b3JzaGlmdGVkLCBfX3VpbnQ2NFR3b3Mocm90KSAmIDMxKSkKICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgICYKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgc2hsCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjEzCiAgICAvLyByZXR1cm4gdmFsdWUgJiAob3Auc2hsKDEsIDMyKSAtIDEpCiAgICBpbnRjIDkgLy8gNDI5NDk2NzI5NQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoyNgogICAgLy8gcmV0dXJuIG9wLnNocih4b3JzaGlmdGVkLCByb3QpIHwgX19tYXNrVG9VaW50MzIob3Auc2hsKHhvcnNoaWZ0ZWQsIF9fdWludDY0VHdvcyhyb3QpICYgMzEpKQogICAgfAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiB1aW50NjQsIGFkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFdhbGxldElEVXNpbmdBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYWRkcmVzczogQWNjb3VudCk6IEFwcGxpY2F0aW9uIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OQogICAgLy8gY29uc3QgW290aGVyQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c090aGVyQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjIDMzIC8vICJvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjY0CiAgICAvLyByZXR1cm4gZ2V0T3RoZXJBcHBMaXN0KGFraXRhREFPKS5lc2Nyb3cKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4Ni0xODkKICAgIC8vIGNvbnN0IGRhdGEgPSBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5nZXQ+KHsKICAgIC8vICAgYXBwSWQ6IGVzY3Jvd0ZhY3RvcnksCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDNjMWE2ZjMzIC8vIG1ldGhvZCAiZ2V0KGFkZHJlc3MpYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgNiAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkxCiAgICAvLyBpZiAoQnl0ZXMoZGF0YSkubGVuZ3RoID09PSAwIHx8IEJ5dGVzKGRhdGEpLmxlbmd0aCAhPT0gOCkgewogICAgbGVuCiAgICBkdXAKICAgIGJ6IGdldFdhbGxldElEVXNpbmdBa2l0YURBT19pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgIT0KICAgIGJ6IGdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pZl9lbHNlQDcKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19pZl9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTUKICAgIC8vIHJldHVybiBidG9pKGRhdGEpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdhdGVDaGVjayhnYXRlVHhuOiB1aW50NjQsIGFraXRhREFPOiB1aW50NjQsIGNhbGxlcjogYnl0ZXMsIGlkOiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2F0ZUNoZWNrOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnYXRlQ2hlY2soZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sIGFraXRhREFPOiBBcHBsaWNhdGlvbiwgY2FsbGVyOiBBY2NvdW50LCBpZDogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMwogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM0CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzNAogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYm56IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM1CiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzUKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDQzOTIyNjU1IC8vIG1ldGhvZCAibXVzdENoZWNrKGFkZHJlc3MsdWludDY0LGJ5dGVbXVtdKXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM2CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzcKICAgIC8vIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzEgLy8gMQogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNwogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzgKICAgIC8vIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIGZyYW1lX2RpZyAtNAogICAgcHVzaGludCAyIC8vIDIKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzgKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMi0yMzkKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vICAgZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gICBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICAvLyApCiAgICByZXRzdWIKCmdhdGVDaGVja19ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzItMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyAgIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vICAgZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKc3BsaXRPcHRJbkNvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBzcGxpdE9wdEluQ291bnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBlc2Nyb3c6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIyCiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyNAogICAgLy8gaWYgKCFlc2Nyb3cuaXNPcHRlZEluKGFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDMKICAgIC8vIGNvbnN0IFtzcGxpdHNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNSZXZlbnVlU3BsaXRzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJyZXZlbnVlX3NwbGl0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI4CiAgICAvLyBjb3VudCArPSBzcGxpdHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzU4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA0MCAvLyA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ4WzMyXSx1aW50NjQpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3RhdHVzPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhdHVzIH0pCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc3MwogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgPSBQb29sU3RhdHVzRHJhZnQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIHRpdGxlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VGl0bGUgfSkKICAgIGJ5dGVjIDI4IC8vICJ0aXRsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NzQKICAgIC8vIHRoaXMudGl0bGUudmFsdWUgPSB0aXRsZQogICAgdW5jb3ZlciAxMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9IHR5cGUKICAgIHVuY292ZXIgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUNyZWF0b3IgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc3NgogICAgLy8gdGhpcy5jcmVhdG9yLnZhbHVlID0gY3JlYXRvcgogICAgdW5jb3ZlciAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9jaGlsZC50czoxMQogICAgLy8gZnVuZGVyID0gR2xvYmFsU3RhdGU8RnVuZGVySW5mbz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5RnVuZGVyIH0pCiAgICBwdXNoYnl0ZXMgImZ1bmRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIHRoaXMuZnVuZGVyLnZhbHVlID0gY2xvbmUoZnVuZGVyKQogICAgdW5jb3ZlciA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIHB1c2hieXRlcyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzc4CiAgICAvLyB0aGlzLm1hcmtldHBsYWNlLnZhbHVlID0gbWFya2V0cGxhY2UKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIHN0YWtlS2V5ID0gR2xvYmFsU3RhdGU8Um9vdEtleT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YWtlS2V5IH0pCiAgICBieXRlYyAyNiAvLyAic3Rha2Vfa2V5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gdGhpcy5zdGFrZUtleS52YWx1ZSA9IGNsb25lKHN0YWtlS2V5KQogICAgdW5jb3ZlciA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbWluaW11bVN0YWtlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWluaW11bVN0YWtlQW1vdW50IH0pCiAgICBieXRlYyAyOSAvLyAibWluaW11bV9zdGFrZV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzgxCiAgICAvLyB0aGlzLm1pbmltdW1TdGFrZUFtb3VudC52YWx1ZSA9IG1pbmltdW1TdGFrZUFtb3VudAogICAgdW5jb3ZlciA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4MgogICAgLy8gdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlID0gYWxsb3dMYXRlU2lnbnVwcwogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMiAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3ODMKICAgIC8vIHRoaXMuZ2F0ZUlELnZhbHVlID0gZ2F0ZUlECiAgICB1bmNvdmVyIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBtYXhFbnRyaWVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWF4RW50cmllcyB9KQogICAgYnl0ZWMgMTggLy8gIm1heF9lbnRyaWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4NAogICAgLy8gdGhpcy5tYXhFbnRyaWVzLnZhbHVlID0gbWF4RW50cmllcwogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NwogICAgLy8gc2FsdCA9IEdsb2JhbFN0YXRlPGJ5dGVzPDMyPj4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVNhbHQgfSkKICAgIGJ5dGVjIDM0IC8vICJzYWx0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4NgogICAgLy8gdGhpcy5zYWx0LnZhbHVlID0gVHhuLnR4SWQKICAgIHR4biBUeElECiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzg3CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFraXRhREFPRXNjcm93CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gY29uc3QgZmVlcyA9IGdldFN0YWtpbmdGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzkwCiAgICAvLyBjb25zdCBmZWVzID0gZ2V0U3Rha2luZ0ZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjc4CiAgICAvLyBjb25zdCBbc3Rha2luZ0ZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNTdGFraW5nRmVlcykpCiAgICBkdXAKICAgIHB1c2hieXRlcyAic3Rha2luZ19mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0OQogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YVNvY2lhbEFwcExpc3QpKQogICAgYnl0ZWMgMzUgLy8gInNhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTIKICAgIC8vIGNvbnN0IHsgaW1wYWN0OiBpbXBhY3RBcHAgfSA9IGdldEFraXRhU29jaWFsQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKTsKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzk0CiAgICAvLyBsZXQgaW1wYWN0OiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTUKICAgIC8vIGlmIChpbXBhY3RBcHAgIT09IDApIHsKICAgIGJ6IGNyZWF0ZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTYKICAgIC8vIGltcGFjdCA9IGdldFVzZXJJbXBhY3QodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5jcmVhdG9yLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gaW1wYWN0ID0gZ2V0VXNlckltcGFjdCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmNyZWF0b3IudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5Q3JlYXRvciB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzk2CiAgICAvLyBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuY3JlYXRvci52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNi0xMzkKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBBa2l0YVNvY2lhbEltcGFjdC5wcm90b3R5cGUuZ2V0VXNlckltcGFjdD4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICAvLyAgIGFyZ3M6IFthY2NvdW50XQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDkKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFTb2NpYWxBcHBMaXN0KSkKICAgIHN3YXAKICAgIGJ5dGVjIDM1IC8vICJzYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNwogICAgLy8gYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM2LTEzOQogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIEFraXRhU29jaWFsSW1wYWN0LnByb3RvdHlwZS5nZXRVc2VySW1wYWN0Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YVNvY2lhbEFwcExpc3QoYWtpdGFEQU8pLmltcGFjdCwKICAgIC8vICAgYXJnczogW2FjY291bnRdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4ZDU3NGJiMTAgLy8gbWV0aG9kICJnZXRVc2VySW1wYWN0KGFkZHJlc3MpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGJ1cnkgMQoKY3JlYXRlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTgKICAgIC8vIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlID0gaW1wYWN0UmFuZ2UoaW1wYWN0LCBmZWVzLmltcGFjdFRheE1pbiwgZmVlcy5pbXBhY3RUYXhNYXgpCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzEKICAgIC8vIGNvbnN0IG1pbkltcGFjdDogdWludDY0ID0gKGltcGFjdCA+IDEpID8gaW1wYWN0IC0gMSA6IDEKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGNyZWF0ZV90ZXJuYXJ5X2ZhbHNlQDYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KCmNyZWF0ZV90ZXJuYXJ5X21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMgogICAgLy8gcmV0dXJuIG1heCAtICgoKG1heCAtIG1pbikgKiBtaW5JbXBhY3QpIC8gSU1QQUNUX0RJVklTT1IpCiAgICBkaWcgNAogICAgZHVwCiAgICBkaWcgNQogICAgLQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgLwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gYWtpdGFSb3lhbHR5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5IH0pCiAgICBieXRlYyAyNyAvLyAiYWtpdGFfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTgKICAgIC8vIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlID0gaW1wYWN0UmFuZ2UoaW1wYWN0LCBmZWVzLmltcGFjdFRheE1pbiwgZmVlcy5pbXBhY3RUYXhNYXgpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc1OAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV90ZXJuYXJ5X2ZhbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMQogICAgLy8gY29uc3QgbWluSW1wYWN0OiB1aW50NjQgPSAoaW1wYWN0ID4gMSkgPyBpbXBhY3QgLSAxIDogMQogICAgaW50Y18xIC8vIDEKICAgIGIgY3JlYXRlX3Rlcm5hcnlfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODAyCiAgICAvLyBhc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uQWRkcmVzcyA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCAnb25seSB0aGUgZmFjdG9yeSBjYW4gaW5pdCB0aGUgcG9vbCcpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgZmFjdG9yeSBjYW4gaW5pdCB0aGUgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgwNAogICAgLy8gaWYgKHRoaXMuZ2F0ZUlELnZhbHVlID4gMCkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA0CiAgICAvLyBpZiAodGhpcy5nYXRlSUQudmFsdWUgPiAwKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogaW5pdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDUtODA4CiAgICAvLyB0aGlzLmdhdGVTaXplLnZhbHVlID0gYWJpQ2FsbDx0eXBlb2YgR2F0ZS5wcm90b3R5cGUuc2l6ZT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmdhdGVJRC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgwNgogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgwNgogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA3CiAgICAvLyBhcmdzOiBbdGhpcy5nYXRlSUQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA3CiAgICAvLyBhcmdzOiBbdGhpcy5nYXRlSUQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDUtODA4CiAgICAvLyB0aGlzLmdhdGVTaXplLnZhbHVlID0gYWJpQ2FsbDx0eXBlb2YgR2F0ZS5wcm90b3R5cGUuc2l6ZT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmdhdGVJRC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4ZGY1NmIwMWUgLy8gbWV0aG9kICJzaXplKHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gZ2F0ZVNpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlHYXRlU2l6ZSB9KQogICAgcHVzaGJ5dGVzICJnYXRlX3NpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA1LTgwOAogICAgLy8gdGhpcy5nYXRlU2l6ZS52YWx1ZSA9IGFiaUNhbGw8dHlwZW9mIEdhdGUucHJvdG90eXBlLnNpemU+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlLAogICAgLy8gICBhcmdzOiBbdGhpcy5nYXRlSUQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgppbml0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDEKICAgIC8vIGluaXQoKSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODE0CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCAnY2FsbCBtdXN0IGNvbWUgZnJvbSBmYWN0b3J5JykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjYWxsIG11c3QgY29tZSBmcm9tIGZhY3RvcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGFzc2VydChjYWxsZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGRlbGV0ZSB0aGUgcG9vbCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlDcmVhdG9yIH0pCiAgICBieXRlYyAxMSAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGFzc2VydChjYWxsZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGRlbGV0ZSB0aGUgcG9vbCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIGNhbiBkZWxldGUgdGhlIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gUG9vbFN0YXR1c0RyYWZ0IHx8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSwgJ3RoZSBwb29sIG11c3QgYmUgaW4gZHJhZnQgb3IgZW5kZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3RhdHVzPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhdHVzIH0pCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgxNgogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBQb29sU3RhdHVzRHJhZnQgfHwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLCAndGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBvciBlbmRlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAweDAwCiAgICA9PQogICAgYm56IGRlbGV0ZV9ib29sX3RydWVAMwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuZFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW5kVGltZXN0YW1wIH0pCiAgICBieXRlYyAxNyAvLyAiZW5kX3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gUG9vbFN0YXR1c0RyYWZ0IHx8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSwgJ3RoZSBwb29sIG11c3QgYmUgaW4gZHJhZnQgb3IgZW5kZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGRlbGV0ZV9ib29sX2ZhbHNlQDQKCmRlbGV0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpkZWxldGVfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgxNgogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBQb29sU3RhdHVzRHJhZnQgfHwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLCAndGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBvciBlbmRlZCcpCiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBvciBlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgyMC04MjIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODIxCiAgICAvLyAucGF5bWVudCh7IGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MjAtODIxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODIwLTgyMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpkZWxldGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZGVsZXRlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzIKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsIEVSUl9GT1JCSURERU4pCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlDcmVhdG9yIH0pCiAgICBieXRlYyAxMSAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsIEVSUl9GT1JCSURERU4pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBGb3JiaWRkZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzUKICAgIC8vIGxldCBvcHRpbk1CUjogdWludDY0ID0gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzgKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDcgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzgKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBzd2FwCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IG9wdEluX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzkKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMwogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDAKICAgIC8vIG9wdGluTUJSICs9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGNvdW50CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICoKICAgICsKCm9wdEluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDUtODUyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IG9wdGluTUJSICsgcmV3YXJkc01CUiwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDgKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODQ1LTg1MgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBvcHRpbk1CUiArIHJld2FyZHNNQlIsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIGFtb3VudDogb3B0aW5NQlIgKyByZXdhcmRzTUJSLAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODQzCiAgICAvLyBjb25zdCByZXdhcmRzTUJSOiB1aW50NjQgPSB0aGlzLnJld2FyZHNNYnIoV2lubmVyQ291bnRDYXApICogMgogICAgcHVzaGludCA4MDAwIC8vIDgwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIGFtb3VudDogb3B0aW5NQlIgKyByZXdhcmRzTUJSLAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg0NS04NTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogb3B0aW5NQlIgKyByZXdhcmRzTUJSLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NTQtODYwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NTQtODU5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg1NC04NjAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAzNiAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODMKICAgIC8vIGNvbnN0IHsgcmV2ZW51ZU1hbmFnZXIgfSA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgZGlnIDIKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3MC03MwogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NzIKICAgIC8vIGFyZ3M6IFtbbmFtZV1dLAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIwMDA4NzI2NTc2NWY3MDZmNmY2YwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NzAtNzMKICAgIC8vIGNvbnN0IGVzY3JvdyA9IGFiaUNhbGw8dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9nZXRFc2Nyb3dzPih7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbW25hbWVdXSwKICAgIC8vIH0pLnJldHVyblZhbHVlWzBdCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCA5IC8vIDkKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rKHVpbnQ2NCxib29sMSlbXSkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjc1CiAgICAvLyBhc3NlcnQoZXNjcm93LmlkICE9PSAwLCBFUlJfRVNDUk9XX0RPRVNfTk9UX0VYSVNUKQogICAgZXh0cmFjdCA2IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBhc3NlcnQgLy8gRXNjcm93IGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NgogICAgLy8gYXNzZXJ0KGlkID09PSB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmlkLCBFUlJfV1JPTkdfRVNDUk9XX0ZPUl9PUEVSQVRJT04pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlYyA3IC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NgogICAgLy8gYXNzZXJ0KGlkID09PSB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmlkLCBFUlJfV1JPTkdfRVNDUk9XX0ZPUl9PUEVSQVRJT04pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgZXNjcm93IGZvciB0aGlzIG9wZXJhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODgtOTcKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfcmVrZXlUb1BsdWdpbj4oewogICAgLy8gICBhcHBJZDogd2FsbGV0LAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIC8vICAgICBbXQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDU4MmZmMzgyIC8vIG1ldGhvZCAiYXJjNThfcmVrZXlUb1BsdWdpbih1aW50NjQsYm9vbCxzdHJpbmcsdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5MgogICAgLy8gdHJ1ZSwKICAgIGJ5dGVjIDE5IC8vIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5MwogICAgLy8gbmFtZSwKICAgIHB1c2hieXRlcyAweDAwMDg3MjY1NzY1ZjcwNmY2ZjZjCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OTQKICAgIC8vIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OTUKICAgIC8vIFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg4LTk3CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMDEKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk5LTEwMwogICAgLy8gY29uc3Qgb3B0SW5Db3VudCA9IHNwbGl0T3B0SW5Db3VudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhc3NldAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgNAogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNQogICAgLy8gY29uc3QgbWJyQW1vdW50OiB1aW50NjQgPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBvcHRJbkNvdW50CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMTMtMTE2CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG1ickFtb3VudAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEwCiAgICAvLyB3YWxsZXQsCiAgICBkaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEyCiAgICAvLyBbYXNzZXQuaWRdLAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjkyCiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7IGFwcElkOiB3YWxsZXQgfSkKICAgIGl0eG5fbmV4dAogICAgcHVzaGJ5dGVzIDB4NmNjM2Y2MDYgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzMgogICAgLy8gaXR4bkNvbXBvc2Uuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODMyCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkUmV3YXJkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg2OQogICAgLy8gYWRkUmV3YXJkKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgcmV3YXJkOiBBZGRSZXdhcmRQYXJhbXMpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yICh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZAogICAgcG9wCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRBc2Fbcm91dGluZ10oKSAtPiB2b2lkOgphZGRSZXdhcmRBc2E6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTA4CiAgICAvLyBhZGRSZXdhcmRBc2EocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwgcmV3YXJkOiBBZGRSZXdhcmRQYXJhbXMpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yICh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkwOS05MTkKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KHJld2FyZC5hc3NldCksCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHsKICAgIC8vICAgICAgIGdyZWF0ZXJUaGFuOiAwCiAgICAvLyAgICAgfQogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MTIKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MDktOTE5CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChyZXdhcmQuYXNzZXQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7CiAgICAvLyAgICAgICBncmVhdGVyVGhhbjogMAogICAgLy8gICAgIH0KICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgID09CiAgICBkaWcgMgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTEzCiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHJld2FyZC5hc3NldCksCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTA5LTkxOQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIGFzc2V0WGZlciwKICAgIC8vICAgewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogQXNzZXQocmV3YXJkLmFzc2V0KSwKICAgIC8vICAgICBhc3NldEFtb3VudDogewogICAgLy8gICAgICAgZ3JlYXRlclRoYW46IDAKICAgIC8vICAgICB9CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gdGhpcy5hZGRSZXdhcmQocGF5bWVudCwgcmV3YXJkKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTA4CiAgICAvLyBhZGRSZXdhcmRBc2EocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwgcmV3YXJkOiBBZGRSZXdhcmRQYXJhbXMpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmZpbmFsaXplW3JvdXRpbmddKCkgLT4gdm9pZDoKZmluYWxpemU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTI0CiAgICAvLyBmaW5hbGl6ZShzaWdudXBUaW1lc3RhbXA6IHVpbnQ2NCwgc3RhcnRUaW1lc3RhbXA6IHVpbnQ2NCwgZW5kVGltZXN0YW1wOiB1aW50NjQpIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGZpbmFsaXplIHRoZSBwb29sJykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUNyZWF0b3IgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGZpbmFsaXplIHRoZSBwb29sJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNyZWF0b3IgY2FuIGZpbmFsaXplIHRoZSBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTI2CiAgICAvLyBhc3NlcnQodGhpcy5zdGF0dXMudmFsdWUgPT09IFBvb2xTdGF0dXNEcmFmdCwgJ3RoZSBwb29sIG11c3QgYmUgaW4gZHJhZnQgc3RhdGUgdG8gZmluYWxpemUnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3RhdHVzPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhdHVzIH0pCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNgogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBQb29sU3RhdHVzRHJhZnQsICd0aGUgcG9vbCBtdXN0IGJlIGluIGRyYWZ0IHN0YXRlIHRvIGZpbmFsaXplJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vIDB4MDAKICAgID09CiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBzdGF0ZSB0byBmaW5hbGl6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyOAogICAgLy8gc2lnbnVwVGltZXN0YW1wID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCB8fCAoc2lnbnVwVGltZXN0YW1wID09PSAwICYmIHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZmluYWxpemVfYm9vbF90cnVlQDQKICAgIGRpZyAyCiAgICBibnogZmluYWxpemVfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyOAogICAgLy8gc2lnbnVwVGltZXN0YW1wID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCB8fCAoc2lnbnVwVGltZXN0YW1wID09PSAwICYmIHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZmluYWxpemVfYm9vbF9mYWxzZUA1CgpmaW5hbGl6ZV9ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgpmaW5hbGl6ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTI3LTkzMAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBzaWdudXBUaW1lc3RhbXAgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIHx8IChzaWdudXBUaW1lc3RhbXAgPT09IDAgJiYgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKSwKICAgIC8vICAgJ3RoZSBzaWdudXAgcm91bmQgbXVzdCBiZSB6ZXJvIGFuZCBsYXRlIHNpZ24gdXBzIGFsbG93ZWQgb3IgaW4gdGhlIGZ1dHVyZScKICAgIC8vICkKICAgIGFzc2VydCAvLyB0aGUgc2lnbnVwIHJvdW5kIG11c3QgYmUgemVybyBhbmQgbGF0ZSBzaWduIHVwcyBhbGxvd2VkIG9yIGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MzMtOTM0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA9PT0gMCB8fAogICAgLy8gc3RhcnRUaW1lc3RhbXAgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgZGlnIDEKICAgIGJ6IGZpbmFsaXplX2Jvb2xfdHJ1ZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTM0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkzMy05MzQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID09PSAwIHx8CiAgICAvLyBzdGFydFRpbWVzdGFtcCA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBieiBmaW5hbGl6ZV9ib29sX2ZhbHNlQDkKCmZpbmFsaXplX2Jvb2xfdHJ1ZUA4OgogICAgaW50Y18xIC8vIDEKCmZpbmFsaXplX2Jvb2xfbWVyZ2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTMyLTkzNgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBzdGFydFRpbWVzdGFtcCA9PT0gMCB8fAogICAgLy8gICBzdGFydFRpbWVzdGFtcCA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgICd0aGUgc3RhcnRpbmcgcm91bmQgbXVzdCBiZSB6ZXJvIG9yIGluIHRoZSBmdXR1cmUnCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdGhlIHN0YXJ0aW5nIHJvdW5kIG11c3QgYmUgemVybyBvciBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTM4CiAgICAvLyBpZiAoc3RhcnRUaW1lc3RhbXAgPT09IDApIHsKICAgIGRpZyAxCiAgICBibnogZmluYWxpemVfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkzOQogICAgLy8gYXNzZXJ0KHNpZ251cFRpbWVzdGFtcCA9PT0gMCAmJiB0aGlzLmFsbG93TGF0ZVNpZ251cHMudmFsdWUsICdpZiB0aGUgc3RhcnRpbmcgcm91bmQgaXMgemVybywgdGhlIHNpZ251cCByb3VuZCBtdXN0IGJlIHplcm8gYW5kIGFsbG93TGF0ZVNpZ251cHMgbXVzdCBiZSB0cnVlJykKICAgIGRpZyAyCiAgICBibnogZmluYWxpemVfYm9vbF9mYWxzZUAxNAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGFsbG93TGF0ZVNpZ251cHMgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWxsb3dMYXRlU2lnbnVwcyB9KQogICAgYnl0ZWMgMTUgLy8gImFsbG93X2xhdGVfc2lnbnVwcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MzkKICAgIC8vIGFzc2VydChzaWdudXBUaW1lc3RhbXAgPT09IDAgJiYgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlLCAnaWYgdGhlIHN0YXJ0aW5nIHJvdW5kIGlzIHplcm8sIHRoZSBzaWdudXAgcm91bmQgbXVzdCBiZSB6ZXJvIGFuZCBhbGxvd0xhdGVTaWdudXBzIG11c3QgYmUgdHJ1ZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZmluYWxpemVfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmZpbmFsaXplX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTM5CiAgICAvLyBhc3NlcnQoc2lnbnVwVGltZXN0YW1wID09PSAwICYmIHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSwgJ2lmIHRoZSBzdGFydGluZyByb3VuZCBpcyB6ZXJvLCB0aGUgc2lnbnVwIHJvdW5kIG11c3QgYmUgemVybyBhbmQgYWxsb3dMYXRlU2lnbnVwcyBtdXN0IGJlIHRydWUnKQogICAgYXNzZXJ0IC8vIGlmIHRoZSBzdGFydGluZyByb3VuZCBpcyB6ZXJvLCB0aGUgc2lnbnVwIHJvdW5kIG11c3QgYmUgemVybyBhbmQgYWxsb3dMYXRlU2lnbnVwcyBtdXN0IGJlIHRydWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NDAKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYnVyeSAyCgpmaW5hbGl6ZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk0NAogICAgLy8gZW5kVGltZXN0YW1wID09PSAwIHx8IGVuZFRpbWVzdGFtcCA+IChzdGFydFRpbWVzdGFtcCArIDEwKSwKICAgIGR1cAogICAgYnogZmluYWxpemVfYm9vbF90cnVlQDE4CiAgICBkaWcgMQogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwogICAgZGlnIDEKICAgIDwKICAgIGJ6IGZpbmFsaXplX2Jvb2xfZmFsc2VAMTkKCmZpbmFsaXplX2Jvb2xfdHJ1ZUAxODoKICAgIGludGNfMSAvLyAxCgpmaW5hbGl6ZV9ib29sX21lcmdlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk0My05NDYKICAgIC8vIGFzc2VydCgKICAgIC8vICAgZW5kVGltZXN0YW1wID09PSAwIHx8IGVuZFRpbWVzdGFtcCA+IChzdGFydFRpbWVzdGFtcCArIDEwKSwKICAgIC8vICAgJ3RoZSBlbmRpbmcgcm91bmQgbXVzdCBiZSB6ZXJvIG9yIGFmdGVyIHRoZSBzdGFydGluZyByb3VuZCArIDEwJwogICAgLy8gKQogICAgYXNzZXJ0IC8vIHRoZSBlbmRpbmcgcm91bmQgbXVzdCBiZSB6ZXJvIG9yIGFmdGVyIHRoZSBzdGFydGluZyByb3VuZCArIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyBzaWdudXBUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVNpZ251cFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMjQgLy8gInNpZ251cF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTQ4CiAgICAvLyB0aGlzLnNpZ251cFRpbWVzdGFtcC52YWx1ZSA9IHNpZ251cFRpbWVzdGFtcAogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhcnRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE2IC8vICJzdGFydF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTQ5CiAgICAvLyB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlID0gc3RhcnRUaW1lc3RhbXAKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gZW5kVGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbmRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE3IC8vICJlbmRfdGltZXN0YW1wIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk1MAogICAgLy8gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPSBlbmRUaW1lc3RhbXAKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGF0dXM+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGF0dXMgfSkKICAgIGJ5dGVjIDEwIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTUxCiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSA9IFBvb2xTdGF0dXNGaW5hbAogICAgYnl0ZWMgOCAvLyAweDBhCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNAogICAgLy8gZmluYWxpemUoc2lnbnVwVGltZXN0YW1wOiB1aW50NjQsIHN0YXJ0VGltZXN0YW1wOiB1aW50NjQsIGVuZFRpbWVzdGFtcDogdWludDY0KSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmaW5hbGl6ZV9ib29sX2ZhbHNlQDE5OgogICAgaW50Y18wIC8vIDAKICAgIGIgZmluYWxpemVfYm9vbF9tZXJnZUAyMAoKZmluYWxpemVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplX2Jvb2xfbWVyZ2VAMTUKCmZpbmFsaXplX2Jvb2xfZmFsc2VAOToKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplX2Jvb2xfbWVyZ2VAMTAKCmZpbmFsaXplX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZWRFbnRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdhdGVkRW50ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTU0LTk1OAogICAgLy8gZ2F0ZWRFbnRlcigKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBnYXRlVHhuOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFR4biwKICAgIC8vICAgZW50cmllczogU3Rha2VFbnRyeVtdLAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTU5CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NTkKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyh0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0MwogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBibnogZ2F0ZWRFbnRlcl9hZnRlcl9pZl9lbHNlQDMKICAgIGR1cAoKZ2F0ZWRFbnRlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTYyCiAgICAvLyBhc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgIT09IDAsICdnYXRlIGlkIGlzIG5vdCBzZXQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTYyCiAgICAvLyBhc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgIT09IDAsICdnYXRlIGlkIGlzIG5vdCBzZXQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIGdhdGUgaWQgaXMgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2MwogICAgLy8gYXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2MwogICAgLy8gYXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgZ2F0ZUNoZWNrCiAgICBhc3NlcnQgLy8gR2F0ZSBjaGVjayBmYWlsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjQzCiAgICAvLyByZXR1cm4gZGVjb2RlQXJjNDxHYXRlQXJncz4oZ2F0ZVR4bi5hcHBBcmdzKDMpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTY1CiAgICAvLyB0aGlzLmNyZWF0ZVBvb2xFbnRyaWVzKHBheW1lbnQsIGVudHJpZXMsIGdldEdhdGVBcmdzKGdhdGVUeG4pKQogICAgZGlnIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgY3JlYXRlUG9vbEVudHJpZXMKICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk1NC05NTgKICAgIC8vIGdhdGVkRW50ZXIoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGVudHJpZXM6IFN0YWtlRW50cnlbXSwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2F0ZWRFbnRlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgYnl0ZWMgMzcgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICBiIGdhdGVkRW50ZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5lbnRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmVudGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2OAogICAgLy8gZW50ZXIocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBlbnRyaWVzOiBTdGFrZUVudHJ5W10pOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2OQogICAgLy8gYXNzZXJ0KHRoaXMuZ2F0ZUlELnZhbHVlID09PSAwLCAnZ2F0ZSBpZCBpcyBzZXQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTY5CiAgICAvLyBhc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgPT09IDAsICdnYXRlIGlkIGlzIHNldCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGdhdGUgaWQgaXMgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTcwCiAgICAvLyB0aGlzLmNyZWF0ZVBvb2xFbnRyaWVzKHBheW1lbnQsIGVudHJpZXMsIFtdKQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGNhbGxzdWIgY3JlYXRlUG9vbEVudHJpZXMKICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2OAogICAgLy8gZW50ZXIocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBlbnRyaWVzOiBTdGFrZUVudHJ5W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnN0YXJ0RGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKc3RhcnREaXNidXJzZW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBzdGFydERpc2J1cnNlbWVudChyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk3NAogICAgLy8gYXNzZXJ0KHRoaXMuaXNMaXZlKCksICd0aGUgcG9vbCBpcyBub3QgbGl2ZScpCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlCiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgaXMgbm90IGxpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NzUKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NzUKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyByZXdhcmQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NzcKICAgIC8vIGNvbnN0IHsgcGhhc2UsIGludGVydmFsLCBsYXN0RGlzYnVyc2VtZW50VGltZXN0YW1wLCBleHBpcmF0aW9uIH0gPSB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIHB1c2hpbnQgMjUgLy8gMjUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDIKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTcgLy8gMTcKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk3OQogICAgLy8gYXNzZXJ0KHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUlkbGUsICdyZXdhcmQgaXMgYWxyZWFkeSBpbiBhIGRpc2J1cnNlbWVudCBwaGFzZScpCiAgICBzd2FwCiAgICBieXRlY18zIC8vIDB4MDAKICAgID09CiAgICBhc3NlcnQgLy8gcmV3YXJkIGlzIGFscmVhZHkgaW4gYSBkaXNidXJzZW1lbnQgcGhhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gKChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSkgJSBpbnRlcnZhbCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFydFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTYgLy8gInN0YXJ0X3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gKChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSkgJSBpbnRlcnZhbCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAtCiAgICB1bmNvdmVyIDIKICAgICUKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUzNQogICAgLy8gcmV0dXJuIGxhdGVzdFdpbmRvd1N0YXJ0ICE9PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICYmIGxhc3QgPCBsYXRlc3RXaW5kb3dTdGFydAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgIT0KICAgIGJ6IHN0YXJ0RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VANAogICAgZGlnIDIKICAgIGRpZyAxCiAgICA8CiAgICBieiBzdGFydERpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpzdGFydERpc2J1cnNlbWVudF9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyBhc3NlcnQodGhpcy52YWxpZFdpbmRvdyhpbnRlcnZhbCwgbGFzdERpc2J1cnNlbWVudFRpbWVzdGFtcCksICdkaXN0cmlidXRpb24gd2luZG93IGlzIG5vdCBvcGVuJykKICAgIGFzc2VydCAvLyBkaXN0cmlidXRpb24gd2luZG93IGlzIG5vdCBvcGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTgzCiAgICAvLyBgJHt0aGlzLnRpdGxlLnZhbHVlfSAtIFJld2FyZHNgLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIHRpdGxlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VGl0bGUgfSkKICAgIGJ5dGVjIDI4IC8vICJ0aXRsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5ODMKICAgIC8vIGAke3RoaXMudGl0bGUudmFsdWV9IC0gUmV3YXJkc2AsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgLSBSZXdhcmRzIgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTg1CiAgICAvLyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgZXhwaXJhdGlvbgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTcKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkucmV3YXJkcykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTcKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkucmV3YXJkcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTU3CiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTgKICAgIC8vIGNvbnN0IHJld2FyZE1CUjogdWludDY0ID0gTWluRGlzYnVyc2VtZW50c01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIEJ5dGVzKHRpdGxlKS5sZW5ndGgpCiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjIDYgLy8gNDAwCiAgICBkaWcgMQogICAgKgogICAgcHVzaGludCAzNTMwMCAvLyAzNTMwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2MQogICAgLy8gcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTY1LTU3NAogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZURpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgdGl0bGUsCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgJycsCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NjAtNTYzCiAgICAvLyBjb25zdCBtYnJQYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiByZXdhcmRNQlIsCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2NS01NzQKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIHRpdGxlLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICcnLAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2OQogICAgLy8gdGl0bGUsCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5ODQKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU3MAogICAgLy8gdGltZVRvVW5sb2NrLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU3MQogICAgLy8gZXhwaXJhdGlvbiwKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2NS01NzQKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIHRpdGxlLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICcnLAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDFjOWViYmRiIC8vIG1ldGhvZCAiY3JlYXRlRGlzYnVyc2VtZW50KHBheSxzdHJpbmcsdWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NzIKICAgIC8vICcnLAogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NjUtNTc0CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICB0aXRsZSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAnJywKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTg4CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnF1YWxpZmllZFN0YWtlcnMgPSAwCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDMzIC8vIDMzCiAgICBkaWcgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5ODkKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucXVhbGlmaWVkU3Rha2UgPSAwCiAgICBkdXAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTAKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucGhhc2UgPSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGJ5dGVjIDggLy8gMHgwYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuYWN0aXZlRGlzYnVyc2VtZW50SUQgPSBkaXNidXJzZW1lbnRJRAogICAgZHVwCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuYWN0aXZlRGlzYnVyc2VtZW50Um91bmRTdGFydCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCAxMDggLy8gMTA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTk0CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXAgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBzdGFydERpc2J1cnNlbWVudChyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzdGFydERpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFydERpc2J1cnNlbWVudF9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJhZmZsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTcKICAgIC8vIHJhZmZsZShyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZGlzYnVyc2VSZXdhcmRzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGlzYnVyc2VSZXdhcmRzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAzNwogICAgLy8gZGlzYnVyc2VSZXdhcmRzKHJld2FyZElEOiB1aW50NjQsIGl0ZXJhdGlvbkFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzkKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDM5CiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRzKHJld2FyZElEKS5leGlzdHMsICdyZXdhcmQgZG9lcyBub3QgZXhpc3QnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gcmV3YXJkIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA0MQogICAgLy8gY29uc3QgeyBwaGFzZSwgZGlzdHJpYnV0aW9uLCB3aW5uaW5nVGlja2V0cyB9ID0gY2xvbmUodGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZSkKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNDQKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICBieXRlYyA4IC8vIDB4MGEKICAgID09CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDQ0LTEwNDUKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICAvLyBwaGFzZSA9PT0gRGlzYnVyc2VtZW50UGhhc2VBbGxvY2F0aW9uLAogICAgYm56IGRpc2J1cnNlUmV3YXJkc19ib29sX3RydWVAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNDUKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUFsbG9jYXRpb24sCiAgICBkaWcgMgogICAgYnl0ZWMgMTMgLy8gMHgxNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDQ0LTEwNDUKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICAvLyBwaGFzZSA9PT0gRGlzYnVyc2VtZW50UGhhc2VBbGxvY2F0aW9uLAogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Jvb2xfZmFsc2VANAoKZGlzYnVyc2VSZXdhcmRzX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmRpc2J1cnNlUmV3YXJkc19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA0My0xMDQ3CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICAvLyAgIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUFsbG9jYXRpb24sCiAgICAvLyAgIEVSUl9OT1RfUkVBRFlfVE9fRElTQlVSU0UKICAgIC8vICkKICAgIGFzc2VydCAvLyBOb3QgcmVhZHkgdG8gZGlzYnVyc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDQ5CiAgICAvLyBpZiAocGhhc2UgPT09IERpc2J1cnNlbWVudFBoYXNlUHJlcGFyYXRpb24pIHsKICAgIGR1cAogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjI0CiAgICAvLyBjb25zdCB7IGRpc2J1cnNlbWVudEN1cnNvciwgZGlzdHJpYnV0aW9uLCByYXRlLCBhc3NldCB9ID0gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZQogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAyMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDQKICAgIGR1cAogICAgcHVzaGludCA5IC8vIDkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gbGV0IGNvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyA1CiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMjkKICAgIC8vIGl0ZXJhdGlvbkFtb3VudCA9IHRoaXMuZW50cnlJRC52YWx1ZSAtIGRpc2J1cnNlbWVudEN1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gaXRlcmF0aW9uQW1vdW50ID0gdGhpcy5lbnRyeUlELnZhbHVlIC0gZGlzYnVyc2VtZW50Q3Vyc29yCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDIxCiAgICAtCiAgICBidXJ5IDUKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDEwMDoKICAgIGRpZyAyMAogICAgYnVyeSAxOAoKZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEAxMDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBmb3IgKGxldCBpZCA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaWQgPCAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KTsgaWQrKykgewogICAgZGlnIDIwCiAgICBkaWcgNQogICAgKwogICAgZGlnIDE4CiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfd2hpbGVAMTEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgcXVhbnRpdHkgfSA9IGNsb25lKHRoaXMuZW50cmllcyhpZCkudmFsdWUpCiAgICBkaWcgMTcKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgcXVhbnRpdHkgfSA9IGNsb25lKHRoaXMuZW50cmllcyhpZCkudmFsdWUpCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgcHVzaGludCA0MCAvLyA0MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDExMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUzOQogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfTk9ORSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MzkKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX05PTkUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vIDB4MDAKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEwNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU0MAogICAgLy8gcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGJhbGFuY2U6IDAgfQogICAgcHVzaGJ5dGVzIDB4ODAwMDAwMDAwMDAwMDAwMDAwCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmdldFN0YWtlVmFsdWVAMTA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gY29uc3QgeyB2YWxpZCB9ID0gdGhpcy5nZXRTdGFrZVZhbHVlKGlkKQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gaWYgKCF2YWxpZCkgewogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDExMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDI1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI0NQogICAgLy8gdG90YWwgKz0gcXVhbnRpdHkKICAgIGRpZyA3CiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgOAoKZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDExMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMzIKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMTcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDE4CiAgICBiIGRpc2J1cnNlUmV3YXJkc193aGlsZV90b3BAMTAxCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEwNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NDEKICAgIC8vIH0gZWxzZSBpZiAodGhpcy50eXBlLnZhbHVlID09PSBQT09MX1NUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQxCiAgICAvLyB9IGVsc2UgaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDBhCiAgICA9PQogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQyCiAgICAvLyBjb25zdCB7IGFkZHJlc3MsIGFzc2V0IH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkaWcgMzQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NDQtNTQ3CiAgICAvLyBjb25zdCBhdmcgPSBhYmlDYWxsPHR5cGVvZiBTdGFraW5nLnByb3RvdHlwZS5nZXRIZWFydGJlYXRBdmVyYWdlPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIC8vICAgYXJnczogW2FkZHJlc3MsIGFzc2V0LCB0cnVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU0NQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ0LTU0NwogICAgLy8gY29uc3QgYXZnID0gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZy5wcm90b3R5cGUuZ2V0SGVhcnRiZWF0QXZlcmFnZT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzLCBhc3NldCwgdHJ1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4YzZmZDBjYTUgLy8gbWV0aG9kICJnZXRIZWFydGJlYXRBdmVyYWdlKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ2CiAgICAvLyBhcmdzOiBbYWRkcmVzcywgYXNzZXQsIHRydWVdLAogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU0NC01NDcKICAgIC8vIGNvbnN0IGF2ZyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEhlYXJ0YmVhdEF2ZXJhZ2U+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbYWRkcmVzcywgYXNzZXQsIHRydWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NDkKICAgIC8vIHJldHVybiB7IHZhbGlkOiB0cnVlLCBiYWxhbmNlOiBhdmcgfQogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyBjb25zdCB7IHZhbGlkIH0gPSB0aGlzLmdldFN0YWtlVmFsdWUoaWQpCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2V0U3Rha2VWYWx1ZUAxMDkKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDEwODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTIKICAgIC8vIHJldHVybiB0aGlzLmNoZWNrQnlJRChpZCkKICAgIGRpZyAxNwogICAgY2FsbHN1YiBjaGVja0J5SUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIGNvbnN0IHsgdmFsaWQgfSA9IHRoaXMuZ2V0U3Rha2VWYWx1ZShpZCkKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nZXRTdGFrZVZhbHVlQDEwOQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDExMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNDgKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucXVhbGlmaWVkU3Rha2VycyArPSBjb3VudAogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCAzMyAvLyAzMwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMjcKICAgICsKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDMzIC8vIDMzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjQ5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnF1YWxpZmllZFN0YWtlICs9IHRvdGFsCiAgICBkdXAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDkKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjUxCiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSBkaXNidXJzZW1lbnRDdXJzb3IpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGlmICh0aGlzLmVudHJ5SUQudmFsdWUgPT09IGRpc2J1cnNlbWVudEN1cnNvcikgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyMQogICAgPT0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlAMTIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnBoYXNlID0gRGlzYnVyc2VtZW50UGhhc2VBbGxvY2F0aW9uCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDkxIC8vIDkxCiAgICBieXRlYyAxMyAvLyAweDE0CiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI1NAogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5kaXNidXJzZW1lbnRDdXJzb3IgPSAxIC8vIEVudHJ5IElEcyBzdGFydCBhdCAxCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgZGlnIDEKICAgIGludGNfMyAvLyA5MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI1NgogICAgLy8gdGhpcy5wYXlBa2l0YVJveWFsdHkoZGlzdHJpYnV0aW9uLCByYXRlLCBhc3NldCwgdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5xdWFsaWZpZWRTdGFrZXJzKQogICAgcHVzaGludCAzMyAvLyAzMwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBpZiAoZGlzdHJpYnV0aW9uID09PSBEaXN0cmlidXRpb25UeXBlRmxhdCkgewogICAgZGlnIDEKICAgIGJ5dGVjIDEzIC8vIDB4MTQKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDExNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gYW1vdW50ID0gY2FsY1BlcmNlbnQoKHF1YWxpZmllZFN0YWtlcnMgKiByYXRlKSwgdGhpcy5ha2l0YVJveWFsdHkudmFsdWUpCiAgICBkaWcgMTQKICAgIGRpZyAxMwogICAgKgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFraXRhUm95YWx0eSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eSB9KQogICAgYnl0ZWMgMjcgLy8gImFraXRhX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyBhbW91bnQgPSBjYWxjUGVyY2VudCgocXVhbGlmaWVkU3Rha2VycyAqIHJhdGUpLCB0aGlzLmFraXRhUm95YWx0eS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgYnVyeSAyOQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gYWtpdGFSb3lhbHR5QW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5QW1vdW50IH0pCiAgICBieXRlYyAyMiAvLyAiYWtpdGFfcm95YWx0eV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZSA9IGFtb3VudAogICAgZGlnIDI5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBpZiAoYW1vdW50ID09PSAwKSB7CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBkaWcgMjcKICAgIGJueiBkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEyMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIwNC0yMDkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlYyA3IC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyAyOQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMDQtMjA4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMDQtMjA5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAzNwogICAgLy8gZGlzYnVyc2VSZXdhcmRzKHJld2FyZElEOiB1aW50NjQsIGl0ZXJhdGlvbkFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIGFzc2VydCh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSksIEVSUl9EQU9fTk9UX09QVEVEX0lOKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gYXNzZXJ0KHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSwgRVJSX0RBT19OT1RfT1BURURfSU4pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMjkKICAgIGR1cAogICAgY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBEQU8gbm90IG9wdGVkIGluIHRvIHRoZSBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIxMy0yMTkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyAyOQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjEzLTIxOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMTMtMjE5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDExNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGFtb3VudCA9IGNhbGNQZXJjZW50KHJhdGUsIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFraXRhUm95YWx0eSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eSB9KQogICAgYnl0ZWMgMjcgLy8gImFraXRhX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTkyCiAgICAvLyBhbW91bnQgPSBjYWxjUGVyY2VudChyYXRlLCB0aGlzLmFraXRhUm95YWx0eS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZGlnIDEzCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBidXJ5IDI5CiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDExNwoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUAxMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjU5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciArPSBpdGVyYXRpb25BbW91bnQKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMyAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDkyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNTMKICAgIC8vIGNhc2UgRGlzdHJpYnV0aW9uVHlwZVBlcmNlbnRhZ2U6IHsKICAgIGRpZyAxCiAgICBieXRlYyA4IC8vIDB4MGEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA1My0xMDU2CiAgICAvLyBjYXNlIERpc3RyaWJ1dGlvblR5cGVQZXJjZW50YWdlOiB7CiAgICAvLyAgIHRoaXMuY3JlYXRlUGVyY2VudGFnZURpc2J1cnNlbWVudChyZXdhcmRJRCwgaXRlcmF0aW9uQW1vdW50KQogICAgLy8gICBicmVhawogICAgLy8gfQogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIH0gPSB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDI5CiAgICBkdXAKICAgIGludGNfMyAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMjMKICAgIGR1cAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMzYKICAgIGR1cAogICAgcHVzaGludCA0MSAvLyA0MQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE4CiAgICBwdXNoaW50IDkgLy8gOQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyA1CiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA4OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI3MwogICAgLy8gaXRlcmF0aW9uQW1vdW50ID0gdGhpcy5lbnRyeUlELnZhbHVlIC0gZGlzYnVyc2VtZW50Q3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjczCiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMjEKICAgIC0KICAgIGJ1cnkgNQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAODg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBjb25zdCBhY3R1YWxBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIHRoaXMuYWtpdGFSb3lhbHR5QW1vdW50LnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gYWtpdGFSb3lhbHR5QW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5QW1vdW50IH0pCiAgICBieXRlYyAyMiAvLyAiYWtpdGFfcm95YWx0eV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBjb25zdCBhY3R1YWxBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIHRoaXMuYWtpdGFSb3lhbHR5QW1vdW50LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDI5CiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDMzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjc3CiAgICAvLyBsZXQgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNzgKICAgIC8vIGxldCBzdW06IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBkaWcgMjAKICAgIGJ1cnkgMTgKCmRpc2J1cnNlUmV3YXJkc193aGlsZV90b3BAODk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyBmb3IgKGxldCBpZCA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaWQgPCAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KTsgaWQrKykgewogICAgZGlnIDIwCiAgICBkaWcgNQogICAgKwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkaWcgMTgKICAgID4KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl93aGlsZUA5NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gY29uc3QgeyBkaXNxdWFsaWZpZWQsIHF1YW50aXR5LCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkaWcgMTcKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gY29uc3QgeyBkaXNxdWFsaWZpZWQsIHF1YW50aXR5LCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgZGlnIDEKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNgogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjgyCiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDkzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjExMwogICAgLy8gYXNzZXJ0KGEgPCBiLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFX09GX0FSR1MpCiAgICBkaWcgMTMKICAgIGR1cAogICAgZGlnIDE3CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2Ugb2YgYXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMTQKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgRElWSVNPUiksIGIpCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBtdWx3CiAgICB1bmNvdmVyIDIKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGVyY2VudGFnZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBkaWcgMzMKICAgIG11bHcKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyODcKICAgIC8vIGFsbG9jYXRpb25zLnB1c2goeyBhZGRyZXNzLCBhbW91bnQ6IGluZGl2aWR1YWxBbW91bnQgfSkKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDM4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIHN1bSArPSBpbmRpdmlkdWFsQW1vdW50CiAgICBkaWcgMTEKICAgICsKICAgIGJ1cnkgMTEKCmRpc2J1cnNlUmV3YXJkc19ibG9ja0A5MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMTcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDE4CiAgICBiIGRpc2J1cnNlUmV3YXJkc193aGlsZV90b3BAODkKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl93aGlsZUA5NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yICs9IGl0ZXJhdGlvbkFtb3VudAogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gOTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjkzCiAgICAvLyB0aGlzLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGFjdGl2ZURpc2J1cnNlbWVudElELCBhc3NldCwgYWxsb2NhdGlvbnMsIHN1bSkKICAgIGRpZyAzMwogICAgZGlnIDI4CiAgICBkaWcgMzcKICAgIGRpZyAxMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjk1CiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gaWYgKHRoaXMuZW50cnlJRC52YWx1ZSA9PT0gKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgOQogICAgPT0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnBoYXNlID0gRGlzYnVyc2VtZW50UGhhc2VGaW5hbGl6YXRpb24KICAgIGRpZyAzCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGJ5dGVjIDE0IC8vIDB4MWUKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciA9IDEgLy8gRW50cnkgSURzIHN0YXJ0IGF0IDEKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gOTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDU3CiAgICAvLyBjYXNlIERpc3RyaWJ1dGlvblR5cGVGbGF0OiB7CiAgICBkaWcgMQogICAgYnl0ZWMgMTMgLy8gMHgxNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDU3LTEwNjAKICAgIC8vIGNhc2UgRGlzdHJpYnV0aW9uVHlwZUZsYXQ6IHsKICAgIC8vICAgdGhpcy5jcmVhdGVGbGF0RGlzYnVyc2VtZW50KHJld2FyZElELCBpdGVyYXRpb25BbW91bnQpCiAgICAvLyAgIGJyZWFrCiAgICAvLyB9CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gfSA9IHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUKICAgIGRpZyAzCiAgICBkdXAKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDM1CiAgICBkdXAKICAgIGludGNfMyAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDIyCiAgICBkdXAKICAgIHB1c2hpbnQgMzMgLy8gMzMKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBjb25zdCB0b3RhbDogdWludDY0ID0gKHF1YWxpZmllZFN0YWtlcnMgKiBhbW91bnQpIC0gdGhpcy5ha2l0YVJveWFsdHlBbW91bnQudmFsdWUKICAgIHN3YXAKICAgIGRpZyAxCiAgICAqCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gYWtpdGFSb3lhbHR5QW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5QW1vdW50IH0pCiAgICBieXRlYyAyMiAvLyAiYWtpdGFfcm95YWx0eV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBjb25zdCB0b3RhbDogdWludDY0ID0gKHF1YWxpZmllZFN0YWtlcnMgKiBhbW91bnQpIC0gdGhpcy5ha2l0YVJveWFsdHlBbW91bnQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBjb25zdCBwZXJjZW50YWdlQWtpdGFGZWUgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFraXRhUm95YWx0eSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eSB9KQogICAgYnl0ZWMgMjcgLy8gImFraXRhX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBjb25zdCBwZXJjZW50YWdlQWtpdGFGZWUgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGVyY2VudGFnZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBkaWcgMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gY29uc3QgYWRqdXN0ZWRBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIHBlcmNlbnRhZ2VBa2l0YUZlZQogICAgLQogICAgYnVyeSAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3MwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYmFsYW5jZSA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzIyCiAgICAvLyBhc3NlcnQoYmFsYW5jZSA+PSB0b3RhbCwgRVJSX05PVF9FTk9VR0hfRlVORFMpCiAgICBkaWcgOAogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzI0CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyAyMAogICAgZGlnIDUKICAgICsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIGlmICgoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KSA+IHRoaXMuZW50cnlJRC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDc2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzI1CiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMjUKICAgIC8vIGl0ZXJhdGlvbkFtb3VudCA9IHRoaXMuZW50cnlJRC52YWx1ZSAtIGRpc2J1cnNlbWVudEN1cnNvcgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyMQogICAgLQogICAgYnVyeSA1CgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA3NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMjgKICAgIC8vIGxldCBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSA9IFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYnVyeSAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gbGV0IHN1bTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKICAgIGRpZyAyMAogICAgYnVyeSAxOAoKZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEA3NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMjAKICAgIGRpZyA1CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIGRpZyAxOAogICAgPgogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDgyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzMyCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcyB9ID0gdGhpcy5lbnRyaWVzKGlkKS52YWx1ZQogICAgZGlnIDE3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBlbnRyaWVzID0gQm94TWFwPHVpbnQ2NCwgRW50cnlEYXRhPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeEVudHJpZXMgfSkKICAgIGJ5dGVjIDkgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGNvbnN0IHsgZGlzcXVhbGlmaWVkLCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDgxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBhbGxvY2F0aW9ucy5wdXNoKHsgYWRkcmVzcywgYW1vdW50OiBhZGp1c3RlZEFtb3VudCB9KQogICAgZGlnIDMwCiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAzOAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMzcKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBzdW0gKz0gYWRqdXN0ZWRBbW91bnQKICAgIGRpZyAxMQogICAgKwogICAgYnVyeSAxMQoKZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDgxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMzMQogICAgLy8gZm9yIChsZXQgaWQgPSBkaXNidXJzZW1lbnRDdXJzb3I7IGlkIDwgKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCk7IGlkKyspIHsKICAgIGRpZyAxNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTgKICAgIGIgZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEA3NwoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDgyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM0MgogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5kaXNidXJzZW1lbnRDdXJzb3IgPSBuZXdDdXJzb3JWYWx1ZQogICAgZGlnIDE2CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyA1CiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHRoaXMuY3JlYXRlUmV3YXJkQWxsb2NhdGlvbnMoYWN0aXZlRGlzYnVyc2VtZW50SUQsIGFzc2V0LCBhbGxvY2F0aW9ucywgc3VtKQogICAgZGlnIDM0CiAgICBkaWcgMjkKICAgIGRpZyAzOAogICAgZGlnIDE0CiAgICBjYWxsc3ViIGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNDUKICAgIC8vIGlmICh0aGlzLmVudHJ5SUQudmFsdWUgPT09IG5ld0N1cnNvclZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSBuZXdDdXJzb3JWYWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5waGFzZSA9IERpc2J1cnNlbWVudFBoYXNlRmluYWxpemF0aW9uCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDkxIC8vIDkxCiAgICBieXRlYyAxNCAvLyAweDFlCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5kaXNidXJzZW1lbnRDdXJzb3IgPSAxIC8vIEVudHJ5IElEcyBzdGFydCBhdCAxCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgaW50Y18zIC8vIDkyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIFtiYWxhbmNlXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGFzc2V0KQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAyOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANzQKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNjEKICAgIC8vIGNhc2UgRGlzdHJpYnV0aW9uVHlwZUV2ZW46IHsKICAgIGRpZyAxCiAgICBieXRlYyAxNCAvLyAweDFlCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNjEtMTA2NAogICAgLy8gY2FzZSBEaXN0cmlidXRpb25UeXBlRXZlbjogewogICAgLy8gICB0aGlzLmNyZWF0ZUV2ZW5EaXNidXJzZW1lbnQocmV3YXJkSUQsIGl0ZXJhdGlvbkFtb3VudCkKICAgIC8vICAgYnJlYWsKICAgIC8vIH0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyB9ID0gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZQogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMzUKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMjIKICAgIGR1cAogICAgcHVzaGludCAzMyAvLyAzMwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAzMAogICAgcHVzaGludCA5IC8vIDkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2MwogICAgLy8gYmFsYW5jZSA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBjb25zdCBhY3R1YWxTdW06IHVpbnQ2NCA9IHJhdGUgLSB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIGFraXRhUm95YWx0eUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eUFtb3VudCB9KQogICAgYnl0ZWMgMjIgLy8gImFraXRhX3JveWFsdHlfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gY29uc3QgYWN0dWFsU3VtOiB1aW50NjQgPSByYXRlIC0gdGhpcy5ha2l0YVJveWFsdHlBbW91bnQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMTQKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgYnVyeSAzNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gYXNzZXJ0KGJhbGFuY2UgPj0gYWN0dWFsU3VtLCBFUlJfTk9UX0VOT1VHSF9GVU5EUykKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gaWYgKChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpID4gdGhpcy5lbnRyeUlELnZhbHVlKSB7CiAgICBkaWcgMjAKICAgIGRpZyA1CiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA2MQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gaXRlcmF0aW9uQW1vdW50ID0gdGhpcy5lbnRyeUlELnZhbHVlIC0gZGlzYnVyc2VtZW50Q3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMjEKICAgIC0KICAgIGJ1cnkgNQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCBhbW91bnQ6IHVpbnQ2NCA9IGFjdHVhbFN1bSAvIHF1YWxpZmllZFN0YWtlcnMKICAgIGRpZyAzMQogICAgZGlnIDE1CiAgICAvCiAgICBidXJ5IDI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc1CiAgICAvLyBsZXQgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNzYKICAgIC8vIGxldCBhbGxvY1N1bTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMzAKICAgIGRpZyAyMAogICAgYnVyeSAxOAoKZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEA2MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMjAKICAgIGRpZyA1CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIGRpZyAxOAogICAgPgogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDY3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc4CiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcyB9ID0gdGhpcy5lbnRyaWVzKGlkKS52YWx1ZQogICAgZGlnIDE3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBlbnRyaWVzID0gQm94TWFwPHVpbnQ2NCwgRW50cnlEYXRhPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeEVudHJpZXMgfSkKICAgIGJ5dGVjIDkgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNzgKICAgIC8vIGNvbnN0IHsgZGlzcXVhbGlmaWVkLCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDY2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzgzCiAgICAvLyBhbGxvY2F0aW9ucy5wdXNoKHsgYWRkcmVzcywgYW1vdW50IH0pCiAgICBkaWcgMjgKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDM4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozODQKICAgIC8vIGFsbG9jU3VtICs9IGFtb3VudAogICAgZGlnIDMwCiAgICArCiAgICBidXJ5IDMwCgpkaXNidXJzZVJld2FyZHNfYmxvY2tANjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc3CiAgICAvLyBmb3IgKGxldCBpZCA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaWQgPCAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KTsgaWQrKykgewogICAgZGlnIDE3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxOAogICAgYiBkaXNidXJzZVJld2FyZHNfd2hpbGVfdG9wQDYyCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfd2hpbGVANjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciA9IG5ld0N1cnNvclZhbHVlCiAgICBkaWcgMTYKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDUKICAgIGludGNfMyAvLyA5MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gdGhpcy5jcmVhdGVSZXdhcmRBbGxvY2F0aW9ucyhhY3RpdmVEaXNidXJzZW1lbnRJRCwgYXNzZXQsIGFsbG9jYXRpb25zLCBhbGxvY1N1bSkKICAgIGRpZyAzNAogICAgZGlnIDI5CiAgICBkaWcgMzgKICAgIGRpZyAzMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzkxCiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSBuZXdDdXJzb3JWYWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gaWYgKHRoaXMuZW50cnlJRC52YWx1ZSA9PT0gbmV3Q3Vyc29yVmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozOTIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucGhhc2UgPSBEaXNidXJzZW1lbnRQaGFzZUZpbmFsaXphdGlvbgogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgYnl0ZWMgMTQgLy8gMHgxZQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGludGNfMyAvLyA5MgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzAKCmRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlANTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzY1CiAgICAvLyBiYWxhbmNlID0gQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYXNzZXQpWzBdCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDI4CiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1OQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA2NQogICAgLy8gY2FzZSBEaXN0cmlidXRpb25UeXBlU2h1ZmZsZTogewogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweDI4CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNjUtMTA3MgogICAgLy8gY2FzZSBEaXN0cmlidXRpb25UeXBlU2h1ZmZsZTogewogICAgLy8gICBpZiAod2lubmluZ1RpY2tldHMubGVuZ3RoID09PSAwKSB7CiAgICAvLyAgICAgdGhpcy5yYWZmbGUocmV3YXJkSUQpCiAgICAvLyAgIH0gZWxzZSB7CiAgICAvLyAgICAgdGhpcy5jcmVhdGVTaHVmZmxlRGlzYnVyc2VtZW50KHJld2FyZElELCBpdGVyYXRpb25BbW91bnQpCiAgICAvLyAgIH0KICAgIC8vICAgYnJlYWsKICAgIC8vIH0KICAgIGFzc2VydCAvLyB1bmtub3duIHJld2FyZCByYXRlIHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDY2CiAgICAvLyBpZiAod2lubmluZ1RpY2tldHMubGVuZ3RoID09PSAwKSB7CiAgICBkaWcgMwogICAgcHVzaGludHMgMTI0IDIgLy8gMTI0LCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYm56IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDY3CiAgICAvLyB0aGlzLnJhZmZsZShyZXdhcmRJRCkKICAgIGRpZyA1CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQwNgogICAgLy8gfSA9IGNsb25lKHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUpCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAzNQogICAgZHVwCiAgICBpbnRjXzMgLy8gOTIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAyMgogICAgZHVwCiAgICBwdXNoaW50IDQ5IC8vIDQ5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMzAKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgYm56IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIGJhbGFuY2UgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcy5iYWxhbmNlCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gY29uc3QgYWN0dWFsU3VtOiB1aW50NjQgPSBzdW0gLSB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIGFraXRhUm95YWx0eUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eUFtb3VudCB9KQogICAgYnl0ZWMgMjIgLy8gImFraXRhX3JveWFsdHlfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gY29uc3QgYWN0dWFsU3VtOiB1aW50NjQgPSBzdW0gLSB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxMgogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBidXJ5IDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDE2CiAgICAvLyBhc3NlcnQoYmFsYW5jZSA+PSBhY3R1YWxTdW0sIEVSUl9OT1RfRU5PVUdIX0ZVTkRTKQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDE4CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyAyMAogICAgZGlnIDUKICAgICsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTgKICAgIC8vIGlmICgoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KSA+IHRoaXMuZW50cnlJRC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIGl0ZXJhdGlvbkFtb3VudCA9IHRoaXMuZW50cnlJRC52YWx1ZSAtIGRpc2J1cnNlbWVudEN1cnNvcgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyMQogICAgLQogICAgYnVyeSA1CgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MjMKICAgIC8vIGlmICh3aW5uZXJDb3VudCA+IDApIHsKICAgIGRpZyA2CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2lmX2JvZHlAMzcKICAgIGRpZyAzMQogICAgYnVyeSAyOQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDI3CiAgICAvLyBsZXQgeyBzdGFrZSwgdGlja2V0LCBkaXNidXJzZWQgfSA9IHJhZmZsZUN1cnNvcgogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludHMgNTkgMjQgLy8gNTksIDI0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIGxldCBjdXJyZW50VGlja2V0ID0gdGlja2V0c1t0aWNrZXRdCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgcHVzaGludCAxMjYgLy8gMTI2CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIGxldCBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSA9IFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYnVyeSAzNwogICAgYnVyeSAyNAogICAgZGlnIDIwCiAgICBidXJ5IDE5CgpkaXNidXJzZVJld2FyZHNfd2hpbGVfdG9wQDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gZm9yIChsZXQgaSA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaSA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpKyspIHsKICAgIGRpZyAyMAogICAgZGlnIDUKICAgICsKICAgIGRpZyAxOQogICAgPgogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDUxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcywgYXNzZXQsIHF1YW50aXR5IH0gPSB0aGlzLmVudHJpZXMoaSkudmFsdWUKICAgIGRpZyAxOAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gZW50cmllcyA9IEJveE1hcDx1aW50NjQsIEVudHJ5RGF0YT4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzIH0pCiAgICBieXRlYyA5IC8vICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcywgYXNzZXQsIHF1YW50aXR5IH0gPSB0aGlzLmVudHJpZXMoaSkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBidXJ5IDIxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgYnVyeSAzOAogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMjgKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzNgogICAgLy8gY3VycmVudFJhbmdlRW5kID0gY3VycmVudFJhbmdlU3RhcnQgKyBxdWFudGl0eQogICAgZGlnIDI0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gaWYgKGN1cnJlbnRUaWNrZXQgPj0gY3VycmVudFJhbmdlU3RhcnQgJiYgY3VycmVudFRpY2tldCA8PSBjdXJyZW50UmFuZ2VFbmQpIHsKICAgIGRpZyAyMwogICAgPD0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDQ5CiAgICBkaWcgMjIKICAgIGRpZyAyNQogICAgPD0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyBpZiAoIWRpc3F1YWxpZmllZCkgewogICAgZGlnIDE5CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGFsbG9jYXRpb25zLnB1c2goeyBhZGRyZXNzLCBhbW91bnQgfSkKICAgIGRpZyAyOAogICAgaXRvYgogICAgZGlnIDM3CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGRpc2J1cnNlZCsrCiAgICBkaWcgMjEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDIyCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIGlmICh0aWNrZXQgPT09IHRpY2tldHMubGVuZ3RoIC0gMSkgewogICAgZGlnIDMKICAgIHB1c2hpbnRzIDEyNCAyIC8vIDEyNCwgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMTAKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ0NQogICAgLy8gaWYgKHdpbm5lckNvdW50ICE9PSBkaXNidXJzZWQpIHsKICAgIGRpZyA2CiAgICBkaWcgMjIKICAgICE9CiAgICBieiBkaXNidXJzZVJld2FyZHNfYmxvY2tANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA5MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ0Ny00NTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucmFmZmxlQ3Vyc29yID0gewogICAgLy8gICB0aWNrZXQ6IDAsCiAgICAvLyAgIHN0YWtlOiAwLAogICAgLy8gICBkaXNidXJzZWQ6IDAsCiAgICAvLyB9CiAgICBkdXAKICAgIHB1c2hpbnQgNTkgLy8gNTkKICAgIGJ5dGVjIDM4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ1MgogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS53aW5uaW5nVGlja2V0cyA9IFtdCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBwdXNoaW50IDU3IC8vIDU3CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyB0aGlzLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGFjdGl2ZURpc2J1cnNlbWVudElELCBhc3NldCwgYWxsb2NhdGlvbnMsIHN1bSkKICAgIGRpZyAzMwogICAgZGlnIDI3CiAgICBkaWcgMzcKICAgIGRpZyAxMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA2OQogICAgLy8gdGhpcy5jcmVhdGVTaHVmZmxlRGlzYnVyc2VtZW50KHJld2FyZElELCBpdGVyYXRpb25BbW91bnQpCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfYmxvY2tANTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDcwCiAgICAvLyB0aGlzLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGFjdGl2ZURpc2J1cnNlbWVudElELCBhc3NldCwgYWxsb2NhdGlvbnMsIHN1bSkKICAgIGRpZyAzMwogICAgZGlnIDI4CiAgICBkaWcgMzcKICAgIGRpZyAxMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBpZiAod2lubmVyQ291bnQgPT09IGRpc2J1cnNlZCkgewogICAgZGlnIDYKICAgIGRpZyAyMgogICAgPT0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlANTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucGhhc2UgPSBEaXNidXJzZW1lbnRQaGFzZUZpbmFsaXphdGlvbgogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgYnl0ZWMgMTQgLy8gMHgxZQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NzUtNDc5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnJhZmZsZUN1cnNvciA9IHsKICAgIC8vICAgdGlja2V0OiAwLAogICAgLy8gICBzdGFrZTogMCwKICAgIC8vICAgZGlzYnVyc2VkOiAwLAogICAgLy8gfQogICAgZHVwCiAgICBwdXNoaW50IDU5IC8vIDU5CiAgICBieXRlYyAzOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0ODAKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUud2lubmluZ1RpY2tldHMgPSBbXQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgcHVzaGludCA1NyAvLyA1NwogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA1MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yICs9IGl0ZXJhdGlvbkFtb3VudAogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDkyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDgzCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnJhZmZsZUN1cnNvciA9IHsgdGlja2V0LCBzdGFrZSwgZGlzYnVyc2VkIH0KICAgIGRpZyAxMAogICAgaXRvYgogICAgZGlnIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyMwogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoaW50IDU5IC8vIDU5CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyBpdGVyYXRpb25BbW91bnQgLT0gaQogICAgZGlnIDQKICAgIGRpZyAxOQogICAgLQogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyB0aWNrZXQrKwogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGN1cnJlbnRUaWNrZXQgPSB0aWNrZXRzW3RpY2tldF0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBwdXNoaW50IDEyNiAvLyAxMjYKICAgICsKICAgIGRpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDYyCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciA9IDEgLy8gRW50cnkgSURzIHN0YXJ0IGF0IDEKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gOTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBpID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIHN0YWtlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIGN1cnJlbnRSYW5nZUVuZCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDI1CgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA0OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjcKICAgIC8vIGN1cnJlbnRSYW5nZVN0YXJ0ID0gY3VycmVudFJhbmdlRW5kICsgMQogICAgZGlnIDI0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gZm9yIChsZXQgaSA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaSA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpKyspIHsKICAgIGRpZyAxOAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTkKICAgIGIgZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEAzOQoKZGlzYnVyc2VSZXdhcmRzX2lmX2JvZHlAMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDI0CiAgICAvLyBhbW91bnQgPSBhY3R1YWxTdW0gLyB3aW5uZXJDb3VudAogICAgZGlnIDMxCiAgICBkaWcgNwogICAgLwogICAgYnVyeSAyOQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzOAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGJhbGFuY2UgPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBhc3NldClbMF0KICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMjgKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDM0CgpkaXNidXJzZVJld2FyZHNfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZmluYWxpemVEaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpmaW5hbGl6ZURpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDgwCiAgICAvLyBmaW5hbGl6ZURpc3RyaWJ1dGlvbihyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwODEKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4MQogICAgLy8gYXNzZXJ0KHRoaXMucmV3YXJkcyhyZXdhcmRJRCkuZXhpc3RzLCAncmV3YXJkIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gcmV3YXJkIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4MgogICAgLy8gY29uc3QgeyBwaGFzZSwgYWN0aXZlRGlzYnVyc2VtZW50SUQgfSA9IHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwODMKICAgIC8vIGFzc2VydChwaGFzZSA9PT0gRGlzYnVyc2VtZW50UGhhc2VGaW5hbGl6YXRpb24sIEVSUl9ESVNCVVJTRU1FTlRfTk9UX1JFQURZX0ZPUl9GSU5BTElaQVRJT04pCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDE0IC8vIDB4MWUKICAgID09CiAgICBhc3NlcnQgLy8gRGlzYnVyc2VtZW50IG5vdCByZWFkeSBmb3IgZmluYWxpemF0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYyMgogICAgLy8gY29uc3QgcmV3YXJkc0FwcCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5yZXdhcmRzKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjI0LTYyNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuZmluYWxpemVEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFtkaXNidXJzZW1lbnRJRF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4NTQyNGE1OTEgLy8gbWV0aG9kICJmaW5hbGl6ZURpc2J1cnNlbWVudCh1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGFjdGl2ZURpc2J1cnNlbWVudElEKS5jcmVhdGUoKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIGJ5dGVzPDA+Pih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwODcKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhhY3RpdmVEaXNidXJzZW1lbnRJRCkuY3JlYXRlKCkKICAgIGludGNfMCAvLyAwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDg5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnBoYXNlID0gRGlzYnVyc2VtZW50UGhhc2VJZGxlCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDkwCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmFjdGl2ZURpc2J1cnNlbWVudElEID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwOTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuYWN0aXZlRGlzYnVyc2VtZW50Um91bmRTdGFydCA9IDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwOTIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDkzCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnF1YWxpZmllZFN0YWtlcnMgPSAwCiAgICBkaWcgMQogICAgcHVzaGludCAzMyAvLyAzMwogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA5NAogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5xdWFsaWZpZWRTdGFrZSA9IDAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4MAogICAgLy8gZmluYWxpemVEaXN0cmlidXRpb24ocmV3YXJkSUQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuY2hlY2tbcm91dGluZ10oKSAtPiB2b2lkOgpjaGVjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyBjaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogeyB2YWxpZDogYm9vbGVhbiwgYmFsYW5jZTogdWludDY0IH0gewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDk4CiAgICAvLyBjb25zdCBrZXk6IEVudHJ5S2V5ID0geyBhZGRyZXNzLCBhc3NldCB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGVudHJpZXNCeUFkZHJlc3MgPSBCb3hNYXA8RW50cnlLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzQnlBZGRyZXNzIH0pCiAgICBieXRlYyAzMCAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwOTkKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5lbnRyaWVzQnlBZGRyZXNzKGtleSkudmFsdWUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEwMAogICAgLy8gcmV0dXJuIHRoaXMuY2hlY2tCeUlEKGlkKQogICAgY2FsbHN1YiBjaGVja0J5SUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyBjaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogeyB2YWxpZDogYm9vbGVhbiwgYmFsYW5jZTogdWludDY0IH0gewogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ106CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEwMwogICAgLy8gZ2F0ZUNoZWNrKGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLCBhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTA0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgYWRkcmVzcykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTA0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgYWRkcmVzcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0MwogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaWZfZWxzZUA3CiAgICBkaWcgMgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIGNvbnN0IHBhc3NlcyA9IGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIGNvbnN0IHBhc3NlcyA9IGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBnYXRlSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlHYXRlSUQgfSkKICAgIGJ5dGVjIDEyIC8vICJnYXRlX2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIGNvbnN0IHBhc3NlcyA9IGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGdhdGVDaGVjawogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDgKICAgIC8vIGlmICghcGFzc2VzICYmIHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3Rha2luZ1R5cGU+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlUeXBlIH0pCiAgICBieXRlYyA0IC8vICJ0eXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDgKICAgIC8vIGlmICghcGFzc2VzICYmIHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDBhCiAgICAhPQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEwOQogICAgLy8gY29uc3Qga2V5OiBFbnRyeUtleSA9IHsgYWRkcmVzcywgYXNzZXQgfQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGVudHJpZXNCeUFkZHJlc3MgPSBCb3hNYXA8RW50cnlLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzQnlBZGRyZXNzIH0pCiAgICBieXRlYyAzMCAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMTAKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5lbnRyaWVzQnlBZGRyZXNzKGtleSkudmFsdWUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTExMQogICAgLy8gdGhpcy5lbnRyaWVzKGlkKS52YWx1ZS5kaXNxdWFsaWZpZWQgPSB0cnVlCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBlbnRyaWVzID0gQm94TWFwPHVpbnQ2NCwgRW50cnlEYXRhPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeEVudHJpZXMgfSkKICAgIGJ5dGVjIDkgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTExCiAgICAvLyB0aGlzLmVudHJpZXMoaWQpLnZhbHVlLmRpc3F1YWxpZmllZCA9IHRydWUKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDEKICAgIHNldGJpdAogICAgcHVzaGludCA1MCAvLyA1MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTAzCiAgICAvLyBnYXRlQ2hlY2soZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sIGFkZHJlc3M6IEFjY291bnQsIGFzc2V0OiB1aW50NjQpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgYnl0ZWMgMzcgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTA1CiAgICAvLyBjb25zdCBvcmlnaW4gPSBvcmlnaW5Pcih3YWxsZXQsIGFkZHJlc3MpCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6b3JpZ2luT3JAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZW50ZXJDb3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKZW50ZXJDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMjMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTI3CiAgICAvLyBsZXQgYm94TWJyOiB1aW50NjQgPSBlbnRyeU1CUiAqIGVudHJ5Q291bnQKICAgIGludGMgMTAgLy8gNTA2MDAKICAgICoKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHVuaXF1ZXMgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogUG9vbEdsb2JhbFN0YXRlS2V5VW5pcXVlcyB9KQogICAgYnl0ZWMgMjMgLy8gInUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTMwCiAgICAvLyBpZiAoIXRoaXMudW5pcXVlcyhhZGRyZXNzKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGVudGVyQ29zdF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTMxCiAgICAvLyBib3hNYnIgKz0gUG9vbFVuaXF1ZXNNQlIKICAgIGludGMgMTEgLy8gMTg5MDAKICAgICsKCmVudGVyQ29zdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEyMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMzkKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlYyA3IC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0MAogICAgLy8gcmV0dXJuIChHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAoMSArIGNvdW50KSkgKyAodGhpcy5yZXdhcmRzTWJyKFdpbm5lckNvdW50Q2FwKSAqIDIpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDIKICAgICsKICAgICoKICAgIHB1c2hpbnQgODAwMCAvLyA4MDAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5zaWduVXBzT3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpZ25VcHNPcGVuOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDcKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBQb29sU3RhdHVzRHJhZnQgJiYKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyBzdGF0dXMgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YXR1cz4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YXR1cyB9KQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ3CiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gUG9vbFN0YXR1c0RyYWZ0ICYmCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAweDAwCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDctMTE0OAogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlICYmCiAgICBieiBzaWduVXBzT3Blbl9ib29sX2ZhbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ4CiAgICAvLyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wID4gdGhpcy5zaWdudXBUaW1lc3RhbXAudmFsdWUgJiYKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyBzaWdudXBUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVNpZ251cFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMjQgLy8gInNpZ251cF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0OAogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlICYmCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDctMTE0OAogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlICYmCiAgICBieiBzaWduVXBzT3Blbl9ib29sX2ZhbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFydFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTYgLy8gInN0YXJ0X3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDwKICAgIGJueiBzaWduVXBzT3Blbl9ib29sX3RydWVANQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGFsbG93TGF0ZVNpZ251cHMgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWxsb3dMYXRlU2lnbnVwcyB9KQogICAgYnl0ZWMgMTUgLy8gImFsbG93X2xhdGVfc2lnbnVwcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IHNpZ25VcHNPcGVuX2Jvb2xfZmFsc2VANgoKc2lnblVwc09wZW5fYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKc2lnblVwc09wZW5fYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnNpZ25VcHNPcGVuX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHNpZ25VcHNPcGVuX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlW3JvdXRpbmddKCkgLT4gdm9pZDoKaXNMaXZlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzTGl2ZQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzRW50ZXJlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmlzRW50ZXJlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTY0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHVuaXF1ZXMgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogUG9vbEdsb2JhbFN0YXRlS2V5VW5pcXVlcyB9KQogICAgYnl0ZWMgMjMgLy8gInUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTY2CiAgICAvLyByZXR1cm4gdGhpcy51bmlxdWVzKGFkZHJlc3MpLmV4aXN0czsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNjQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmdldFN0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U3RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3MgogICAgLy8gc3RhdHVzOiB0aGlzLnN0YXR1cy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyBzdGF0dXMgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YXR1cz4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YXR1cyB9KQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTcyCiAgICAvLyBzdGF0dXM6IHRoaXMuc3RhdHVzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTczCiAgICAvLyB0aXRsZTogdGhpcy50aXRsZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyB0aXRsZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVRpdGxlIH0pCiAgICBieXRlYyAyOCAvLyAidGl0bGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3MwogICAgLy8gdGl0bGU6IHRoaXMudGl0bGUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzQKICAgIC8vIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3NAogICAgLy8gdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc1CiAgICAvLyBzaWdudXBUaW1lc3RhbXA6IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjAKICAgIC8vIHNpZ251cFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U2lnbnVwVGltZXN0YW1wIH0pCiAgICBieXRlYyAyNCAvLyAic2lnbnVwX3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc1CiAgICAvLyBzaWdudXBUaW1lc3RhbXA6IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc2CiAgICAvLyBhbGxvd0xhdGVTaWdudXBzOiB0aGlzLmFsbG93TGF0ZVNpZ251cHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzYKICAgIC8vIGFsbG93TGF0ZVNpZ251cHM6IHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3NwogICAgLy8gc3RhcnRUaW1lc3RhbXA6IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gc3RhcnRUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YXJ0VGltZXN0YW1wIH0pCiAgICBieXRlYyAxNiAvLyAic3RhcnRfdGltZXN0YW1wIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzcKICAgIC8vIHN0YXJ0VGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc4CiAgICAvLyBlbmRUaW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuZFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW5kVGltZXN0YW1wIH0pCiAgICBieXRlYyAxNyAvLyAiZW5kX3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc4CiAgICAvLyBlbmRUaW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc5CiAgICAvLyBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gbWF4RW50cmllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1heEVudHJpZXMgfSkKICAgIGJ5dGVjIDE4IC8vICJtYXhfZW50cmllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc5CiAgICAvLyBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODAKICAgIC8vIGVudHJ5Q291bnQ6ICh0aGlzLmVudHJ5SUQudmFsdWUgKyAxKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgwCiAgICAvLyBlbnRyeUNvdW50OiAodGhpcy5lbnRyeUlELnZhbHVlICsgMSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgxCiAgICAvLyByZXdhcmRDb3VudDogKHRoaXMucmV3YXJkSUQudmFsdWUgKyAxKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyByZXdhcmRJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5UmV3YXJkQ291bnQgfSkKICAgIGJ5dGVjIDI1IC8vICJyZXdhcmRfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4MQogICAgLy8gcmV3YXJkQ291bnQ6ICh0aGlzLnJld2FyZElELnZhbHVlICsgMSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgyCiAgICAvLyB0b3RhbFN0YWtlZDogdGhpcy50b3RhbFN0YWtlZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyB0b3RhbFN0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VG90YWxTdGFrZWQgfSkKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9zdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4MgogICAgLy8gdG90YWxTdGFrZWQ6IHRoaXMudG90YWxTdGFrZWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODMKICAgIC8vIHN0YWtlS2V5OiB0aGlzLnN0YWtlS2V5LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIHN0YWtlS2V5ID0gR2xvYmFsU3RhdGU8Um9vdEtleT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YWtlS2V5IH0pCiAgICBieXRlYyAyNiAvLyAic3Rha2Vfa2V5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODMKICAgIC8vIHN0YWtlS2V5OiB0aGlzLnN0YWtlS2V5LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg0CiAgICAvLyBtaW5pbXVtU3Rha2VBbW91bnQ6IHRoaXMubWluaW11bVN0YWtlQW1vdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIG1pbmltdW1TdGFrZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1pbmltdW1TdGFrZUFtb3VudCB9KQogICAgYnl0ZWMgMjkgLy8gIm1pbmltdW1fc3Rha2VfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODQKICAgIC8vIG1pbmltdW1TdGFrZUFtb3VudDogdGhpcy5taW5pbXVtU3Rha2VBbW91bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODUKICAgIC8vIGdhdGVJRDogdGhpcy5nYXRlSUQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMiAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg1CiAgICAvLyBnYXRlSUQ6IHRoaXMuZ2F0ZUlELnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg2CiAgICAvLyBjcmVhdG9yOiB0aGlzLmNyZWF0b3IudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlDcmVhdG9yIH0pCiAgICBieXRlYyAxMSAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg2CiAgICAvLyBjcmVhdG9yOiB0aGlzLmNyZWF0b3IudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzEtMTE4NwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgc3RhdHVzOiB0aGlzLnN0YXR1cy52YWx1ZSwKICAgIC8vICAgdGl0bGU6IHRoaXMudGl0bGUudmFsdWUsCiAgICAvLyAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vICAgc2lnbnVwVGltZXN0YW1wOiB0aGlzLnNpZ251cFRpbWVzdGFtcC52YWx1ZSwKICAgIC8vICAgYWxsb3dMYXRlU2lnbnVwczogdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlLAogICAgLy8gICBzdGFydFRpbWVzdGFtcDogdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSwKICAgIC8vICAgZW5kVGltZXN0YW1wOiB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSwKICAgIC8vICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLnZhbHVlLAogICAgLy8gICBlbnRyeUNvdW50OiAodGhpcy5lbnRyeUlELnZhbHVlICsgMSksCiAgICAvLyAgIHJld2FyZENvdW50OiAodGhpcy5yZXdhcmRJRC52YWx1ZSArIDEpLAogICAgLy8gICB0b3RhbFN0YWtlZDogdGhpcy50b3RhbFN0YWtlZC52YWx1ZSwKICAgIC8vICAgc3Rha2VLZXk6IHRoaXMuc3Rha2VLZXkudmFsdWUsCiAgICAvLyAgIG1pbmltdW1TdGFrZUFtb3VudDogdGhpcy5taW5pbXVtU3Rha2VBbW91bnQudmFsdWUsCiAgICAvLyAgIGdhdGVJRDogdGhpcy5nYXRlSUQudmFsdWUsCiAgICAvLyAgIGNyZWF0b3I6IHRoaXMuY3JlYXRvci52YWx1ZSwKICAgIC8vIH0KICAgIGRpZyAxMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBwdXNoYnl0ZXMgMHgwMDZmCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTExIC8vIDExMQogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAxNAogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNjkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VGZWVHZW5lcmF0b3JDb250cmFjdC51cGRhdGVBa2l0YURBT0VzY3Jvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM3CiAgICAvLyB1cGRhdGVBa2l0YURBT0VzY3JvdyhhcHA6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDcgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFwcAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coYXBwOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBieXRlYyAyMCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQKICAgIC8vIGNvbnN0IFtwbHVnaW5BcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUGx1Z2luQXBwTGlzdCkpCiAgICBieXRlYyAzNiAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTIKICAgIC8vIGFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhcHAgdXBncmFkZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIHB1c2hieXRlcyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjUzCiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSBuZXdWZXJzaW9uCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VDb250cmFjdC51cGRhdGVBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6OkJhc2VTdGFraW5nUG9vbC5tYnJbcm91dGluZ10oKSAtPiB2b2lkOgptYnI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czo5CiAgICAvLyByZXR1cm4gTWluUG9vbFJld2FyZHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiB3aW5uaW5nVGlja2V0cykKICAgIGludGMgNiAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czoxNS0yMQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZW50cmllczogUG9vbEVudHJpZXNNQlIsCiAgICAvLyAgIHVuaXF1ZXM6IFBvb2xVbmlxdWVzTUJSLAogICAgLy8gICBlbnRyaWVzQnlBZGRyZXNzOiBQb29sRW50cmllc0J5QWRkcmVzc01CUiwKICAgIC8vICAgcmV3YXJkczogdGhpcy5yZXdhcmRzTWJyKHdpbm5pbmdUaWNrZXRzKSwKICAgIC8vICAgZGlzYnVyc2VtZW50czogUG9vbERpc2J1cnNlbWVudFNNQlIKICAgIC8vIH0KICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDYyZDQwMDAwMDAwMDAwMDA0OWQ0MDAwMDAwMDAwMDAwNjJkNAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MjAKICAgIC8vIGRpc2J1cnNlbWVudHM6IFBvb2xEaXNidXJzZW1lbnRTTUJSCiAgICBwdXNoaW50IDYxMDAgLy8gNjEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjE1LTIxCiAgICAvLyByZXR1cm4gewogICAgLy8gICBlbnRyaWVzOiBQb29sRW50cmllc01CUiwKICAgIC8vICAgdW5pcXVlczogUG9vbFVuaXF1ZXNNQlIsCiAgICAvLyAgIGVudHJpZXNCeUFkZHJlc3M6IFBvb2xFbnRyaWVzQnlBZGRyZXNzTUJSLAogICAgLy8gICByZXdhcmRzOiB0aGlzLnJld2FyZHNNYnIod2lubmluZ1RpY2tldHMpLAogICAgLy8gICBkaXNidXJzZW1lbnRzOiBQb29sRGlzYnVyc2VtZW50U01CUgogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuY2hlY2tCeUlEKGlkOiB1aW50NjQpIC0+IGJ5dGVzOgpjaGVja0J5SUQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDg3CiAgICAvLyBwcml2YXRlIGNoZWNrQnlJRChpZDogdWludDY0KTogeyB2YWxpZDogYm9vbGVhbiwgYmFsYW5jZTogdWludDY0IH0gewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gdGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FIHx8IHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFULAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfTk9ORSB8fCB0aGlzLnR5cGUudmFsdWUgIT09IFBPT0xfU1RBS0lOR19UWVBFX0hFQVJUQkVBVCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vIDB4MDAKICAgICE9CiAgICBibnogY2hlY2tCeUlEX2Jvb2xfdHJ1ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3Rha2luZ1R5cGU+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlUeXBlIH0pCiAgICBieXRlYyA0IC8vICJ0eXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gdGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FIHx8IHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFULAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwYQogICAgIT0KICAgIGJ6IGNoZWNrQnlJRF9ib29sX2ZhbHNlQDMKCmNoZWNrQnlJRF9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpjaGVja0J5SURfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ4OC00OTEKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FIHx8IHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFULAogICAgLy8gICBFUlJfSU5WQUxJRF9QT09MX1RZUEVfRk9SX0NIRUNLCiAgICAvLyApCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwb29sIHR5cGUgZm9yIGNoZWNrCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDkzCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcywgYXNzZXQsIHF1YW50aXR5IH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0OTMKICAgIC8vIGNvbnN0IHsgZGlzcXVhbGlmaWVkLCBhZGRyZXNzLCBhc3NldCwgcXVhbnRpdHkgfSA9IHRoaXMuZW50cmllcyhpZCkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9idXJ5IDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIHN3YXAKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDk1CiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBieiBjaGVja0J5SURfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyByZXR1cm4geyB2YWxpZDogZmFsc2UsIGJhbGFuY2U6IDAgfQogICAgYnl0ZWMgMzkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjaGVja0J5SURfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ5OQogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfU09GVCkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0OTkKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyAxMyAvLyAweDE0CiAgICA9PQogICAgYnogY2hlY2tCeUlEX2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUwMC01MDMKICAgIC8vIGNvbnN0IGNoZWNrID0gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZy5wcm90b3R5cGUuc29mdENoZWNrPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIC8vICAgYXJnczogW2FkZHJlc3MsIGFzc2V0XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTAwLTUwMwogICAgLy8gY29uc3QgY2hlY2sgPSBhYmlDYWxsPHR5cGVvZiBTdGFraW5nLnByb3RvdHlwZS5zb2Z0Q2hlY2s+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbYWRkcmVzcywgYXNzZXRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDQ4NzE2ZjFhIC8vIG1ldGhvZCAic29mdENoZWNrKGFkZHJlc3MsdWludDY0KShib29sLHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGJvb2wxLHVpbnQ2NCkKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTA1CiAgICAvLyBpZiAoY2hlY2suYmFsYW5jZSA+PSBxdWFudGl0eSkgewogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICBmcmFtZV9kaWcgNAogICAgPj0KICAgIGJ6IGNoZWNrQnlJRF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTA2CiAgICAvLyByZXR1cm4geyB2YWxpZDogdHJ1ZSwgYmFsYW5jZTogY2hlY2suYmFsYW5jZSB9CiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2hlY2tCeUlEX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTI1CiAgICAvLyB0aGlzLmVudHJpZXMoaWQpLnZhbHVlLmRpc3F1YWxpZmllZCA9IHRydWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAxCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTI2CiAgICAvLyByZXR1cm4geyB2YWxpZDogZmFsc2UsIGJhbGFuY2U6IDAgfQogICAgYnl0ZWMgMzkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjaGVja0J5SURfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUwOS01MTgKICAgIC8vIGNvbnN0IGluZm8gPSBhYmlDYWxsPHR5cGVvZiBTdGFraW5nLnByb3RvdHlwZS5nZXRJbmZvPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGFkZHJlc3MsCiAgICAvLyAgICAgewogICAgLy8gICAgICAgYXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgLy8gICAgIH0sCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MTAKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MTUKICAgIC8vIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTEzLTUxNgogICAgLy8gewogICAgLy8gICBhc3NldDogYXNzZXQsCiAgICAvLyAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vIH0sCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTA5LTUxOAogICAgLy8gY29uc3QgaW5mbyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEluZm8+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgICB7CiAgICAvLyAgICAgICBhc3NldDogYXNzZXQsCiAgICAvLyAgICAgICB0eXBlOiB0aGlzLnR5cGUudmFsdWUsCiAgICAvLyAgICAgfSwKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyA0MCAvLyBtZXRob2QgImdldEluZm8oYWRkcmVzcywodWludDY0LHVpbnQ4KSkodWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgbGVuCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAodWludDY0LHVpbnQ2NCx1aW50NjQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUyMAogICAgLy8gaWYgKGluZm8uYW1vdW50ID49IHF1YW50aXR5KSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2RpZyA0CiAgICA+PQogICAgYnogY2hlY2tCeUlEX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MjEKICAgIC8vIHJldHVybiB7IHZhbGlkOiB0cnVlLCBiYWxhbmNlOiBpbmZvLmFtb3VudCB9CiAgICBmcmFtZV9kaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2hlY2tCeUlEX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNoZWNrQnlJRF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGRpc2J1cnNlbWVudElEOiB1aW50NjQsIGFzc2V0OiB1aW50NjQsIGFsbG9jYXRpb25zOiBieXRlcywgc3VtOiB1aW50NjQpIC0+IGJ5dGVzOgpjcmVhdGVSZXdhcmRBbGxvY2F0aW9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NzctNTgyCiAgICAvLyBwcml2YXRlIGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKAogICAgLy8gICBkaXNidXJzZW1lbnRJRDogdWludDY0LAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSwKICAgIC8vICAgc3VtOiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg0CiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg0CiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU4NAogICAgLy8gY29uc3QgcmV3YXJkc0FwcCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5yZXdhcmRzKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjU1CiAgICAvLyByZXR1cm4gVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDI1MzAwIC8vIDI1MzAwCiAgICAqCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg3CiAgICAvLyBpZiAoYXNzZXQgPT09IDApIHsKICAgIGZyYW1lX2RpZyAtMwogICAgYm56IGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zX2Vsc2VfYm9keUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg5LTU5OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlVXNlckFsbG9jYXRpb25zPih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCArIHN1bSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBkaXNidXJzZW1lbnRJRCwKICAgIC8vICAgICBhbGxvY2F0aW9ucywKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTkzCiAgICAvLyByZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyBhbW91bnQ6IG1ickFtb3VudCArIHN1bSwKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTkyLTU5NQogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQgKyBzdW0sCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1ODktNTk5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVVc2VyQWxsb2NhdGlvbnM+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50ICsgc3VtLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGRpc2J1cnNlbWVudElELAogICAgLy8gICAgIGFsbG9jYXRpb25zLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gZGlzYnVyc2VtZW50SUQsCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1ODktNTk5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVVc2VyQWxsb2NhdGlvbnM+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50ICsgc3VtLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGRpc2J1cnNlbWVudElELAogICAgLy8gICAgIGFsbG9jYXRpb25zLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDU2NTZhY2Y5IC8vIG1ldGhvZCAiY3JlYXRlVXNlckFsbG9jYXRpb25zKHBheSx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHJldHN1YgoKY3JlYXRlUmV3YXJkQWxsb2NhdGlvbnNfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjAyLTYxNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zPih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBzdW0sCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgZGlzYnVyc2VtZW50SUQsCiAgICAvLyAgICAgYWxsb2NhdGlvbnMsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYwNgogICAgLy8gcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjA1LTYwOAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2MDktNjEzCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBzdW0sCiAgICAvLyB9KSwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYxMAogICAgLy8gYXNzZXRSZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYwOS02MTMKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHN1bSwKICAgIC8vIH0pLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYwMi02MTcKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9ucz4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogc3VtLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGRpc2J1cnNlbWVudElELAogICAgLy8gICAgIGFsbG9jYXRpb25zLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gZGlzYnVyc2VtZW50SUQsCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2MDItNjE3CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnM+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IHN1bSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBkaXNidXJzZW1lbnRJRCwKICAgIC8vICAgICBhbGxvY2F0aW9ucywKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgzYzYwZGZhMCAvLyBtZXRob2QgImNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9ucyhwYXksYXhmZXIsdWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zX2FmdGVyX2lmX2Vsc2VAMTAKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZVBvb2xFbnRyaWVzKHBheW1lbnQ6IHVpbnQ2NCwgZW50cmllczogYnl0ZXMsIGdhdGVBcmdzOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpjcmVhdGVQb29sRW50cmllczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NTgKICAgIC8vIHByaXZhdGUgY3JlYXRlUG9vbEVudHJpZXMocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBlbnRyaWVzOiBTdGFrZUVudHJ5W10sIGdhdGVBcmdzOiBHYXRlQXJncyk6IHZvaWQgewogICAgcHJvdG8gMyAyCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY1OQogICAgLy8gYXNzZXJ0KHRoaXMuaXNMaXZlKCksICd0aGUgcG9vbCBpcyBub3QgbGl2ZScpCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlCiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgaXMgbm90IGxpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjIKICAgIC8vICh0aGlzLmVudHJ5SUQudmFsdWUgKyAxKSA8PSB0aGlzLm1heEVudHJpZXMudmFsdWUgfHwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjIKICAgIC8vICh0aGlzLmVudHJ5SUQudmFsdWUgKyAxKSA8PSB0aGlzLm1heEVudHJpZXMudmFsdWUgfHwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjgKICAgIC8vIG1heEVudHJpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlNYXhFbnRyaWVzIH0pCiAgICBieXRlYyAxOCAvLyAibWF4X2VudHJpZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjYyCiAgICAvLyAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjItNjYzCiAgICAvLyAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICAvLyB0aGlzLm1heEVudHJpZXMudmFsdWUgPT09IDAsCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF90cnVlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjMKICAgIC8vIHRoaXMubWF4RW50cmllcy52YWx1ZSA9PT0gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBtYXhFbnRyaWVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWF4RW50cmllcyB9KQogICAgYnl0ZWMgMTggLy8gIm1heF9lbnRyaWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY2MwogICAgLy8gdGhpcy5tYXhFbnRyaWVzLnZhbHVlID09PSAwLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjItNjYzCiAgICAvLyAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICAvLyB0aGlzLm1heEVudHJpZXMudmFsdWUgPT09IDAsCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAzCgpjcmVhdGVQb29sRW50cmllc19ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpjcmVhdGVQb29sRW50cmllc19ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjYxLTY2NQogICAgLy8gYXNzZXJ0KAogICAgLy8gICAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICAvLyAgIHRoaXMubWF4RW50cmllcy52YWx1ZSA9PT0gMCwKICAgIC8vICAgJ3Bvb2wgaGFzIHJlYWNoZWQgbWF4aW11bSBlbnRyaWVzJwogICAgLy8gKQogICAgYXNzZXJ0IC8vIHBvb2wgaGFzIHJlYWNoZWQgbWF4aW11bSBlbnRyaWVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IGVudHJ5TUJSICogZW50cmllcy5sZW5ndGgKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgaW50YyAxMCAvLyA1MDYwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBieXRlYyAyMyAvLyAidSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NzAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NzAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyB0b3RhbCArPSBQb29sVW5pcXVlc01CUgogICAgaW50YyAxMSAvLyAxODkwMAogICAgKwoKY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY3NC02ODEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogeyBncmVhdGVyVGhhbkVxOiB0b3RhbCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY3NC02ODEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogeyBncmVhdGVyVGhhbkVxOiB0b3RhbCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjgzCiAgICAvLyBjb25zdCB7IGFkZHJlc3MsIG5hbWUgfSA9IHRoaXMuc3Rha2VLZXkudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBzdGFrZUtleSA9IEdsb2JhbFN0YXRlPFJvb3RLZXk+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFrZUtleSB9KQogICAgYnl0ZWMgMjYgLy8gInN0YWtlX2tleSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2ODMKICAgIC8vIGNvbnN0IHsgYWRkcmVzcywgbmFtZSB9ID0gdGhpcy5zdGFrZUtleS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmNyZWF0ZVBvb2xFbnRyaWVzX3doaWxlX3RvcEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfd2hpbGVAMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2ODYKICAgIC8vIGFzc2VydChlbnRyaWVzW2ldLnF1YW50aXR5ID49IHRoaXMubWluaW11bVN0YWtlQW1vdW50LnZhbHVlLCAncXVhbnRpdHkgaXMgbGVzcyB0aGFuIG1pbmltdW0gc3Rha2UgYW1vdW50JykKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICBmcmFtZV9kaWcgMwogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIG1pbmltdW1TdGFrZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1pbmltdW1TdGFrZUFtb3VudCB9KQogICAgYnl0ZWMgMjkgLy8gIm1pbmltdW1fc3Rha2VfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4NgogICAgLy8gYXNzZXJ0KGVudHJpZXNbaV0ucXVhbnRpdHkgPj0gdGhpcy5taW5pbXVtU3Rha2VBbW91bnQudmFsdWUsICdxdWFudGl0eSBpcyBsZXNzIHRoYW4gbWluaW11bSBzdGFrZSBhbW91bnQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gcXVhbnRpdHkgaXMgbGVzcyB0aGFuIG1pbmltdW0gc3Rha2UgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Njg4CiAgICAvLyBpZiAoYWRkcmVzcyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4OS02OTgKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoaXRvYihlbnRyaWVzW2ldLmFzc2V0KSkpLAogICAgLy8gICAgIGVudHJpZXNbaV0ucHJvb2YsCiAgICAvLyAgICAgTUVSS0xFX1RSRUVfVFlQRV9BU1NFVCwKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjkwCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY5MAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjkwCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2OTQKICAgIC8vIHNoYTI1NihzaGEyNTYoaXRvYihlbnRyaWVzW2ldLmFzc2V0KSkpLAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHNoYTI1NgogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Njk1CiAgICAvLyBlbnRyaWVzW2ldLnByb29mLAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2OTYKICAgIC8vIE1FUktMRV9UUkVFX1RZUEVfQVNTRVQsCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4OS02OTgKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoaXRvYihlbnRyaWVzW2ldLmFzc2V0KSkpLAogICAgLy8gICAgIGVudHJpZXNbaV0ucHJvb2YsCiAgICAvLyAgICAgTUVSS0xFX1RSRUVfVFlQRV9BU1NFVCwKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHgyYmYzY2M1YSAvLyBtZXRob2QgInZlcmlmeShhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NClib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyBhc3NlcnQodmVyaWZpZWQsICdmYWlsZWQgdG8gdmVyaWZ5IHN0YWtlIHJlcXVpcmVtZW50cycpCiAgICBhc3NlcnQgLy8gZmFpbGVkIHRvIHZlcmlmeSBzdGFrZSByZXF1aXJlbWVudHMKCmNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzA1CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX0hFQVJUQkVBVCB8fAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MDUKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUIHx8CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDBhCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcwNS03MDYKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUIHx8CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGJueiBjcmVhdGVQb29sRW50cmllc19pZl9ib2R5QDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzA2CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzA2CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyAxMyAvLyAweDE0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcwNS03MDYKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUIHx8CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGJ6IGNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMjEKCmNyZWF0ZVBvb2xFbnRyaWVzX2lmX2JvZHlAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzEwCiAgICAvLyBpZiAoZW50cmllc1tpXS5hc3NldCAhPT0gMCkgewogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGJ6IGNyZWF0ZVBvb2xFbnRyaWVzX2Vsc2VfYm9keUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcxMQogICAgLy8gKFtiYWxhbmNlLCBvcHRlZEluXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoVHhuLnNlbmRlciwgZW50cmllc1tpXS5hc3NldCkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgNwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKCmNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzE2CiAgICAvLyBhc3NlcnQob3B0ZWRJbiAmJiBiYWxhbmNlID49IGVudHJpZXNbaV0ucXVhbnRpdHksICd1c2VyIGRvZXMgbm90IGhhdmUgbWluIGJhbGFuY2UnKQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAxOQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA+PQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAxOQogICAgaW50Y18xIC8vIDEKCmNyZWF0ZVBvb2xFbnRyaWVzX2Jvb2xfbWVyZ2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzE2CiAgICAvLyBhc3NlcnQob3B0ZWRJbiAmJiBiYWxhbmNlID49IGVudHJpZXNbaV0ucXVhbnRpdHksICd1c2VyIGRvZXMgbm90IGhhdmUgbWluIGJhbGFuY2UnKQogICAgYXNzZXJ0IC8vIHVzZXIgZG9lcyBub3QgaGF2ZSBtaW4gYmFsYW5jZQoKY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjAKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgIT09IFBPT0xfU1RBS0lOR19UWVBFX05PTkUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzIwCiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAweDAwCiAgICAhPQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcyMS03MzAKICAgIC8vIGNvbnN0IHN0YWtlSW5mbyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEluZm8+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICB7CiAgICAvLyAgICAgICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgICAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vICAgICB9LAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzIyCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjQKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzI2CiAgICAvLyBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDAgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcyNwogICAgLy8gdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzI1LTcyOAogICAgLy8gewogICAgLy8gICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgLy8gfSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcyMS03MzAKICAgIC8vIGNvbnN0IHN0YWtlSW5mbyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEluZm8+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICB7CiAgICAvLyAgICAgICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgICAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vICAgICB9LAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDQwIC8vIG1ldGhvZCAiZ2V0SW5mbyhhZGRyZXNzLCh1aW50NjQsdWludDgpKSh1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgcHVzaGludCAyNCAvLyAyNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgcHVzaGludCA0IC8vIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MzIKICAgIC8vIGFzc2VydChzdGFrZUluZm8uYW1vdW50ID49IGVudHJpZXNbaV0ucXVhbnRpdHksICd1c2VyIGRvZXMgbm90IGhhdmUgZW5vdWdoIHN0YWtlZCcpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDYKICAgID49CiAgICBhc3NlcnQgLy8gdXNlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBzdGFrZWQKCmNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBjb25zdCBpZCA9IHRoaXMuZW50cnlJRC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gY29uc3QgaWQgPSB0aGlzLmVudHJ5SUQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyB0aGlzLmVudHJ5SUQudmFsdWUgKz0gMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyB0aGlzLmVudHJ5SUQudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MzcKICAgIC8vIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzM2LTc0MgogICAgLy8gdGhpcy5lbnRyaWVzKGVudHJ5SUQpLnZhbHVlID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgcXVhbnRpdHk6IGVudHJpZXNbaV0ucXVhbnRpdHksCiAgICAvLyAgIGdhdGVBcmdzOiBjbG9uZShnYXRlQXJncyksCiAgICAvLyAgIGRpc3F1YWxpZmllZDogZmFsc2UKICAgIC8vIH0KICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAzMzAwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzM2CiAgICAvLyB0aGlzLmVudHJpZXMoZW50cnlJRCkudmFsdWUgPSB7CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MzYtNzQyCiAgICAvLyB0aGlzLmVudHJpZXMoZW50cnlJRCkudmFsdWUgPSB7CiAgICAvLyAgIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0OiBlbnRyaWVzW2ldLmFzc2V0LAogICAgLy8gICBxdWFudGl0eTogZW50cmllc1tpXS5xdWFudGl0eSwKICAgIC8vICAgZ2F0ZUFyZ3M6IGNsb25lKGdhdGVBcmdzKSwKICAgIC8vICAgZGlzcXVhbGlmaWVkOiBmYWxzZQogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc0NQogICAgLy8gYWRkcmVzczogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NDQtNzQ3CiAgICAvLyBjb25zdCBhS2V5ID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vIH0KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzQ5CiAgICAvLyB0aGlzLmVudHJpZXNCeUFkZHJlc3MoYUtleSkudmFsdWUgPSBlbnRyeUlECiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgZXh0cmFjdCAzMiA4CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGVudHJpZXNCeUFkZHJlc3MgPSBCb3hNYXA8RW50cnlLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzQnlBZGRyZXNzIH0pCiAgICBieXRlYyAzMCAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc0OQogICAgLy8gdGhpcy5lbnRyaWVzQnlBZGRyZXNzKGFLZXkpLnZhbHVlID0gZW50cnlJRAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBieXRlYyAyMyAvLyAidSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NTAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NTAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfd2hpbGVfdG9wQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHVuaXF1ZXMgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogUG9vbEdsb2JhbFN0YXRlS2V5VW5pcXVlcyB9KQogICAgYnl0ZWMgMjMgLy8gInUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzUxCiAgICAvLyB0aGlzLnVuaXF1ZXMoVHhuLnNlbmRlcikudmFsdWUgPSBlbnRyaWVzLmxlbmd0aCAgLy8gb3IgYW55IG5vbi16ZXJvIHZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY0CiAgICAvLyB1bmlxdWVzID0gQm94TWFwPEFjY291bnQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xHbG9iYWxTdGF0ZUtleVVuaXF1ZXMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc1MQogICAgLy8gdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLnZhbHVlID0gZW50cmllcy5sZW5ndGggIC8vIG9yIGFueSBub24temVybyB2YWx1ZQogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIGIgY3JlYXRlUG9vbEVudHJpZXNfd2hpbGVfdG9wQDcKCmNyZWF0ZVBvb2xFbnRyaWVzX2Jvb2xfZmFsc2VAMTk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVQb29sRW50cmllc19ib29sX21lcmdlQDIwCgpjcmVhdGVQb29sRW50cmllc19lbHNlX2JvZHlAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzEzCiAgICAvLyBvcHRlZEluID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MTQKICAgIC8vIGJhbGFuY2UgPSBUeG4uc2VuZGVyLmJhbGFuY2UKICAgIHR4biBTZW5kZXIKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGIgY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAxNgoKY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfd2hpbGVAMjc6CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmQocGF5bWVudDogdWludDY0LCByZXdhcmQ6IGJ5dGVzKSAtPiBieXRlczoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODY5CiAgICAvLyBhZGRSZXdhcmQocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCByZXdhcmQ6IEFkZFJld2FyZFBhcmFtcyk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCBFUlJfRk9SQklEREVOKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5Q3JlYXRvciB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCBFUlJfRk9SQklEREVOKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcxCiAgICAvLyBpZiAoVHhuLmFwcGxpY2F0aW9uQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5hZGRSZXdhcmQpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgdHhuYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAzMiAvLyBtZXRob2QgImFkZFJld2FyZChwYXksKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcyCiAgICAvLyBhc3NlcnQocmV3YXJkLmFzc2V0ID09PSAwLCBFUlJfTk9UX0FMR08pCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgIQogICAgYXNzZXJ0IC8vIE11c3QgYmUgYW4gQWxnbyBhc3NldAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYzNwogICAgLy8gdGhpcy5zdGFrZUtleS52YWx1ZS5hZGRyZXNzICE9PSBHbG9iYWwuemVyb0FkZHJlc3MgfHwgcmV3YXJkLmRpc3RyaWJ1dGlvbiAhPT0gRGlzdHJpYnV0aW9uVHlwZVBlcmNlbnRhZ2UsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gc3Rha2VLZXkgPSBHbG9iYWxTdGF0ZTxSb290S2V5Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3Rha2VLZXkgfSkKICAgIGJ5dGVjIDI2IC8vICJzdGFrZV9rZXkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjM3CiAgICAvLyB0aGlzLnN0YWtlS2V5LnZhbHVlLmFkZHJlc3MgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyB8fCByZXdhcmQuZGlzdHJpYnV0aW9uICE9PSBEaXN0cmlidXRpb25UeXBlUGVyY2VudGFnZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJueiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX3RydWVAOQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDggMQogICAgYnl0ZWMgOCAvLyAweDBhCiAgICAhPQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAxMAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF90cnVlQDk6CiAgICBpbnRjXzEgLy8gMQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9tZXJnZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2MzYtNjM5CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuc3Rha2VLZXkudmFsdWUuYWRkcmVzcyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzIHx8IHJld2FyZC5kaXN0cmlidXRpb24gIT09IERpc3RyaWJ1dGlvblR5cGVQZXJjZW50YWdlLAogICAgLy8gICBFUlJfU1RBS0VfS0VZX1JFUVVJUkVECiAgICAvLyApCiAgICBhc3NlcnQgLy8gU3Rha2Uga2V5IHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyBpZiAocmV3YXJkLmRpc3RyaWJ1dGlvbiA9PT0gRGlzdHJpYnV0aW9uVHlwZVNodWZmbGUpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoYnl0ZXMgMHgyOAogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIGFzc2VydChyZXdhcmQucmF0ZSA+IHJld2FyZC53aW5uZXJDb3VudCAmJiByZXdhcmQud2lubmVyQ291bnQgPD0gV2lubmVyQ291bnRDYXAsIEVSUl9SQVRFX01VU1RfQkVfR1JFQVRFUl9USEFOX1dJTk5FUl9DT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMgLy8gMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAxNQogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIDw9CiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX2ZhbHNlQDE1CiAgICBpbnRjXzEgLy8gMQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9tZXJnZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIGFzc2VydChyZXdhcmQucmF0ZSA+IHJld2FyZC53aW5uZXJDb3VudCAmJiByZXdhcmQud2lubmVyQ291bnQgPD0gV2lubmVyQ291bnRDYXAsIEVSUl9SQVRFX01VU1RfQkVfR1JFQVRFUl9USEFOX1dJTk5FUl9DT1VOVCkKICAgIGFzc2VydCAvLyBSYXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHdpbm5lciBjb3VudAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDcKICAgIC8vIGlmIChyZXdhcmQuZGlzdHJpYnV0aW9uID09PSBEaXN0cmlidXRpb25UeXBlRXZlbikgewogICAgZnJhbWVfZGlnIDAKICAgIGJ5dGVjIDE0IC8vIDB4MWUKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjQ4CiAgICAvLyBhc3NlcnQodGhpcy5tYXhFbnRyaWVzLnZhbHVlID09PSAwIHx8IHRoaXMubWF4RW50cmllcy52YWx1ZSA8PSByZXdhcmQucmF0ZSwgRVJSX01BWF9FTlRSSUVTX0NBTk5PVF9CRV9HUkVBVEVSX1RIQU5fUkFURSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBtYXhFbnRyaWVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWF4RW50cmllcyB9KQogICAgYnl0ZWMgMTggLy8gIm1heF9lbnRyaWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY0OAogICAgLy8gYXNzZXJ0KHRoaXMubWF4RW50cmllcy52YWx1ZSA9PT0gMCB8fCB0aGlzLm1heEVudHJpZXMudmFsdWUgPD0gcmV3YXJkLnJhdGUsIEVSUl9NQVhfRU5UUklFU19DQU5OT1RfQkVfR1JFQVRFUl9USEFOX1JBVEUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF90cnVlQDIwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gbWF4RW50cmllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1heEVudHJpZXMgfSkKICAgIGJ5dGVjIDE4IC8vICJtYXhfZW50cmllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDgKICAgIC8vIGFzc2VydCh0aGlzLm1heEVudHJpZXMudmFsdWUgPT09IDAgfHwgdGhpcy5tYXhFbnRyaWVzLnZhbHVlIDw9IHJld2FyZC5yYXRlLCBFUlJfTUFYX0VOVFJJRVNfQ0FOTk9UX0JFX0dSRUFURVJfVEhBTl9SQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAyMQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2Jvb2xfbWVyZ2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjQ4CiAgICAvLyBhc3NlcnQodGhpcy5tYXhFbnRyaWVzLnZhbHVlID09PSAwIHx8IHRoaXMubWF4RW50cmllcy52YWx1ZSA8PSByZXdhcmQucmF0ZSwgRVJSX01BWF9FTlRSSUVTX0NBTk5PVF9CRV9HUkVBVEVSX1RIQU5fUkFURSkKICAgIGFzc2VydCAvLyBNYXggZW50cmllcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHJhdGUKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjUxCiAgICAvLyBhc3NlcnQocmV3YXJkLnJhdGUgPiAwLCBFUlJfUkFURV9NVVNUX0JFX0dSRUFURVJfVEhBTl9aRVJPKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDkgLy8gOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYXNzZXJ0IC8vIFJhdGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg3Ny04ODYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogewogICAgLy8gICAgICAgZ3JlYXRlclRoYW5FcTogdGhpcy5yZXdhcmRzTWJyKHJld2FyZC53aW5uZXJDb3VudCkKICAgIC8vICAgICB9CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4ODAKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODc3LTg4NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB7CiAgICAvLyAgICAgICBncmVhdGVyVGhhbkVxOiB0aGlzLnJld2FyZHNNYnIocmV3YXJkLndpbm5lckNvdW50KQogICAgLy8gICAgIH0KICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODgyCiAgICAvLyBncmVhdGVyVGhhbkVxOiB0aGlzLnJld2FyZHNNYnIocmV3YXJkLndpbm5lckNvdW50KQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzIC8vIDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjkKICAgIC8vIHJldHVybiBNaW5Qb29sUmV3YXJkc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIHdpbm5pbmdUaWNrZXRzKQogICAgaW50YyA2IC8vIDQwMAogICAgZGlnIDEKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NzctODg2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHsKICAgIC8vICAgICAgIGdyZWF0ZXJUaGFuRXE6IHRoaXMucmV3YXJkc01icihyZXdhcmQud2lubmVyQ291bnQpCiAgICAvLyAgICAgfQogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIDw9CiAgICB1bmNvdmVyIDIKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBjb25zdCBpZCA9IHRoaXMucmV3YXJkSUQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyByZXdhcmRJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5UmV3YXJkQ291bnQgfSkKICAgIGJ5dGVjIDI1IC8vICJyZXdhcmRfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBjb25zdCBpZCA9IHRoaXMucmV3YXJkSUQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLnJld2FyZElELnZhbHVlICs9IDEKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJld2FyZElEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlSZXdhcmRDb3VudCB9KQogICAgYnl0ZWMgMjUgLy8gInJld2FyZF9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMucmV3YXJkSUQudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4OTAKICAgIC8vIC4uLmNsb25lKHJld2FyZCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMTcgOAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4OTMKICAgIC8vIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODg5LTkwNQogICAgLy8gdGhpcy5yZXdhcmRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgLi4uY2xvbmUocmV3YXJkKSwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2VyczogMCwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2U6IDAsCiAgICAvLyAgIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIC8vICAgcmFmZmxlQ3Vyc29yOiB7CiAgICAvLyAgICAgdGlja2V0OiAwLAogICAgLy8gICAgIHN0YWtlOiAwLAogICAgLy8gICAgIGRpc2J1cnNlZDogMAogICAgLy8gICB9LAogICAgLy8gICB2cmZGYWlsdXJlQ291bnQ6IDAsCiAgICAvLyAgIHBoYXNlOiBEaXNidXJzZW1lbnRQaGFzZUlkbGUsCiAgICAvLyAgIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIC8vICAgYWN0aXZlRGlzYnVyc2VtZW50SUQ6IDAsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudFJvdW5kU3RhcnQ6IDAsCiAgICAvLyAgIGxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXA6IDAKICAgIC8vIH0KICAgIHVuY292ZXIgMwogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkwMAogICAgLy8gcGhhc2U6IERpc2J1cnNlbWVudFBoYXNlSWRsZSwKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg4OS05MDUKICAgIC8vIHRoaXMucmV3YXJkcyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIC4uLmNsb25lKHJld2FyZCksCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlcnM6IDAsCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlOiAwLAogICAgLy8gICB3aW5uaW5nVGlja2V0czogW10gYXMgdWludDY0W10sCiAgICAvLyAgIHJhZmZsZUN1cnNvcjogewogICAgLy8gICAgIHRpY2tldDogMCwKICAgIC8vICAgICBzdGFrZTogMCwKICAgIC8vICAgICBkaXNidXJzZWQ6IDAKICAgIC8vICAgfSwKICAgIC8vICAgdnJmRmFpbHVyZUNvdW50OiAwLAogICAgLy8gICBwaGFzZTogRGlzYnVyc2VtZW50UGhhc2VJZGxlLAogICAgLy8gICBkaXNidXJzZW1lbnRDdXJzb3I6IDEsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudElEOiAwLAogICAgLy8gICBhY3RpdmVEaXNidXJzZW1lbnRSb3VuZFN0YXJ0OiAwLAogICAgLy8gICBsYXN0RGlzYnVyc2VtZW50VGltZXN0YW1wOiAwCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MDEKICAgIC8vIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODg5LTkwNQogICAgLy8gdGhpcy5yZXdhcmRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgLi4uY2xvbmUocmV3YXJkKSwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2VyczogMCwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2U6IDAsCiAgICAvLyAgIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIC8vICAgcmFmZmxlQ3Vyc29yOiB7CiAgICAvLyAgICAgdGlja2V0OiAwLAogICAgLy8gICAgIHN0YWtlOiAwLAogICAgLy8gICAgIGRpc2J1cnNlZDogMAogICAgLy8gICB9LAogICAgLy8gICB2cmZGYWlsdXJlQ291bnQ6IDAsCiAgICAvLyAgIHBoYXNlOiBEaXNidXJzZW1lbnRQaGFzZUlkbGUsCiAgICAvLyAgIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIC8vICAgYWN0aXZlRGlzYnVyc2VtZW50SUQ6IDAsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudFJvdW5kU3RhcnQ6IDAsCiAgICAvLyAgIGxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXA6IDAKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODkzCiAgICAvLyB3aW5uaW5nVGlja2V0czogW10gYXMgdWludDY0W10sCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg4OS05MDUKICAgIC8vIHRoaXMucmV3YXJkcyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIC4uLmNsb25lKHJld2FyZCksCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlcnM6IDAsCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlOiAwLAogICAgLy8gICB3aW5uaW5nVGlja2V0czogW10gYXMgdWludDY0W10sCiAgICAvLyAgIHJhZmZsZUN1cnNvcjogewogICAgLy8gICAgIHRpY2tldDogMCwKICAgIC8vICAgICBzdGFrZTogMCwKICAgIC8vICAgICBkaXNidXJzZWQ6IDAKICAgIC8vICAgfSwKICAgIC8vICAgdnJmRmFpbHVyZUNvdW50OiAwLAogICAgLy8gICBwaGFzZTogRGlzYnVyc2VtZW50UGhhc2VJZGxlLAogICAgLy8gICBkaXNidXJzZW1lbnRDdXJzb3I6IDEsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudElEOiAwLAogICAgLy8gICBhY3RpdmVEaXNidXJzZW1lbnRSb3VuZFN0YXJ0OiAwLAogICAgLy8gICBsYXN0RGlzYnVyc2VtZW50VGltZXN0YW1wOiAwCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4ODkKICAgIC8vIHRoaXMucmV3YXJkcyhpZCkudmFsdWUgPSB7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODg5LTkwNQogICAgLy8gdGhpcy5yZXdhcmRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgLi4uY2xvbmUocmV3YXJkKSwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2VyczogMCwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2U6IDAsCiAgICAvLyAgIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIC8vICAgcmFmZmxlQ3Vyc29yOiB7CiAgICAvLyAgICAgdGlja2V0OiAwLAogICAgLy8gICAgIHN0YWtlOiAwLAogICAgLy8gICAgIGRpc2J1cnNlZDogMAogICAgLy8gICB9LAogICAgLy8gICB2cmZGYWlsdXJlQ291bnQ6IDAsCiAgICAvLyAgIHBoYXNlOiBEaXNidXJzZW1lbnRQaGFzZUlkbGUsCiAgICAvLyAgIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIC8vICAgYWN0aXZlRGlzYnVyc2VtZW50SUQ6IDAsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudFJvdW5kU3RhcnQ6IDAsCiAgICAvLyAgIGxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXA6IDAKICAgIC8vIH0KICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIGIgc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9tZXJnZUAyMgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2Jvb2xfbWVyZ2VAMTYKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGUocmV3YXJkSUQ6IHVpbnQ2NCkgLT4gdm9pZDoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTk3CiAgICAvLyByYWZmbGUocmV3YXJkSUQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk5OAogICAgLy8gYXNzZXJ0KHRoaXMucmV3YXJkcyhyZXdhcmRJRCkuZXhpc3RzLCAncmV3YXJkIGRvZXMgbm90IGV4aXN0JykKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gcmV3YXJkcyA9IEJveE1hcDx1aW50NjQsIFJld2FyZD4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhSZXdhcmRzIH0pCiAgICBieXRlYyAyMSAvLyAiciIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTk4CiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRzKHJld2FyZElEKS5leGlzdHMsICdyZXdhcmQgZG9lcyBub3QgZXhpc3QnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gcmV3YXJkIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAwNQogICAgLy8gfSA9IGNsb25lKHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUpCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA4MyAvLyA4MwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgcHVzaGludCA0MSAvLyA0MQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBjb3ZlciA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAwNwogICAgLy8gYXNzZXJ0KHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUFsbG9jYXRpb24sIEVSUl9JTlZBTElEX0RJU0JVUlNFTUVOVF9QSEFTRSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTMgLy8gMHgxNAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRpc2J1cnNlbWVudCBwaGFzZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMDgKICAgIC8vIGFzc2VydCh3aW5uaW5nVGlja2V0cy5sZW5ndGggPT09IDAsIEVSUl9XSU5OSU5HX1RJQ0tFVFNfQUxSRUFEWV9FWElTVCkKICAgIHVuY292ZXIgMgogICAgcHVzaGludHMgMTI0IDIgLy8gMTI0LCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFdpbm5pbmcgdGlja2V0cyBhbHJlYWR5IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxMAogICAgLy8gY29uc3Qgcm91bmRUb1VzZTogdWludDY0ID0gYWN0aXZlRGlzYnVyc2VtZW50Um91bmRTdGFydCArIDEgKyAoNCAqIHZyZkZhaWx1cmVDb3VudCkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBwdXNoaW50IDQgLy8gNAogICAgdW5jb3ZlciAyCiAgICAqCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxMi0xMDE1CiAgICAvLyBjb25zdCBzZWVkID0gYWJpQ2FsbDx0eXBlb2YgUmFuZG9tbmVzc0JlYWNvbi5wcm90b3R5cGUuZ2V0Pih7CiAgICAvLyAgIGFwcElkOiBnZXRPdGhlckFwcExpc3QoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkKS52cmZCZWFjb24sCiAgICAvLyAgIGFyZ3M6IFtyb3VuZFRvVXNlLCB0aGlzLnNhbHQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDEzCiAgICAvLyBhcHBJZDogZ2V0T3RoZXJBcHBMaXN0KEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCkudnJmQmVhY29uLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5CiAgICAvLyBjb25zdCBbb3RoZXJBcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzT3RoZXJBcHBMaXN0KSkKICAgIGJ5dGVjIDMzIC8vICJvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxMwogICAgLy8gYXBwSWQ6IGdldE90aGVyQXBwTGlzdChHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQpLnZyZkJlYWNvbiwKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMTQKICAgIC8vIGFyZ3M6IFtyb3VuZFRvVXNlLCB0aGlzLnNhbHQudmFsdWVdLAogICAgc3dhcAogICAgaXRvYgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIHNhbHQgPSBHbG9iYWxTdGF0ZTxieXRlczwzMj4+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTYWx0IH0pCiAgICBieXRlYyAzNCAvLyAic2FsdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDE0CiAgICAvLyBhcmdzOiBbcm91bmRUb1VzZSwgdGhpcy5zYWx0LnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMTItMTAxNQogICAgLy8gY29uc3Qgc2VlZCA9IGFiaUNhbGw8dHlwZW9mIFJhbmRvbW5lc3NCZWFjb24ucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZ2V0T3RoZXJBcHBMaXN0KEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCkudnJmQmVhY29uLAogICAgLy8gICBhcmdzOiBbcm91bmRUb1VzZSwgdGhpcy5zYWx0LnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgNiAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDE3CiAgICAvLyBpZiAoc2VlZC5sZW5ndGggPT09IDApIHsKICAgIGxlbgogICAgZHVwCiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxOAogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS52cmZGYWlsdXJlQ291bnQgKz0gMQogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIHB1c2hpbnQgODMgLy8gODMKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgODMgLy8gODMKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxOQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDIzCiAgICAvLyBjb25zdCBybmdTdGF0ZSA9IHBjZzY0SW5pdChzZWVkLnNsaWNlKDAsIDE2KSkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMTUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCAxNiAvLyAxNgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIDE0CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjE2CiAgICAvLyBhc3NlcnQoc2VlZC5sZW5ndGggPT09IDE2KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MTkKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgMCksIHBjZ0ZpcnN0SW5jcmVtZW50KSwKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjkyCiAgICAvLyBjb25zdCBzdGF0ZSA9IF9fcGNnMzJTdGVwKDAsIGluY3IpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MTkKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgMCksIHBjZ0ZpcnN0SW5jcmVtZW50KSwKICAgIGludGMgNyAvLyAxNDQyNjk1MDQwODg4OTYzNDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICBhZGR3CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6OTMKICAgIC8vIGNvbnN0IFssIGFkZExvd10gPSBvcC5hZGR3KHN0YXRlLCBpbml0aWFsU3RhdGUpCiAgICB1bmNvdmVyIDIKICAgIGFkZHcKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjE5CiAgICAvLyBfX3BjZzMySW5pdChvcC5leHRyYWN0VWludDY0KHNlZWQsIDApLCBwY2dGaXJzdEluY3JlbWVudCksCiAgICBpbnRjIDcgLy8gMTQ0MjY5NTA0MDg4ODk2MzQwNwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxOAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcobXVsTG93LCBpbmNyKQogICAgYWRkdwogICAgY292ZXIgMgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjIwCiAgICAvLyBfX3BjZzMySW5pdChvcC5leHRyYWN0VWludDY0KHNlZWQsIDgpLCBwY2dTZWNvbmRJbmNyZW1lbnQpLAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6MTgKICAgIC8vIGNvbnN0IFssIGFkZExvd10gPSBvcC5hZGR3KG11bExvdywgaW5jcikKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MjAKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgOCksIHBjZ1NlY29uZEluY3JlbWVudCksCiAgICBpbnRjIDggLy8gMTQ0MjY5NTA0MDg4ODk2MzQwOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxOAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcobXVsTG93LCBpbmNyKQogICAgYWRkdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjkzCiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhzdGF0ZSwgaW5pdGlhbFN0YXRlKQogICAgYWRkdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE3CiAgICAvLyBjb25zdCBbLCBtdWxMb3ddID0gb3AubXVsdyhzdGF0ZSwgcGNnTXVsdGlwbGllcikKICAgIGludGMgNSAvLyA2MzY0MTM2MjIzODQ2NzkzMDA1CiAgICBtdWx3CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MjAKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgOCksIHBjZ1NlY29uZEluY3JlbWVudCksCiAgICBpbnRjIDggLy8gMTQ0MjY5NTA0MDg4ODk2MzQwOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxOAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcobXVsTG93LCBpbmNyKQogICAgYWRkdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjE4LTIxCiAgICAvLyByZXR1cm4gWwogICAgLy8gICAgIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgMCksIHBjZ0ZpcnN0SW5jcmVtZW50KSwKICAgIC8vICAgICBfX3BjZzMySW5pdChvcC5leHRyYWN0VWludDY0KHNlZWQsIDgpLCBwY2dTZWNvbmRJbmNyZW1lbnQpLAogICAgLy8gXQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDI3CiAgICAvLyBpZiAodXBwZXJCb3VuZCA8IE1BWF9VSU5UNjQpIHsKICAgIGZyYW1lX2RpZyAxMwogICAgaW50YyAxMiAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgPAogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2lmX2JvZHlANAogICAgZnJhbWVfZGlnIDEzCiAgICBmcmFtZV9idXJ5IDExCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjMwCiAgICAvLyBjb25zdCByZXN1bHQgPSBuZXcgRHluYW1pY0FycmF5PGFyYzQuVWludDY0PigpCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjQyCiAgICAvLyBpZiAodXBwZXJCb3VuZCAhPT0gMCkgewogICAgZnJhbWVfZGlnIDExCiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NDMKICAgIC8vIGFzc2VydCh1cHBlckJvdW5kID4gMSkKICAgIGZyYW1lX2RpZyAxMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjQ0CiAgICAvLyBhc3NlcnQobG93ZXJCb3VuZCA8IHVwcGVyQm91bmQgLSAxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAzMQogICAgLy8gY29uc3Qgcm5nUmVzdWx0ID0gcGNnNjRSYW5kb20ocm5nU3RhdGUsIDEsIHVwcGVyQm91bmQsIE1heEdsb2JhbFN0YXRlVWludDY0QXJyYXkpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo0NAogICAgLy8gYXNzZXJ0KGxvd2VyQm91bmQgPCB1cHBlckJvdW5kIC0gMSkKICAgID4KICAgIGFzc2VydAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6OAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcofnZhbHVlLCAxKQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgfgogICAgaW50Y18xIC8vIDEKICAgIGFkZHcKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo1MwogICAgLy8gY29uc3QgdGhyZXNob2xkOiB1aW50NjQgPSBfX3VpbnQ2NFR3b3MoYWJzb2x1dGVCb3VuZCkgJSBhYnNvbHV0ZUJvdW5kCiAgICBzd2FwCiAgICAlCiAgICBmcmFtZV9idXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjU1CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbGVuZ3RoOyBpID0gaSArIDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3doaWxlX3RvcEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NTUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBsZW5ndGg7IGkgPSBpICsgMSkgewogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDMxCiAgICAvLyBjb25zdCBybmdSZXN1bHQgPSBwY2c2NFJhbmRvbShybmdTdGF0ZSwgMSwgdXBwZXJCb3VuZCwgTWF4R2xvYmFsU3RhdGVVaW50NjRBcnJheSkKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NTUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBsZW5ndGg7IGkgPSBpICsgMSkgewogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfYWZ0ZXJfd2hpbGVAMjIKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3doaWxlX3RvcEAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6OQogICAgLy8gY29uc3QgbmV3U3RhdGUxID0gX19wY2czMlN0ZXAoc3RhdGVbMF0sIHBjZ0ZpcnN0SW5jcmVtZW50KQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjkKICAgIC8vIGNvbnN0IG5ld1N0YXRlMSA9IF9fcGNnMzJTdGVwKHN0YXRlWzBdLCBwY2dGaXJzdEluY3JlbWVudCkKICAgIGludGMgNyAvLyAxNDQyNjk1MDQwODg4OTYzNDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICBhZGR3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgNQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjEwCiAgICAvLyBjb25zdCBuZXdTdGF0ZTIgPSBfX3BjZzMyU3RlcChzdGF0ZVsxXSwgbmV3U3RhdGUxID09PSAwID8gb3Auc2hsKHBjZ1NlY29uZEluY3JlbWVudCwgMSkgOiBwY2dTZWNvbmRJbmNyZW1lbnQpCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgOAogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3Rlcm5hcnlfZmFsc2VAMjYKICAgIHB1c2hpbnQgMjg4NTM5MDA4MTc3NzkyNjgxOCAvLyAyODg1MzkwMDgxNzc3OTI2ODE4CgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV90ZXJuYXJ5X21lcmdlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgOAogICAgZHVwCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICB1bmNvdmVyIDIKICAgIGFkZHcKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czoxMgogICAgLy8gcmV0dXJuIFtbbmV3U3RhdGUxLCBuZXdTdGF0ZTJdLCBvcC5zaGwoX19wY2czMk91dHB1dChzdGF0ZVswXSksIDMyKSB8IF9fcGNnMzJPdXRwdXQoc3RhdGVbMV0pXQogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDkKICAgIGNhbGxzdWIgX19wY2czMk91dHB1dAogICAgcHVzaGludCAzMiAvLyAzMgogICAgc2hsCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX19wY2czMk91dHB1dAogICAgfAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCBbbmV3U3RhdGUsIGNhbmRpZGF0ZV0gPSBfX3BjZzY0VW5ib3VuZGVkUmFuZG9tKHN0YXRlKQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo1OQogICAgLy8gaWYgKGNhbmRpZGF0ZSA+PSB0aHJlc2hvbGQpIHsKICAgIGZyYW1lX2RpZyAxMAogICAgPj0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NjAKICAgIC8vIHJlc3VsdC5wdXNoKG5ldyBhcmM0LlVpbnQ2NCgoY2FuZGlkYXRlICUgYWJzb2x1dGVCb3VuZCkgKyBsb3dlckJvdW5kKSkKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzEKICAgIC8vIGNvbnN0IHJuZ1Jlc3VsdCA9IHBjZzY0UmFuZG9tKHJuZ1N0YXRlLCAxLCB1cHBlckJvdW5kLCBNYXhHbG9iYWxTdGF0ZVVpbnQ2NEFycmF5KQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NjAKICAgIC8vIHJlc3VsdC5wdXNoKG5ldyBhcmM0LlVpbnQ2NCgoY2FuZGlkYXRlICUgYWJzb2x1dGVCb3VuZCkgKyBsb3dlckJvdW5kKSkKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjU1CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbGVuZ3RoOyBpID0gaSArIDEpIHsKICAgIGZyYW1lX2RpZyA3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDMKICAgIGIgc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfd2hpbGVfdG9wQDE2CgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfYnVyeSAzCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3doaWxlX3RvcEAxOAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfdGVybmFyeV9mYWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MTAKICAgIC8vIGNvbnN0IG5ld1N0YXRlMiA9IF9fcGNnMzJTdGVwKHN0YXRlWzFdLCBuZXdTdGF0ZTEgPT09IDAgPyBvcC5zaGwocGNnU2Vjb25kSW5jcmVtZW50LCAxKSA6IHBjZ1NlY29uZEluY3JlbWVudCkKICAgIGludGMgOCAvLyAxNDQyNjk1MDQwODg4OTYzNDA5CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3Rlcm5hcnlfbWVyZ2VAMjcKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX3doaWxlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo2NwogICAgLy8gcmV0dXJuIFtzdGF0ZSwgcmVzdWx0XQogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUud2lubmluZ1RpY2tldHMgPSBkZWNvZGVBcmM0PHVpbnQ2NFtdPihybmdSZXN1bHRbMV0uYnl0ZXMpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgMTIKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgcHVzaGludCA1NyAvLyA1NwogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzQKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUudnJmRmFpbHVyZUNvdW50ID0gMAogICAgcHVzaGludCA4MyAvLyA4MwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2Vsc2VfYm9keUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NTAKICAgIC8vIGFic29sdXRlQm91bmQgPSBvcC5idG9pKEJ5dGVzKEJpZ1VpbnQoMiAqKiA2NCkgLSBCaWdVaW50KGxvd2VyQm91bmQpKSkKICAgIGludGMgMTIgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIGZyYW1lX2J1cnkgNAogICAgYiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9hZnRlcl9pZl9lbHNlQDE1CgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9pZl9ib2R5QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAyOAogICAgLy8gdXBwZXJCb3VuZCArPSAxCiAgICBmcmFtZV9kaWcgMTMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDExCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX2lmX2Vsc2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlKCkgLT4gdWludDY0OgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzTGl2ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU3CiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gUG9vbFN0YXR1c0RyYWZ0ICYmCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGF0dXM+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGF0dXMgfSkKICAgIGJ5dGVjIDEwIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1NwogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU3LTExNTgKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBQb29sU3RhdHVzRHJhZnQgJiYKICAgIC8vIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wID49IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUpICYmCiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzTGl2ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU4CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFydFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTYgLy8gInN0YXJ0X3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU4CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1Ny0xMTU4CiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gUG9vbFN0YXR1c0RyYWZ0ICYmCiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1OQogICAgLy8gKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPD0gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPT09IDApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gZW5kVGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbmRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE3IC8vICJlbmRfdGltZXN0YW1wIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNTkKICAgIC8vIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDw9IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlIHx8IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlID09PSAwKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF90cnVlQDQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBlbmRUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVuZFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTcgLy8gImVuZF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1OQogICAgLy8gKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPD0gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPT09IDApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlX2Jvb2xfZmFsc2VANQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNTYtMTE2MAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSB8fCB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSA9PT0gMCkKICAgIC8vICkKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU2LTExNjAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBQb29sU3RhdHVzRHJhZnQgJiYKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPj0gdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSkgJiYKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPD0gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPT09IDApCiAgICAvLyApCiAgICByZXRzdWIK\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type ObjectC3416591 = {\n valid: boolean,\n balance: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a ObjectC3416591 to the struct representation\n */\nexport function ObjectC3416591FromTuple(abiTuple: [boolean, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.ObjectC3416591, APP_SPEC.structs) as ObjectC3416591\n}\n\nexport type RootKey = {\n address: string,\n name: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RootKey to the struct representation\n */\nexport function RootKeyFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RootKey, APP_SPEC.structs) as RootKey\n}\n\nexport type AddRewardParams = {\n asset: bigint,\n distribution: number,\n rate: bigint,\n expiration: bigint,\n interval: bigint,\n winnerCount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a AddRewardParams to the struct representation\n */\nexport function AddRewardParamsFromTuple(abiTuple: [bigint, number, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AddRewardParams, APP_SPEC.structs) as AddRewardParams\n}\n\nexport type EntryData = {\n address: string,\n asset: bigint,\n quantity: bigint,\n gateArgs: Uint8Array[],\n disqualified: boolean\n}\n\n\n/**\n * Converts the ABI tuple representation of a EntryData to the struct representation\n */\nexport function EntryDataFromTuple(abiTuple: [string, bigint, bigint, Uint8Array[], boolean]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.EntryData, APP_SPEC.structs) as EntryData\n}\n\nexport type EntryKey = {\n address: string,\n asset: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a EntryKey to the struct representation\n */\nexport function EntryKeyFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.EntryKey, APP_SPEC.structs) as EntryKey\n}\n\nexport type RaffleCursor = {\n ticket: bigint,\n stake: bigint,\n disbursed: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a RaffleCursor to the struct representation\n */\nexport function RaffleCursorFromTuple(abiTuple: [bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RaffleCursor, APP_SPEC.structs) as RaffleCursor\n}\n\nexport type Reward = {\n asset: bigint,\n distribution: number,\n rate: bigint,\n expiration: bigint,\n interval: bigint,\n qualifiedStakers: bigint,\n qualifiedStake: bigint,\n winnerCount: bigint,\n winningTickets: bigint[],\n raffleCursor: RaffleCursor,\n vrfFailureCount: bigint,\n phase: number,\n disbursementCursor: bigint,\n activeDisbursementId: bigint,\n activeDisbursementRoundStart: bigint,\n lastDisbursementTimestamp: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Reward to the struct representation\n */\nexport function RewardFromTuple(abiTuple: [bigint, number, bigint, bigint, bigint, bigint, bigint, bigint, bigint[], [bigint, bigint, bigint], bigint, number, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Reward, APP_SPEC.structs) as Reward\n}\n\nexport type StakingPoolMbrData = {\n entries: bigint,\n uniques: bigint,\n entriesByAddress: bigint,\n rewards: bigint,\n disbursements: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakingPoolMBRData to the struct representation\n */\nexport function StakingPoolMbrDataFromTuple(abiTuple: [bigint, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakingPoolMBRData, APP_SPEC.structs) as StakingPoolMbrData\n}\n\nexport type StakingPoolState = {\n status: number,\n title: string,\n type: number,\n signupTimestamp: bigint,\n startTimestamp: bigint,\n allowLateSignups: boolean,\n endTimestamp: bigint,\n maxEntries: bigint,\n entryCount: bigint,\n rewardCount: bigint,\n totalStaked: bigint,\n stakeKey: RootKey,\n minimumStakeAmount: bigint,\n gateId: bigint,\n creator: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakingPoolState to the struct representation\n */\nexport function StakingPoolStateFromTuple(abiTuple: [number, string, number, bigint, bigint, boolean, bigint, bigint, bigint, bigint, bigint, [string, string], bigint, bigint, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakingPoolState, APP_SPEC.structs) as StakingPoolState\n}\n\nexport type FunderInfo = {\n account: string,\n amount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a FunderInfo to the struct representation\n */\nexport function FunderInfoFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.FunderInfo, APP_SPEC.structs) as FunderInfo\n}\n\n/**\n * The argument types for the StakingPool contract\n */\nexport type StakingPoolArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void': {\n title: string\n type: bigint | number\n creator: string\n funder: FunderInfo\n marketplace: string\n stakeKey: RootKey\n minimumStakeAmount: bigint | number\n allowLateSignups: boolean\n gateId: bigint | number\n maxEntries: bigint | number\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'init()void': Record<string, never>\n 'delete(address)void': {\n caller: string\n }\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void': {\n payment: AppMethodCallTransactionArgument\n reward: AddRewardParams\n }\n 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n reward: AddRewardParams\n }\n 'finalize(uint64,uint64,uint64)void': {\n signupTimestamp: bigint | number\n startTimestamp: bigint | number\n endTimestamp: bigint | number\n }\n 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void': {\n payment?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n entries: [bigint | number, bigint | number, Uint8Array[]][]\n }\n 'enter(pay,(uint64,uint64,byte[32][])[])void': {\n payment: AppMethodCallTransactionArgument\n entries: [bigint | number, bigint | number, Uint8Array[]][]\n }\n 'startDisbursement(uint64)void': {\n rewardId: bigint | number\n }\n 'raffle(uint64)void': {\n rewardId: bigint | number\n }\n 'disburseRewards(uint64,uint64)void': {\n rewardId: bigint | number\n iterationAmount: bigint | number\n }\n 'finalizeDistribution(uint64)void': {\n rewardId: bigint | number\n }\n 'check(address,uint64)(bool,uint64)': {\n address: string\n asset: bigint | number\n }\n 'gateCheck(appl,address,uint64)void': {\n gateTxn: AppMethodCallTransactionArgument\n address: string\n asset: bigint | number\n }\n 'enterCost(address,uint64)uint64': {\n /**\n * The address that will be entering\n */\n address: string\n /**\n * The number of entries being added\n */\n entryCount: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'signUpsOpen()bool': Record<string, never>\n 'isLive()bool': Record<string, never>\n 'isEntered(address)bool': {\n address: string\n }\n 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)': Record<string, never>\n 'updateAkitaDAOEscrow(uint64)void': {\n app: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': {\n winningTickets: bigint | number\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void': [title: string, type: bigint | number, creator: string, funder: FunderInfo, marketplace: string, stakeKey: RootKey, minimumStakeAmount: bigint | number, allowLateSignups: boolean, gateId: bigint | number, maxEntries: bigint | number, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'init()void': []\n 'delete(address)void': [caller: string]\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void': [payment: AppMethodCallTransactionArgument, reward: AddRewardParams]\n 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, reward: AddRewardParams]\n 'finalize(uint64,uint64,uint64)void': [signupTimestamp: bigint | number, startTimestamp: bigint | number, endTimestamp: bigint | number]\n 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void': [payment: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, entries: [bigint | number, bigint | number, Uint8Array[]][]]\n 'enter(pay,(uint64,uint64,byte[32][])[])void': [payment: AppMethodCallTransactionArgument, entries: [bigint | number, bigint | number, Uint8Array[]][]]\n 'startDisbursement(uint64)void': [rewardId: bigint | number]\n 'raffle(uint64)void': [rewardId: bigint | number]\n 'disburseRewards(uint64,uint64)void': [rewardId: bigint | number, iterationAmount: bigint | number]\n 'finalizeDistribution(uint64)void': [rewardId: bigint | number]\n 'check(address,uint64)(bool,uint64)': [address: string, asset: bigint | number]\n 'gateCheck(appl,address,uint64)void': [gateTxn: AppMethodCallTransactionArgument, address: string, asset: bigint | number]\n 'enterCost(address,uint64)uint64': [address: string, entryCount: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'signUpsOpen()bool': []\n 'isLive()bool': []\n 'isEntered(address)bool': [address: string]\n 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)': []\n 'updateAkitaDAOEscrow(uint64)void': [app: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': [winningTickets: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type StakingPoolReturns = {\n 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void': void\n 'init()void': void\n 'delete(address)void': void\n 'optIn(pay,uint64)void': void\n 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void': void\n 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void': void\n 'finalize(uint64,uint64,uint64)void': void\n 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void': void\n 'enter(pay,(uint64,uint64,byte[32][])[])void': void\n 'startDisbursement(uint64)void': void\n 'raffle(uint64)void': void\n 'disburseRewards(uint64,uint64)void': void\n 'finalizeDistribution(uint64)void': void\n 'check(address,uint64)(bool,uint64)': ObjectC3416591\n 'gateCheck(appl,address,uint64)void': void\n 'enterCost(address,uint64)uint64': bigint\n 'optInCost(uint64)uint64': bigint\n 'signUpsOpen()bool': boolean\n 'isLive()bool': boolean\n 'isEntered(address)bool': boolean\n 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)': StakingPoolState\n 'updateAkitaDAOEscrow(uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': StakingPoolMbrData\n}\n\n/**\n * Defines the types of available calls and state of the StakingPool smart contract.\n */\nexport type StakingPoolTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void' | 'create', {\n argsObj: StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']\n returns: StakingPoolReturns['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']\n }>\n & Record<'init()void' | 'init', {\n argsObj: StakingPoolArgs['obj']['init()void']\n argsTuple: StakingPoolArgs['tuple']['init()void']\n returns: StakingPoolReturns['init()void']\n }>\n & Record<'delete(address)void' | 'delete', {\n argsObj: StakingPoolArgs['obj']['delete(address)void']\n argsTuple: StakingPoolArgs['tuple']['delete(address)void']\n returns: StakingPoolReturns['delete(address)void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: StakingPoolArgs['obj']['optIn(pay,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['optIn(pay,uint64)void']\n returns: StakingPoolReturns['optIn(pay,uint64)void']\n }>\n & Record<'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void' | 'addReward', {\n argsObj: StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n argsTuple: StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n returns: StakingPoolReturns['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n }>\n & Record<'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void' | 'addRewardAsa', {\n argsObj: StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n argsTuple: StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n returns: StakingPoolReturns['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n }>\n & Record<'finalize(uint64,uint64,uint64)void' | 'finalize', {\n argsObj: StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']\n returns: StakingPoolReturns['finalize(uint64,uint64,uint64)void']\n }>\n & Record<'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void' | 'gatedEnter', {\n argsObj: StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']\n argsTuple: StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']\n returns: StakingPoolReturns['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']\n }>\n & Record<'enter(pay,(uint64,uint64,byte[32][])[])void' | 'enter', {\n argsObj: StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void']\n argsTuple: StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']\n returns: StakingPoolReturns['enter(pay,(uint64,uint64,byte[32][])[])void']\n }>\n & Record<'startDisbursement(uint64)void' | 'startDisbursement', {\n argsObj: StakingPoolArgs['obj']['startDisbursement(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['startDisbursement(uint64)void']\n returns: StakingPoolReturns['startDisbursement(uint64)void']\n }>\n & Record<'raffle(uint64)void' | 'raffle', {\n argsObj: StakingPoolArgs['obj']['raffle(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['raffle(uint64)void']\n returns: StakingPoolReturns['raffle(uint64)void']\n }>\n & Record<'disburseRewards(uint64,uint64)void' | 'disburseRewards', {\n argsObj: StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']\n returns: StakingPoolReturns['disburseRewards(uint64,uint64)void']\n }>\n & Record<'finalizeDistribution(uint64)void' | 'finalizeDistribution', {\n argsObj: StakingPoolArgs['obj']['finalizeDistribution(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']\n returns: StakingPoolReturns['finalizeDistribution(uint64)void']\n }>\n & Record<'check(address,uint64)(bool,uint64)' | 'check', {\n argsObj: StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)']\n argsTuple: StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']\n returns: StakingPoolReturns['check(address,uint64)(bool,uint64)']\n }>\n & Record<'gateCheck(appl,address,uint64)void' | 'gateCheck', {\n argsObj: StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']\n returns: StakingPoolReturns['gateCheck(appl,address,uint64)void']\n }>\n & Record<'enterCost(address,uint64)uint64' | 'enterCost', {\n argsObj: StakingPoolArgs['obj']['enterCost(address,uint64)uint64']\n argsTuple: StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']\n /**\n * The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n returns: StakingPoolReturns['enterCost(address,uint64)uint64']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: StakingPoolArgs['obj']['optInCost(uint64)uint64']\n argsTuple: StakingPoolArgs['tuple']['optInCost(uint64)uint64']\n returns: StakingPoolReturns['optInCost(uint64)uint64']\n }>\n & Record<'signUpsOpen()bool' | 'signUpsOpen', {\n argsObj: StakingPoolArgs['obj']['signUpsOpen()bool']\n argsTuple: StakingPoolArgs['tuple']['signUpsOpen()bool']\n /**\n * a boolean of whether sign ups are open\n */\n returns: StakingPoolReturns['signUpsOpen()bool']\n }>\n & Record<'isLive()bool' | 'isLive', {\n argsObj: StakingPoolArgs['obj']['isLive()bool']\n argsTuple: StakingPoolArgs['tuple']['isLive()bool']\n /**\n * a boolean of whether the pool is live\n */\n returns: StakingPoolReturns['isLive()bool']\n }>\n & Record<'isEntered(address)bool' | 'isEntered', {\n argsObj: StakingPoolArgs['obj']['isEntered(address)bool']\n argsTuple: StakingPoolArgs['tuple']['isEntered(address)bool']\n /**\n * a boolean indicating if the address has entered the staking pool\n */\n returns: StakingPoolReturns['isEntered(address)bool']\n }>\n & Record<'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)' | 'getState', {\n argsObj: StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n argsTuple: StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n returns: StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n }>\n & Record<'updateAkitaDAOEscrow(uint64)void' | 'updateAkitaDAOEscrow', {\n argsObj: StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']\n returns: StakingPoolReturns['updateAkitaDAOEscrow(uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: StakingPoolArgs['obj']['update(string)void']\n argsTuple: StakingPoolArgs['tuple']['update(string)void']\n returns: StakingPoolReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: StakingPoolArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: StakingPoolReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: StakingPoolArgs['obj']['opUp()void']\n argsTuple: StakingPoolArgs['tuple']['opUp()void']\n returns: StakingPoolReturns['opUp()void']\n }>\n & Record<'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' | 'mbr', {\n argsObj: StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n argsTuple: StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n /**\n * the mbr created for each boxmap entry\n */\n returns: StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the status the pool is in\n */\n status: number\n /**\n * title of the staking pool\n */\n title: string\n /**\n * the method of staking to be used for the pool\n */\n type: number\n /**\n * the timestamp when sign ups for the pool are allowed\n */\n signupTimestamp: bigint\n /**\n * whether signups are allowed after the staking pool begins\n */\n allowLateSignups: bigint\n /**\n * the timestamp when the pool starts\n */\n startTimestamp: bigint\n /**\n * the timestamp when the pool ends\n */\n endTimestamp: bigint\n /**\n * the maximum entries allowed for the pool\n */\n maxEntries: bigint\n /**\n * the number of entries in a pool\n */\n entryId: bigint\n /**\n * the number of rewards for the pool\n */\n rewardId: bigint\n /**\n * the total amount staked in the pool\n */\n totalStaked: bigint\n /**\n * the name for the meta merkle asset group to validate staking\n stake key can be empty if distribution !== DistributionTypePercentage\n\n */\n stakeKey: RootKey\n /**\n * minimum stake amount\n */\n minimumStakeAmount: bigint\n /**\n * the gate id of the pool\n */\n gateId: bigint\n /**\n * the size of the gate were using\n */\n gateSize: bigint\n /**\n * the address of the creator of the staking pool\n */\n creator: string\n /**\n * marketplace is pool creation side marketplace\n */\n marketplace: string\n /**\n * the amount the marketplaces will get for the sale\n */\n marketplaceRoyalties: bigint\n /**\n * the akita royalty for the pool\n */\n akitaRoyalty: bigint\n /**\n * the amount of royalties that were paid in a disbursement\n */\n akitaRoyaltyAmount: bigint\n /**\n * salt for randomness\n */\n salt: BinaryState\n /**\n * the app ID for the akita DAO escrow to use\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n funder: FunderInfo\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * indexed entries for efficient iteration\n */\n entries: Map<bigint | number, EntryData>\n /**\n * the number of unique asset entries by address\n */\n uniques: Map<string, bigint>\n /**\n * the entries in the pool\n */\n entriesByAddress: Map<EntryKey, bigint>\n /**\n * the rewards for this staking pool\n */\n rewards: Map<bigint | number, Reward>\n /**\n * the disbursements this pool as created & finalized\n */\n disbursements: Map<bigint | number, Uint8Array>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type StakingPoolSignatures = keyof StakingPoolTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type StakingPoolNonVoidMethodSignatures = keyof StakingPoolTypes['methods'] extends infer T ? T extends keyof StakingPoolTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the StakingPool smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends StakingPoolSignatures> = StakingPoolTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the StakingPool smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends StakingPoolSignatures> = StakingPoolTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = StakingPoolTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = StakingPoolTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type StakingPoolCreateCallParams =\n | Expand<CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & {method: 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type StakingPoolUpdateCallParams =\n | Expand<CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines supported delete method params for this smart contract\n */\nexport type StakingPoolDeleteCallParams =\n | Expand<CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']> & {method: 'delete'}>\n | Expand<CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']> & {method: 'delete(address)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type StakingPoolDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * 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)\n */\n createParams?: StakingPoolCreateCallParams\n /**\n * Update 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)\n */\n updateParams?: StakingPoolUpdateCallParams\n /**\n * Delete 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)\n */\n deleteParams?: StakingPoolDeleteCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the StakingPool smart contract\n */\nexport abstract class StakingPoolParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends StakingPoolCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void':\n return StakingPoolParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the StakingPool smart contract using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.title, params.args.type, params.args.creator, params.args.funder, params.args.marketplace, params.args.stakeKey, params.args.minimumStakeAmount, params.args.allowLateSignups, params.args.gateId, params.args.maxEntries, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends StakingPoolUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return StakingPoolParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the StakingPool smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Gets available delete ABI call param factories\n */\n static get delete() {\n return {\n _resolveByMethod<TParams extends StakingPoolDeleteCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'delete':\n case 'delete(address)void':\n return StakingPoolParamsFactory.delete.delete(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs delete ABI call params for the StakingPool smart contract using the delete(address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n delete(params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'delete(address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.caller],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the init()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static init(params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'init()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addReward(params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.reward],\n }\n }\n /**\n * Constructs a no op call for the addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addRewardAsa(params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.reward],\n }\n }\n /**\n * Constructs a no op call for the finalize(uint64,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static finalize(params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'finalize(uint64,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.signupTimestamp, params.args.startTimestamp, params.args.endTimestamp],\n }\n }\n /**\n * Constructs a no op call for the gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedEnter(params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.gateTxn, params.args.entries],\n }\n }\n /**\n * Constructs a no op call for the enter(pay,(uint64,uint64,byte[32][])[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static enter(params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'enter(pay,(uint64,uint64,byte[32][])[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.entries],\n }\n }\n /**\n * Constructs a no op call for the startDisbursement(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static startDisbursement(params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'startDisbursement(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId],\n }\n }\n /**\n * Constructs a no op call for the raffle(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static raffle(params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'raffle(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId],\n }\n }\n /**\n * Constructs a no op call for the disburseRewards(uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static disburseRewards(params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'disburseRewards(uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId, params.args.iterationAmount],\n }\n }\n /**\n * Constructs a no op call for the finalizeDistribution(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static finalizeDistribution(params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'finalizeDistribution(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId],\n }\n }\n /**\n * Constructs a no op call for the check(address,uint64)(bool,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static check(params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'check(address,uint64)(bool,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the gateCheck(appl,address,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gateCheck(params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gateCheck(appl,address,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.gateTxn, params.args.address, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the enterCost(address,uint64)uint64 ABI method\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static enterCost(params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'enterCost(address,uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.entryCount],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the signUpsOpen()bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static signUpsOpen(params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'signUpsOpen()bool' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the isLive()bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static isLive(params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'isLive()bool' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the isEntered(address)bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static isEntered(params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'isEntered(address)bool' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address],\n }\n }\n /**\n * Constructs a no op call for the getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getState(params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.app],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.winningTickets],\n }\n }\n}\n\n/**\n * 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\n */\nexport class StakingPoolFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `StakingPoolFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new StakingPoolClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new StakingPoolClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the StakingPool smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: StakingPoolDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? StakingPoolParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (StakingPoolCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? StakingPoolParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (StakingPoolUpdateCallParams & { args: Uint8Array[] }) : undefined,\n deleteParams: params.deleteParams?.method ? StakingPoolParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (StakingPoolDeleteCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new StakingPoolClient(result.appClient) }\n }\n\n /**\n * 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.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPool smart contract using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(StakingPoolParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(StakingPoolParamsFactory.update.update(params))\n },\n },\n\n /**\n * Gets available deployDelete methods\n */\n deployDelete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the delete(address)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n return this.appFactory.params.deployDelete(StakingPoolParamsFactory.delete.delete(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPool smart contract using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(StakingPoolParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPool smart contract using an ABI method call using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(StakingPoolParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | StakingPoolReturns['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']) }, appClient: new StakingPoolClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the StakingPool smart contract\n */\nexport class StakingPoolClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `StakingPoolClient`\n *\n * @param appClient An `AppClient` instance which has been created with the StakingPool app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `StakingPoolClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends StakingPoolNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `StakingPoolClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<StakingPoolClient> {\n return new StakingPoolClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `StakingPoolClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<StakingPoolClient> {\n return new StakingPoolClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(StakingPoolParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the `delete(address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n return this.appClient.params.delete(StakingPoolParamsFactory.delete.delete(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `init()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n init: (params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addReward: (params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.addReward(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addRewardAsa: (params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.addRewardAsa(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalize(uint64,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n finalize: (params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.finalize(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedEnter: (params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.gatedEnter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enter(pay,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n enter: (params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.enter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `startDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n startDisbursement: (params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.startDisbursement(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `raffle(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n raffle: (params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.raffle(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `disburseRewards(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n disburseRewards: (params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.disburseRewards(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalizeDistribution(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n finalizeDistribution: (params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.finalizeDistribution(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `check(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n check: (params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.check(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gateCheck(appl,address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gateCheck: (params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.gateCheck(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call params: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n enterCost: (params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.enterCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean of whether sign ups are open\n */\n signUpsOpen: (params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.signUpsOpen(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean of whether the pool is live\n */\n isLive: (params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.isLive(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean indicating if the address has entered the staking pool\n */\n isEntered: (params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.isEntered(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n getState: (params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.getState(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(StakingPoolParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the `delete(address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n return this.appClient.createTransaction.delete(StakingPoolParamsFactory.delete.delete(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `init()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n init: (params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addReward: (params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.addReward(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addRewardAsa: (params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.addRewardAsa(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalize(uint64,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n finalize: (params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.finalize(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedEnter: (params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.gatedEnter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enter(pay,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n enter: (params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.enter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `startDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n startDisbursement: (params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.startDisbursement(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `raffle(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n raffle: (params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.raffle(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `disburseRewards(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n disburseRewards: (params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.disburseRewards(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalizeDistribution(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n finalizeDistribution: (params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.finalizeDistribution(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `check(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n check: (params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.check(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gateCheck(appl,address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gateCheck: (params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.gateCheck(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n enterCost: (params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.enterCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean of whether sign ups are open\n */\n signUpsOpen: (params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.signUpsOpen(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean of whether the pool is live\n */\n isLive: (params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.isLive(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean indicating if the address has entered the staking pool\n */\n isEntered: (params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.isEntered(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n getState: (params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.getState(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(StakingPoolParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the `delete(address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n delete: async (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']> & SendParams) => {\n const result = await this.appClient.send.delete(StakingPoolParamsFactory.delete.delete(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['delete(address)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `init()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n init: async (params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.init(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['init()void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addReward: async (params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.addReward(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addRewardAsa: async (params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.addRewardAsa(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalize(uint64,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n finalize: async (params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.finalize(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['finalize(uint64,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedEnter: async (params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.gatedEnter(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enter(pay,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n enter: async (params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.enter(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['enter(pay,(uint64,uint64,byte[32][])[])void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `startDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n startDisbursement: async (params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.startDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['startDisbursement(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `raffle(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n raffle: async (params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.raffle(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['raffle(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `disburseRewards(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n disburseRewards: async (params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.disburseRewards(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['disburseRewards(uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalizeDistribution(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n finalizeDistribution: async (params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.finalizeDistribution(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['finalizeDistribution(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `check(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n check: async (params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.check(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['check(address,uint64)(bool,uint64)'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gateCheck(appl,address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gateCheck: async (params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.gateCheck(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['gateCheck(appl,address,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call result: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n enterCost: async (params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.enterCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['enterCost(address,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether sign ups are open\n */\n signUpsOpen: async (params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.signUpsOpen(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['signUpsOpen()bool'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether the pool is live\n */\n isLive: async (params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isLive(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['isLive()bool'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean indicating if the address has entered the staking pool\n */\n isEntered: async (params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isEntered(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['isEntered(address)bool'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n getState: async (params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.getState(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['updateAkitaDAOEscrow(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n mbr: async (params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new StakingPoolClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call result: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n async enterCost(params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.enterCost(params))\n return result.return as unknown as StakingPoolReturns['enterCost(address,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.optInCost(params))\n return result.return as unknown as StakingPoolReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether sign ups are open\n */\n async signUpsOpen(params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.signUpsOpen(params))\n return result.return as unknown as StakingPoolReturns['signUpsOpen()bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether the pool is live\n */\n async isLive(params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isLive(params))\n return result.return as unknown as StakingPoolReturns['isLive()bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean indicating if the address has entered the staking pool\n */\n async isEntered(params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isEntered(params))\n return result.return as unknown as StakingPoolReturns['isEntered(address)bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async getState(params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.getState(params))\n return result.return as unknown as StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n async mbr(params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.mbr(params))\n return result.return as unknown as StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }\n\n /**\n * Methods to access state for the current StakingPool app\n */\n state = {\n /**\n * Methods to access global state for the current StakingPool app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n status: result.status,\n title: result.title,\n type: result.type,\n signupTimestamp: result.signupTimestamp,\n allowLateSignups: result.allowLateSignups,\n startTimestamp: result.startTimestamp,\n endTimestamp: result.endTimestamp,\n maxEntries: result.maxEntries,\n entryId: result.entryID,\n rewardId: result.rewardID,\n totalStaked: result.totalStaked,\n stakeKey: result.stakeKey,\n minimumStakeAmount: result.minimumStakeAmount,\n gateId: result.gateID,\n gateSize: result.gateSize,\n creator: result.creator,\n marketplace: result.marketplace,\n marketplaceRoyalties: result.marketplaceRoyalties,\n akitaRoyalty: result.akitaRoyalty,\n akitaRoyaltyAmount: result.akitaRoyaltyAmount,\n salt: new BinaryStateValue(result.salt),\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n funder: result.funder,\n }\n },\n /**\n * Get the current value of the status key in global state\n */\n status: async (): Promise<number | undefined> => { return (await this.appClient.state.global.getValue(\"status\")) as number | undefined },\n /**\n * Get the current value of the title key in global state\n */\n title: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"title\")) as string | undefined },\n /**\n * Get the current value of the type key in global state\n */\n type: async (): Promise<number | undefined> => { return (await this.appClient.state.global.getValue(\"type\")) as number | undefined },\n /**\n * Get the current value of the signupTimestamp key in global state\n */\n signupTimestamp: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"signupTimestamp\")) as bigint | undefined },\n /**\n * Get the current value of the allowLateSignups key in global state\n */\n allowLateSignups: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"allowLateSignups\")) as bigint | undefined },\n /**\n * Get the current value of the startTimestamp key in global state\n */\n startTimestamp: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"startTimestamp\")) as bigint | undefined },\n /**\n * Get the current value of the endTimestamp key in global state\n */\n endTimestamp: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"endTimestamp\")) as bigint | undefined },\n /**\n * Get the current value of the maxEntries key in global state\n */\n maxEntries: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"maxEntries\")) as bigint | undefined },\n /**\n * Get the current value of the entryID key in global state\n */\n entryId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"entryID\")) as bigint | undefined },\n /**\n * Get the current value of the rewardID key in global state\n */\n rewardId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"rewardID\")) as bigint | undefined },\n /**\n * Get the current value of the totalStaked key in global state\n */\n totalStaked: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"totalStaked\")) as bigint | undefined },\n /**\n * Get the current value of the stakeKey key in global state\n */\n stakeKey: async (): Promise<RootKey | undefined> => { return (await this.appClient.state.global.getValue(\"stakeKey\")) as RootKey | undefined },\n /**\n * Get the current value of the minimumStakeAmount key in global state\n */\n minimumStakeAmount: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"minimumStakeAmount\")) as bigint | undefined },\n /**\n * Get the current value of the gateID key in global state\n */\n gateId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateID\")) as bigint | undefined },\n /**\n * Get the current value of the gateSize key in global state\n */\n gateSize: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateSize\")) as bigint | undefined },\n /**\n * Get the current value of the creator key in global state\n */\n creator: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"creator\")) as string | undefined },\n /**\n * Get the current value of the marketplace key in global state\n */\n marketplace: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"marketplace\")) as string | undefined },\n /**\n * Get the current value of the marketplaceRoyalties key in global state\n */\n marketplaceRoyalties: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"marketplaceRoyalties\")) as bigint | undefined },\n /**\n * Get the current value of the akitaRoyalty key in global state\n */\n akitaRoyalty: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaRoyalty\")) as bigint | undefined },\n /**\n * Get the current value of the akitaRoyaltyAmount key in global state\n */\n akitaRoyaltyAmount: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaRoyaltyAmount\")) as bigint | undefined },\n /**\n * Get the current value of the salt key in global state\n */\n salt: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.global.getValue(\"salt\")) as Uint8Array | undefined) },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n /**\n * Get the current value of the funder key in global state\n */\n funder: async (): Promise<FunderInfo | undefined> => { return (await this.appClient.state.global.getValue(\"funder\")) as FunderInfo | undefined },\n },\n /**\n * Methods to access box state for the current StakingPool app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the entries map in box state\n */\n entries: {\n /**\n * Get all current values of the entries map in box state\n */\n getMap: async (): Promise<Map<bigint, EntryData>> => { return (await this.appClient.state.box.getMap(\"entries\")) as Map<bigint, EntryData> },\n /**\n * Get a current value of the entries map by key from box state\n */\n value: async (key: bigint | number): Promise<EntryData | undefined> => { return await this.appClient.state.box.getMapValue(\"entries\", key) as EntryData | undefined },\n },\n /**\n * Get values from the uniques map in box state\n */\n uniques: {\n /**\n * Get all current values of the uniques map in box state\n */\n getMap: async (): Promise<Map<string, bigint>> => { return (await this.appClient.state.box.getMap(\"uniques\")) as Map<string, bigint> },\n /**\n * Get a current value of the uniques map by key from box state\n */\n value: async (key: string): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"uniques\", key) as bigint | undefined },\n },\n /**\n * Get values from the entriesByAddress map in box state\n */\n entriesByAddress: {\n /**\n * Get all current values of the entriesByAddress map in box state\n */\n getMap: async (): Promise<Map<EntryKey, bigint>> => { return (await this.appClient.state.box.getMap(\"entriesByAddress\")) as Map<EntryKey, bigint> },\n /**\n * Get a current value of the entriesByAddress map by key from box state\n */\n value: async (key: EntryKey): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"entriesByAddress\", key) as bigint | undefined },\n },\n /**\n * Get values from the rewards map in box state\n */\n rewards: {\n /**\n * Get all current values of the rewards map in box state\n */\n getMap: async (): Promise<Map<bigint, Reward>> => { return (await this.appClient.state.box.getMap(\"rewards\")) as Map<bigint, Reward> },\n /**\n * Get a current value of the rewards map by key from box state\n */\n value: async (key: bigint | number): Promise<Reward | undefined> => { return await this.appClient.state.box.getMapValue(\"rewards\", key) as Reward | undefined },\n },\n /**\n * Get values from the disbursements map in box state\n */\n disbursements: {\n /**\n * Get all current values of the disbursements map in box state\n */\n getMap: async (): Promise<Map<bigint, Uint8Array>> => { return (await this.appClient.state.box.getMap(\"disbursements\")) as Map<bigint, Uint8Array> },\n /**\n * Get a current value of the disbursements map by key from box state\n */\n value: async (key: bigint | number): Promise<Uint8Array | undefined> => { return await this.appClient.state.box.getMapValue(\"disbursements\", key) as Uint8Array | undefined },\n },\n },\n }\n\n public newGroup(): StakingPoolComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a init()void method call against the StakingPool contract\n */\n init(params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.init(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the StakingPool contract\n */\n optIn(params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void method call against the StakingPool contract\n */\n addReward(params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addReward(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void method call against the StakingPool contract\n */\n addRewardAsa(params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addRewardAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a finalize(uint64,uint64,uint64)void method call against the StakingPool contract\n */\n finalize(params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalize(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void method call against the StakingPool contract\n */\n gatedEnter(params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedEnter(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a enter(pay,(uint64,uint64,byte[32][])[])void method call against the StakingPool contract\n */\n enter(params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.enter(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a startDisbursement(uint64)void method call against the StakingPool contract\n */\n startDisbursement(params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.startDisbursement(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a raffle(uint64)void method call against the StakingPool contract\n */\n raffle(params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.raffle(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a disburseRewards(uint64,uint64)void method call against the StakingPool contract\n */\n disburseRewards(params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.disburseRewards(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a finalizeDistribution(uint64)void method call against the StakingPool contract\n */\n finalizeDistribution(params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalizeDistribution(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a check(address,uint64)(bool,uint64) method call against the StakingPool contract\n */\n check(params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.check(params)))\n resultMappers.push((v) => client.decodeReturnValue('check(address,uint64)(bool,uint64)', v))\n return this\n },\n /**\n * Add a gateCheck(appl,address,uint64)void method call against the StakingPool contract\n */\n gateCheck(params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gateCheck(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a enterCost(address,uint64)uint64 method call against the StakingPool contract\n */\n enterCost(params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.enterCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('enterCost(address,uint64)uint64', v))\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the StakingPool contract\n */\n optInCost(params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost(uint64)uint64', v))\n return this\n },\n /**\n * Add a signUpsOpen()bool method call against the StakingPool contract\n */\n signUpsOpen(params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.signUpsOpen(params)))\n resultMappers.push((v) => client.decodeReturnValue('signUpsOpen()bool', v))\n return this\n },\n /**\n * Add a isLive()bool method call against the StakingPool contract\n */\n isLive(params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.isLive(params)))\n resultMappers.push((v) => client.decodeReturnValue('isLive()bool', v))\n return this\n },\n /**\n * Add a isEntered(address)bool method call against the StakingPool contract\n */\n isEntered(params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.isEntered(params)))\n resultMappers.push((v) => client.decodeReturnValue('isEntered(address)bool', v))\n return this\n },\n /**\n * Add a getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address) method call against the StakingPool contract\n */\n getState(params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getState(params)))\n resultMappers.push((v) => client.decodeReturnValue('getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)', v))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow(uint64)void method call against the StakingPool contract\n */\n updateAkitaDaoEscrow(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the StakingPool contract\n */\n updateAkitaDao(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a opUp()void method call against the StakingPool contract\n */\n opUp(params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a mbr(uint64)(uint64,uint64,uint64,uint64,uint64) method call against the StakingPool contract\n */\n mbr(params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n resultMappers.push((v) => client.decodeReturnValue('mbr(uint64)(uint64,uint64,uint64,uint64,uint64)', v))\n return this\n },\n get update() {\n return {\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n get delete() {\n return {\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the StakingPool contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as StakingPoolComposer\n }\n}\nexport type StakingPoolComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the init()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n init(params?: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['init()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addReward(params?: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | undefined]>\n\n /**\n * Calls the addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addRewardAsa(params?: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | undefined]>\n\n /**\n * Calls the finalize(uint64,uint64,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n finalize(params?: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['finalize(uint64,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gatedEnter(params?: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | undefined]>\n\n /**\n * Calls the enter(pay,(uint64,uint64,byte[32][])[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n enter(params?: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['enter(pay,(uint64,uint64,byte[32][])[])void'] | undefined]>\n\n /**\n * Calls the startDisbursement(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n startDisbursement(params?: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['startDisbursement(uint64)void'] | undefined]>\n\n /**\n * Calls the raffle(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n raffle(params?: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['raffle(uint64)void'] | undefined]>\n\n /**\n * Calls the disburseRewards(uint64,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n disburseRewards(params?: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['disburseRewards(uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the finalizeDistribution(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n finalizeDistribution(params?: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['finalizeDistribution(uint64)void'] | undefined]>\n\n /**\n * Calls the check(address,uint64)(bool,uint64) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n check(params?: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['check(address,uint64)(bool,uint64)'] | undefined]>\n\n /**\n * Calls the gateCheck(appl,address,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gateCheck(params?: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['gateCheck(appl,address,uint64)void'] | undefined]>\n\n /**\n * Calls the enterCost(address,uint64)uint64 ABI method.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n enterCost(params?: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['enterCost(address,uint64)uint64'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the signUpsOpen()bool ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n signUpsOpen(params?: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['signUpsOpen()bool'] | undefined]>\n\n /**\n * Calls the isLive()bool ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n isLive(params?: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['isLive()bool'] | undefined]>\n\n /**\n * Calls the isEntered(address)bool ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n isEntered(params?: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['isEntered(address)bool'] | undefined]>\n\n /**\n * Calls the getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n getState(params?: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['updateAkitaDAOEscrow(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Gets available delete methods\n */\n readonly delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the delete(address)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delete(params?: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['delete(address)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): StakingPoolComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): StakingPoolComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<StakingPoolComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<StakingPoolComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<StakingPoolComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<StakingPoolComposerResults<TReturns>>\n}\nexport type StakingPoolComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"StakingPoolFactory\",\"structs\":{\"RootKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"name\",\"type\":\"string\"}],\"StakingPoolMBRData\":[{\"name\":\"entries\",\"type\":\"uint64\"},{\"name\":\"uniques\",\"type\":\"uint64\"},{\"name\":\"entriesByAddress\",\"type\":\"uint64\"},{\"name\":\"rewards\",\"type\":\"uint64\"},{\"name\":\"disbursements\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"string\",\"name\":\"childVersion\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"newPool\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"(address,string)\",\"struct\":\"RootKey\",\"name\":\"stakeKey\"},{\"type\":\"uint64\",\"name\":\"minimumStakeAmount\"},{\"type\":\"bool\",\"name\":\"allowLateSignups\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"uint64\",\"name\":\"maxEntries\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deletePool\",\"args\":[{\"type\":\"uint64\",\"name\":\"appId\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"newPoolCost\",\"args\":[],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[{\"type\":\"uint64\",\"name\":\"winningTickets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64,uint64)\",\"struct\":\"StakingPoolMBRData\",\"desc\":\"the mbr created for each boxmap entry\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"initBoxedContract\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"size\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"loadBoxedContract\",\"args\":[{\"type\":\"uint64\",\"name\":\"offset\"},{\"type\":\"byte[]\",\"name\":\"data\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deleteBoxedContract\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"uint64\",\"name\":\"app\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":2},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"childContractVersion\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==\",\"desc\":\"the current version of the child contract\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow to use\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{\"boxedContract\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"YmM=\"}}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[636],\"errorMessage\":\"Box must have value\"},{\"pc\":[327,986],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[560,1389],\"errorMessage\":\"Contract not set\"},{\"pc\":[1614],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[1384],\"errorMessage\":\"Invalid call order\"},{\"pc\":[1477],\"errorMessage\":\"Invalid payment\"},{\"pc\":[849],\"errorMessage\":\"Invalid percentage\"},{\"pc\":[1044],\"errorMessage\":\"Not creator of the pool\"},{\"pc\":[120],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[241],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[1266,1287,1416,1561,1600,1644],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[620,922,1040,1285,1414,1451,1518,1559,1596,1642],\"errorMessage\":\"application exists\"},{\"pc\":[611],\"errorMessage\":\"assert target is match for conditions\"},{\"pc\":[569,616,666,802,1116,1130,1278,1407,1444,1448,1511,1515,1552,1588,1635],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[336,1316],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[420,436,503,1236,1579],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[539],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[447,456,531,547,555,991,1035,1178,1247,1301,1439,1506,1545,1628],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[511],\"errorMessage\":\"invalid number of bytes for uint8\"},{\"pc\":[520],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[490,1431],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiA0MDk2IDExNzA1MDAgMTAwMDAwCiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJiYyIgMHgxNTFmN2M3NSAiYWtpdGFfZXNjcm93IiAid2FsbGV0IiAweGM1M2IzMmNjICJ2ZXJzaW9uIiAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIgInN0YWtpbmdfZmVlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE4CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2xGYWN0b3J5IGV4dGVuZHMgY2xhc3NlcyhCYXNlU3Rha2luZ1Bvb2wsIEZhY3RvcnlDb250cmFjdCkgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE4CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2xGYWN0b3J5IGV4dGVuZHMgY2xhc3NlcyhCYXNlU3Rha2luZ1Bvb2wsIEZhY3RvcnlDb250cmFjdCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIwCiAgICBwdXNoYnl0ZXNzIDB4MmIyNWFjODkgMHhjNzQ3OGY5ZCAweDQ3MGM2ZWQ3IDB4YTRiM2U3ODkgLy8gbWV0aG9kICJuZXdQb29sKHBheSxzdHJpbmcsdWludDgsYWRkcmVzcywoYWRkcmVzcyxzdHJpbmcpLHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJkZWxldGVQb29sKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJuZXdQb29sQ29zdCgpdWludDY0IiwgbWV0aG9kICJtYnIodWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4ZGNhMmQ4NjIgMHhkMzQ2YjFhNCAweDM5NGVhZWIyIDB4MzNmNzg4MDggMHgxZWFkMjBhOSAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJsb2FkQm94ZWRDb250cmFjdCh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZUJveGVkQ29udHJhY3QoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPRXNjcm93KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBa2l0YURBTyh1aW50NjQpdm9pZCIsIG1ldGhvZCAib3BVcCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG5ld1Bvb2wgZGVsZXRlUG9vbCBuZXdQb29sQ29zdCBtYnIgaW5pdEJveGVkQ29udHJhY3QgbG9hZEJveGVkQ29udHJhY3QgZGVsZXRlQm94ZWRDb250cmFjdCBvcHRJbiBvcHRJbkNvc3QgdXBkYXRlQWtpdGFEQU9Fc2Nyb3cgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE4CiAgICBlcnIKCm1haW5fb3BVcF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQzCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbEZhY3RvcnkgZXh0ZW5kcyBjbGFzc2VzKEJhc2VTdGFraW5nUG9vbCwgRmFjdG9yeUNvbnRyYWN0KSB7CiAgICBwdXNoYnl0ZXMgMHhjNDI2ZjRiYSAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsc3RyaW5nLHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWZlcnJlck9yWmVyb0FkZHJlc3Mod2FsbGV0SUQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnJlZmVycmVyT3JaZXJvQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTYwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gcmVmZXJyZXJPclplcm9BZGRyZXNzKHdhbGxldElEOiBBcHBsaWNhdGlvbik6IEFjY291bnQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2MQogICAgLy8gcmV0dXJuIHJlZmVycmVyT3Iod2FsbGV0SUQsIEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTQKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogcmVmZXJyZXJPclplcm9BZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKCnJlZmVycmVyT3JaZXJvQWRkcmVzc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJlZmVycmVyT3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTYxCiAgICAvLyByZXR1cm4gcmVmZXJyZXJPcih3YWxsZXRJRCwgR2xvYmFsLnplcm9BZGRyZXNzKQogICAgc3dhcAogICAgcmV0c3ViCgpyZWZlcnJlck9yWmVyb0FkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3NQogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICBwdXNoYnl0ZXMgInJlZmVycmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjEKICAgIC8vIHJldHVybiByZWZlcnJlck9yKHdhbGxldElELCBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBiIHJlZmVycmVyT3JaZXJvQWRkcmVzc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJlZmVycmVyT3JANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogdWludDY0LCBhZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24sIGFkZHJlc3M6IEFjY291bnQpOiBBcHBsaWNhdGlvbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4M2MxYTZmMzMgLy8gbWV0aG9kICJnZXQoYWRkcmVzcylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1aW50OFtdKQogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICAhPQogICAgYnogZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lmX2Vsc2VANwoKZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2lmX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkyCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5NQogICAgLy8gcmV0dXJuIGJ0b2koZGF0YSkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgYiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREA4CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKc3BsaXRPcHRJbkNvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBzcGxpdE9wdEluQ291bnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBlc2Nyb3c6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIyCiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyNAogICAgLy8gaWYgKCFlc2Nyb3cuaXNPcHRlZEluKGFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDMKICAgIC8vIGNvbnN0IFtzcGxpdHNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNSZXZlbnVlU3BsaXRzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJyZXZlbnVlX3NwbGl0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI4CiAgICAvLyBjb3VudCArPSBzcGxpdHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo6U3Rha2luZ1Bvb2xGYWN0b3J5LmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjI0CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoyNgogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzQKICAgIC8vIGNoaWxkQ29udHJhY3RWZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogQmFzZUZhY3RvcnlHbG9iYWxTdGF0ZUtleUNoaWxkQ29udHJhY3RWZXJzaW9uIH0pCiAgICBieXRlYyA3IC8vICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MjcKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUgPSBjaGlsZFZlcnNpb24KICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MjgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18zIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoyOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFraXRhREFPRXNjcm93CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MjQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OlN0YWtpbmdQb29sRmFjdG9yeS5uZXdQb29sW3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3UG9vbDoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MzQtNDQKICAgIC8vIG5ld1Bvb2woCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdHlwZTogU3Rha2luZ1R5cGUsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gICBzdGFrZUtleTogUm9vdEtleSwKICAgIC8vICAgbWluaW11bVN0YWtlQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGFsbG93TGF0ZVNpZ251cHM6IGJvb2xlYW4sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXhFbnRyaWVzOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NDYKICAgIC8vIGFzc2VydCh0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzLCBFUlJfQ09OVFJBQ1RfTk9UX1NFVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENvbnRyYWN0IG5vdCBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjUxLTUzCiAgICAvLyBNQVhfUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVVaW50Q291bnQpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVCeXRlc0NvdW50KSArCiAgICBpbnRjIDUgLy8gMTE3MDUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NTQKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NTEtNTQKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZVVpbnRDb3VudCkgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZUJ5dGVzQ291bnQpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo1NwogICAgLy8gY29uc3QgeyBjcmVhdGlvbkZlZSB9ID0gZ2V0U3Rha2luZ0ZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCB7IGNyZWF0aW9uRmVlIH0gPSBnZXRTdGFraW5nRmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NzgKICAgIC8vIGNvbnN0IFtzdGFraW5nRmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1N0YWtpbmdGZWVzKSkKICAgIGJ5dGVjIDggLy8gInN0YWtpbmdfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCB7IGNyZWF0aW9uRmVlIH0gPSBnZXRTdGFraW5nRmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjU5CiAgICAvLyBsZXQgcmVmZXJyYWxNYnI6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MAogICAgLy8gaWYgKGNyZWF0aW9uRmVlID4gMCkgewogICAgYm56IG5ld1Bvb2xfaWZfYm9keUAyCiAgICBkaWcgMQoKbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2NS02NgogICAgLy8gY3JlYXRpb25GZWUgKwogICAgLy8gY2hpbGRNQlIgKwogICAgZGlnIDIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjY1LTY3CiAgICAvLyBjcmVhdGlvbkZlZSArCiAgICAvLyBjaGlsZE1CUiArCiAgICAvLyByZWZlcnJhbE1icgogICAgZGlnIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjcwLTc2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRvdGFsTUJSLAogICAgLy8gICB9CiAgICAvLyApCiAgICBkaWcgMTQKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjczCiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NzAtNzYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdG90YWxNQlIsCiAgICAvLyAgIH0KICAgIC8vICkKICAgID09CiAgICBkaWcgMQogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDMKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODAKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18zIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo4MAogICAgLy8gcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjc4LTgyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo3OC04MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IGFwcHJvdmFsU2l6ZSA9IHRoaXMuYm94ZWRDb250cmFjdC5sZW5ndGgKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODcKICAgIC8vIGNvbnN0IGNodW5rMSA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDAsIDQwOTYpCiAgICBpbnRjXzAgLy8gMAogICAgaW50YyA0IC8vIDQwOTYKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo4OAogICAgLy8gY29uc3QgY2h1bmsyID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoNDA5NiwgYXBwcm92YWxTaXplIC0gNDA5NikKICAgIHN3YXAKICAgIGludGMgNCAvLyA0MDk2CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODgKICAgIC8vIGNvbnN0IGNodW5rMiA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDQwOTYsIGFwcHJvdmFsU2l6ZSAtIDQwOTYpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo5NQogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjk2CiAgICAvLyB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIFNlbmRlcgogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMDQKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBwdXNoYnl0ZXMgMHhhMmYzYzU0NCAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDgsYWRkcmVzcywoYWRkcmVzcyx1aW50NjQpLGFkZHJlc3MsKGFkZHJlc3Msc3RyaW5nKSx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjQ4CiAgICAvLyBjb25zdCBwb29sID0gY29tcGlsZUFyYzQoU3Rha2luZ1Bvb2wpCiAgICBwdXNoaW50IDkgLy8gOQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEwOAogICAgLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo0OAogICAgLy8gY29uc3QgcG9vbCA9IGNvbXBpbGVBcmM0KFN0YWtpbmdQb29sKQogICAgcHVzaGJ5dGVzIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTExCiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMTMKICAgIC8vIHBvb2wuY2FsbC5pbml0KHsgYXBwSWQ6IG5ld1Bvb2xBcHAuaWQgfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDgzZjE0NzQ4IC8vIG1ldGhvZCAiaW5pdCgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MzQtNDQKICAgIC8vIG5ld1Bvb2woCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdHlwZTogU3Rha2luZ1R5cGUsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gICBzdGFrZUtleTogUm9vdEtleSwKICAgIC8vICAgbWluaW11bVN0YWtlQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGFsbG93TGF0ZVNpZ251cHM6IGJvb2xlYW4sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXhFbnRyaWVzOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbmV3UG9vbF9pZl9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gKHsgbGVmdG92ZXIsIHJlZmVycmFsTWJyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGNyZWF0aW9uRmVlKSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjYxCiAgICAvLyAoeyBsZWZ0b3ZlciwgcmVmZXJyYWxNYnIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgMCwgY3JlYXRpb25GZWUpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTIKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTywgVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5MwogICAgLy8gY29uc3QgcmVmZXJyZXIgPSByZWZlcnJlck9yWmVyb0FkZHJlc3Mod2FsbGV0KQogICAgY2FsbHN1YiByZWZlcnJlck9yWmVyb0FkZHJlc3MKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTk2CiAgICAvLyBpZiAoYW1vdW50ID4gMCAmJiByZWZlcnJlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBkaWcgMQogICAgYnogbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDE2CiAgICBkaWcgMTQKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IG5ld1Bvb2xfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2OAogICAgLy8gY29uc3QgW3dhbGxldEZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXRGZWVzKSkKICAgIGRpZyAxMwogICAgcHVzaGJ5dGVzICJ3YWxsZXRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTk4CiAgICAvLyBjb25zdCB7IHJlZmVycmVyUGVyY2VudGFnZSB9ID0gZ2V0V2FsbGV0RmVlcyhha2l0YURBTykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDgKICAgIC8vIGFzc2VydChwIDw9IERJVklTT1IsIEVSUl9JTlZBTElEX1BFUkNFTlRBR0UpCiAgICBkdXAKICAgIGludGMgNiAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwZXJjZW50YWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGRpZyAyCiAgICBtdWx3CiAgICBpbnRjIDYgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjAxCiAgICAvLyBpZiAocmVmZXJyYWxGZWUgPT09IDAgJiYgYW1vdW50ID4gMCkgewogICAgYm56IG5ld1Bvb2xfYWZ0ZXJfaWZfZWxzZUA5CiAgICBkaWcgMQogICAgYnogbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjAyCiAgICAvLyByZWZlcnJhbEZlZSA9IDEKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDEzCgpuZXdQb29sX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA4CiAgICAvLyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDkKICAgIC8vIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgT05FX1dFRUspLAogICAgZHVwCiAgICBwdXNoaW50IDYwNDgwMCAvLyA2MDQ4MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjEwCiAgICAvLyBbeyBhZGRyZXNzOiByZWZlcnJlciwgYW1vdW50OiByZWZlcnJhbEZlZSB9XSwKICAgIGRpZyAxNAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBkaWcgMTcKICAgIHB1c2hieXRlcyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjMKICAgIC8vIGxldCBjb3N0OiB1aW50NjQgPSBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyNTMwMCAvLyAyNTMwMAogICAgKgogICAgcHVzaGludCAzNTMwMCAvLyAzNTMwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI5CiAgICAvLyByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIGRpZyAxCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMAogICAgLy8gYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgZGlnIDEKICAgIGRpZyA1CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjgtNTMxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyNS01MzYKICAgIC8vIGlkID0gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICBhbGxvY2F0aW9ucwogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMgogICAgLy8gdGltZVRvVW5sb2NrLAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMwogICAgLy8gZXhwaXJhdGlvbiwKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDdiN2RjNWZjIC8vIG1ldGhvZCAiY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChwYXksdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU3NwogICAgLy8gcmV0dXJuIHsgaWQsIGNvc3QgfQogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwNS02MTMKICAgIC8vIGNvbnN0IHsgY29zdDogcmVmZXJyYWxNYnIgfSA9IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIGFraXRhREFPLAogICAgLy8gICBhc3NldCwKICAgIC8vICAgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfV0VFSyksCiAgICAvLyAgIFt7IGFkZHJlc3M6IHJlZmVycmVyLCBhbW91bnQ6IHJlZmVycmFsRmVlIH1dLAogICAgLy8gICByZWZlcnJhbEZlZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxNQogICAgLy8gcmV0dXJuIHsgbGVmdG92ZXI6IChhbW91bnQgLSByZWZlcnJhbEZlZSksIHJlZmVycmFsTWJyIH0KICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAoKbmV3UG9vbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNlbmRSZWZlcnJhbFBheW1lbnRAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gKHsgbGVmdG92ZXIsIHJlZmVycmFsTWJyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGNyZWF0aW9uRmVlKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMgogICAgYiBuZXdQb29sX2FmdGVyX2lmX2Vsc2VAMwoKbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MTgKICAgIC8vIHJldHVybiB7IGxlZnRvdmVyOiBhbW91bnQsIHJlZmVycmFsTWJyOiAwIH0KICAgIGRpZyAxCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gKHsgbGVmdG92ZXIsIHJlZmVycmFsTWJyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGNyZWF0aW9uRmVlKSkKICAgIGIgbmV3UG9vbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNlbmRSZWZlcnJhbFBheW1lbnRAMTcKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo6U3Rha2luZ1Bvb2xGYWN0b3J5LmRlbGV0ZVBvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVQb29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTE4CiAgICAvLyBkZWxldGVQb29sKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjExOQogICAgLy8gYXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0NSRUFUT1IpCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBjcmVhdG9yIG9mIHRoZSBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkdXAKICAgIHB1c2hieXRlcyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTIxCiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTIzLTEyNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZ1Bvb2wucHJvdG90eXBlLmRlbGV0ZT4oewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMjUKICAgIC8vIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEyMy0xMjcKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5kZWxldGU+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4YWI4YjIxM2EgLy8gbWV0aG9kICJkZWxldGUoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMjYKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbgogICAgcHVzaGludCA1IC8vIDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTIzLTEyNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZ1Bvb2wucHJvdG90eXBlLmRlbGV0ZT4oewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24KICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTI5LTEzMQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IHJlY2VpdmVyLCBhbW91bnQgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTI5LTEzMAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IHJlY2VpdmVyLCBhbW91bnQgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEyOS0xMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyByZWNlaXZlciwgYW1vdW50IH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjExOAogICAgLy8gZGVsZXRlUG9vbChhcHBJZDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo6U3Rha2luZ1Bvb2xGYWN0b3J5Lm5ld1Bvb2xDb3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3UG9vbENvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDAtMTQyCiAgICAvLyBNQVhfUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVVaW50Q291bnQpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVCeXRlc0NvdW50KSArCiAgICBpbnRjIDUgLy8gMTE3MDUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTQzCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0MC0xNDMKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZVVpbnRDb3VudCkgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZUJ5dGVzQ291bnQpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDYKICAgIC8vIGxldCByZWZlcnJhbE1icjogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgeyBjcmVhdGlvbkZlZSB9ID0gZ2V0U3Rha2luZ0ZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IHsgY3JlYXRpb25GZWUgfSA9IGdldFN0YWtpbmdGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo3OAogICAgLy8gY29uc3QgW3N0YWtpbmdGZWVzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzU3Rha2luZ0ZlZXMpKQogICAgYnl0ZWMgOCAvLyAic3Rha2luZ19mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCB7IGNyZWF0aW9uRmVlIH0gPSBnZXRTdGFraW5nRmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0OAogICAgLy8gaWYgKGNyZWF0aW9uRmVlID4gMCkgewogICAgYnogbmV3UG9vbENvc3RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDkKICAgIC8vIHJlZmVycmFsTWJyID0gcmVmZXJyYWxGZWUodGhpcy5ha2l0YURBTy52YWx1ZSwgMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0OQogICAgLy8gcmVmZXJyYWxNYnIgPSByZWZlcnJhbEZlZSh0aGlzLmFraXRhREFPLnZhbHVlLCAwKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTgxCiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8oYWtpdGFEQU8sIFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1ODIKICAgIC8vIGNvbnN0IHJlZmVycmVyID0gcmVmZXJyZXJPclplcm9BZGRyZXNzKHdhbGxldCkKICAgIGNhbGxzdWIgcmVmZXJyZXJPclplcm9BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU4NAogICAgLy8gaWYgKHJlZmVycmVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IG5ld1Bvb2xDb3N0X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1ODUKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCgpuZXdQb29sQ29zdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNTMtMTU0CiAgICAvLyBjcmVhdGlvbkZlZSArCiAgICAvLyBjaGlsZE1CUiArCiAgICBkdXAKICAgIGRpZyAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNTMtMTU1CiAgICAvLyBjcmVhdGlvbkZlZSArCiAgICAvLyBjaGlsZE1CUiArCiAgICAvLyByZWZlcnJhbE1icgogICAgZGlnIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEzNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpuZXdQb29sQ29zdF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ4NwogICAgLy8gbGV0IGNvc3Q6IHVpbnQ2NCA9IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9uc0xlbmd0aCkKICAgIHB1c2hpbnQgNjA2MDAgLy8gNjA2MDAKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTQ5CiAgICAvLyByZWZlcnJhbE1iciA9IHJlZmVycmFsRmVlKHRoaXMuYWtpdGFEQU8udmFsdWUsIDApCiAgICBiIG5ld1Bvb2xDb3N0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czo6QmFzZVN0YWtpbmdQb29sLm1icltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czoxMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjkKICAgIC8vIHJldHVybiBNaW5Qb29sUmV3YXJkc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIHdpbm5pbmdUaWNrZXRzKQogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MTUtMjEKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGVudHJpZXM6IFBvb2xFbnRyaWVzTUJSLAogICAgLy8gICB1bmlxdWVzOiBQb29sVW5pcXVlc01CUiwKICAgIC8vICAgZW50cmllc0J5QWRkcmVzczogUG9vbEVudHJpZXNCeUFkZHJlc3NNQlIsCiAgICAvLyAgIHJld2FyZHM6IHRoaXMucmV3YXJkc01icih3aW5uaW5nVGlja2V0cyksCiAgICAvLyAgIGRpc2J1cnNlbWVudHM6IFBvb2xEaXNidXJzZW1lbnRTTUJSCiAgICAvLyB9CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDA2MmQ0MDAwMDAwMDAwMDAwNDlkNDAwMDAwMDAwMDAwMDYyZDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjIwCiAgICAvLyBkaXNidXJzZW1lbnRzOiBQb29sRGlzYnVyc2VtZW50U01CUgogICAgcHVzaGludCA2MTAwIC8vIDYxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czoxNS0yMQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZW50cmllczogUG9vbEVudHJpZXNNQlIsCiAgICAvLyAgIHVuaXF1ZXM6IFBvb2xVbmlxdWVzTUJSLAogICAgLy8gICBlbnRyaWVzQnlBZGRyZXNzOiBQb29sRW50cmllc0J5QWRkcmVzc01CUiwKICAgIC8vICAgcmV3YXJkczogdGhpcy5yZXdhcmRzTWJyKHdpbm5pbmdUaWNrZXRzKSwKICAgIC8vICAgZGlzYnVyc2VtZW50czogUG9vbERpc2J1cnNlbWVudFNNQlIKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjEzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmluaXRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgNyAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQzCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0NAogICAgLy8gaWYgKCF0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKCmluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQyCiAgICAvLyBpbml0Qm94ZWRDb250cmFjdCh2ZXJzaW9uOiBzdHJpbmcsIHNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgc3dhcAogICAgYm94X3Jlc2l6ZQogICAgYiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmxvYWRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKbG9hZEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1MwogICAgLy8gbG9hZEJveGVkQ29udHJhY3Qob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1NAogICAgLy8gY29uc3QgZXhwZWN0ZWRQcmV2aW91c0NhbGxzOiB1aW50NjQgPSBvZmZzZXQgLyAyMDMyCiAgICBwdXNoaW50IDIwMzIgLy8gMjAzMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTUKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSBleHBlY3RlZFByZXZpb3VzQ2FsbHMgLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny01OQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MAogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkdXAKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjAKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjEKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjEKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICBieiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjYyCiAgICAvLyAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYyCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgLy8gJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTYtNjMKICAgIC8vIGFzc2VydCgoCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAgICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAgICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAgICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gICAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIC8vICAgJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgLy8gKSwgRVJSX0lOVkFMSURfQ0FMTF9PUkRFUikKICAgIGFzc2VydCAvLyBJbnZhbGlkIGNhbGwgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NAogICAgLy8gYXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ29udHJhY3Qgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY1CiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QucmVwbGFjZShvZmZzZXQsIGRhdGEpCiAgICBkaWcgMwogICAgZGlnIDMKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1MwogICAgLy8gbG9hZEJveGVkQ29udHJhY3Qob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBsb2FkQm94ZWRDb250cmFjdF9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmRlbGV0ZUJveGVkQ29udHJhY3Rbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NzAKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2OAogICAgLy8gZGVsZXRlQm94ZWRDb250cmFjdCgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdEluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUwCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUyCiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIGFzc2V0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUyCiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NC0xNjEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU3CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU0LTE2MQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAoMSArIGNvdW50KSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgMwogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTgKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDQKICAgICsKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NC0xNjEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTYzLTE2OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2NQogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2NgogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjMtMTY4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjMtMTY5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3NAogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3NAogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18zIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzQKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCkKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgKwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTcyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlRmVlR2VuZXJhdG9yQ29udHJhY3QudXBkYXRlQWtpdGFEQU9Fc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBT0VzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coYXBwOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzOAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFwcAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coYXBwOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIHB1c2hieXRlcyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTIKICAgIC8vIGFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhcHAgdXBncmFkZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MwogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gbmV3VmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type RootKey = {\n address: string,\n name: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RootKey to the struct representation\n */\nexport function RootKeyFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RootKey, APP_SPEC.structs) as RootKey\n}\n\nexport type StakingPoolMbrData = {\n entries: bigint,\n uniques: bigint,\n entriesByAddress: bigint,\n rewards: bigint,\n disbursements: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakingPoolMBRData to the struct representation\n */\nexport function StakingPoolMbrDataFromTuple(abiTuple: [bigint, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakingPoolMBRData, APP_SPEC.structs) as StakingPoolMbrData\n}\n\n/**\n * The argument types for the StakingPoolFactory contract\n */\nexport type StakingPoolFactoryArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,string,uint64,uint64)void': {\n version: string\n childVersion: string\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64': {\n payment: AppMethodCallTransactionArgument\n title: string\n type: bigint | number\n marketplace: string\n stakeKey: RootKey\n minimumStakeAmount: bigint | number\n allowLateSignups: boolean\n gateId: bigint | number\n maxEntries: bigint | number\n }\n 'deletePool(uint64)void': {\n appId: bigint | number\n }\n 'newPoolCost()uint64': Record<string, never>\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': {\n winningTickets: bigint | number\n }\n 'initBoxedContract(string,uint64)void': {\n version: string\n size: bigint | number\n }\n 'loadBoxedContract(uint64,byte[])void': {\n offset: bigint | number\n data: Uint8Array\n }\n 'deleteBoxedContract()void': Record<string, never>\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'updateAkitaDAOEscrow(uint64)void': {\n app: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,string,uint64,uint64)void': [version: string, childVersion: string, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64': [payment: AppMethodCallTransactionArgument, title: string, type: bigint | number, marketplace: string, stakeKey: RootKey, minimumStakeAmount: bigint | number, allowLateSignups: boolean, gateId: bigint | number, maxEntries: bigint | number]\n 'deletePool(uint64)void': [appId: bigint | number]\n 'newPoolCost()uint64': []\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': [winningTickets: bigint | number]\n 'initBoxedContract(string,uint64)void': [version: string, size: bigint | number]\n 'loadBoxedContract(uint64,byte[])void': [offset: bigint | number, data: Uint8Array]\n 'deleteBoxedContract()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'updateAkitaDAOEscrow(uint64)void': [app: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type StakingPoolFactoryReturns = {\n 'create(string,string,uint64,uint64)void': void\n 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64': bigint\n 'deletePool(uint64)void': void\n 'newPoolCost()uint64': bigint\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': StakingPoolMbrData\n 'initBoxedContract(string,uint64)void': void\n 'loadBoxedContract(uint64,byte[])void': void\n 'deleteBoxedContract()void': void\n 'optIn(pay,uint64)void': void\n 'optInCost(uint64)uint64': bigint\n 'updateAkitaDAOEscrow(uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the StakingPoolFactory smart contract.\n */\nexport type StakingPoolFactoryTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,string,uint64,uint64)void' | 'create', {\n argsObj: StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']\n returns: StakingPoolFactoryReturns['create(string,string,uint64,uint64)void']\n }>\n & Record<'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64' | 'newPool', {\n argsObj: StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']\n argsTuple: StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']\n returns: StakingPoolFactoryReturns['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']\n }>\n & Record<'deletePool(uint64)void' | 'deletePool', {\n argsObj: StakingPoolFactoryArgs['obj']['deletePool(uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']\n returns: StakingPoolFactoryReturns['deletePool(uint64)void']\n }>\n & Record<'newPoolCost()uint64' | 'newPoolCost', {\n argsObj: StakingPoolFactoryArgs['obj']['newPoolCost()uint64']\n argsTuple: StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']\n returns: StakingPoolFactoryReturns['newPoolCost()uint64']\n }>\n & Record<'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' | 'mbr', {\n argsObj: StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n argsTuple: StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n /**\n * the mbr created for each boxmap entry\n */\n returns: StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }>\n & Record<'initBoxedContract(string,uint64)void' | 'initBoxedContract', {\n argsObj: StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']\n returns: StakingPoolFactoryReturns['initBoxedContract(string,uint64)void']\n }>\n & Record<'loadBoxedContract(uint64,byte[])void' | 'loadBoxedContract', {\n argsObj: StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void']\n argsTuple: StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']\n returns: StakingPoolFactoryReturns['loadBoxedContract(uint64,byte[])void']\n }>\n & Record<'deleteBoxedContract()void' | 'deleteBoxedContract', {\n argsObj: StakingPoolFactoryArgs['obj']['deleteBoxedContract()void']\n argsTuple: StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']\n returns: StakingPoolFactoryReturns['deleteBoxedContract()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']\n returns: StakingPoolFactoryReturns['optIn(pay,uint64)void']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64']\n argsTuple: StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']\n returns: StakingPoolFactoryReturns['optInCost(uint64)uint64']\n }>\n & Record<'updateAkitaDAOEscrow(uint64)void' | 'updateAkitaDAOEscrow', {\n argsObj: StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']\n returns: StakingPoolFactoryReturns['updateAkitaDAOEscrow(uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: StakingPoolFactoryArgs['obj']['update(string)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['update(string)void']\n returns: StakingPoolFactoryReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: StakingPoolFactoryReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: StakingPoolFactoryArgs['obj']['opUp()void']\n argsTuple: StakingPoolFactoryArgs['tuple']['opUp()void']\n returns: StakingPoolFactoryReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the current version of the child contract\n */\n childContractVersion: string\n /**\n * the app ID for the akita DAO escrow to use\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {\n boxedContract: BinaryState\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type StakingPoolFactorySignatures = keyof StakingPoolFactoryTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type StakingPoolFactoryNonVoidMethodSignatures = keyof StakingPoolFactoryTypes['methods'] extends infer T ? T extends keyof StakingPoolFactoryTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the StakingPoolFactory smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends StakingPoolFactorySignatures> = StakingPoolFactoryTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the StakingPoolFactory smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends StakingPoolFactorySignatures> = StakingPoolFactoryTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = StakingPoolFactoryTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = StakingPoolFactoryTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type StakingPoolFactoryCreateCallParams =\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create(string,string,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type StakingPoolFactoryUpdateCallParams =\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type StakingPoolFactoryDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * 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)\n */\n createParams?: StakingPoolFactoryCreateCallParams\n /**\n * Update 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)\n */\n updateParams?: StakingPoolFactoryUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the StakingPoolFactory smart contract\n */\nexport abstract class StakingPoolFactoryParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends StakingPoolFactoryCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,string,uint64,uint64)void':\n return StakingPoolFactoryParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the StakingPoolFactory smart contract using the create(string,string,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,string,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends StakingPoolFactoryUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return StakingPoolFactoryParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the StakingPoolFactory smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static newPool(params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.title, params.args.type, params.args.marketplace, params.args.stakeKey, params.args.minimumStakeAmount, params.args.allowLateSignups, params.args.gateId, params.args.maxEntries],\n }\n }\n /**\n * Constructs a no op call for the deletePool(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deletePool(params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deletePool(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.appId],\n }\n }\n /**\n * Constructs a no op call for the newPoolCost()uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static newPoolCost(params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'newPoolCost()uint64' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.winningTickets],\n }\n }\n /**\n * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static initBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'initBoxedContract(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size],\n }\n }\n /**\n * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static loadBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'loadBoxedContract(uint64,byte[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data],\n }\n }\n /**\n * Constructs a no op call for the deleteBoxedContract()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteBoxedContract()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.app],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the StakingPoolFactory smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class StakingPoolFactoryFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `StakingPoolFactoryFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new StakingPoolFactoryClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new StakingPoolFactoryClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the StakingPoolFactory smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: StakingPoolFactoryDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? StakingPoolFactoryParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (StakingPoolFactoryCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? StakingPoolFactoryParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (StakingPoolFactoryUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new StakingPoolFactoryClient(result.appClient) }\n }\n\n /**\n * 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.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPoolFactory smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(StakingPoolFactoryParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(StakingPoolFactoryParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPoolFactory smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(StakingPoolFactoryParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPoolFactory smart contract using an ABI method call using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(StakingPoolFactoryParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | StakingPoolFactoryReturns['create(string,string,uint64,uint64)void']) }, appClient: new StakingPoolFactoryClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the StakingPoolFactory smart contract\n */\nexport class StakingPoolFactoryClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `StakingPoolFactoryClient`\n *\n * @param appClient An `AppClient` instance which has been created with the StakingPoolFactory app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `StakingPoolFactoryClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends StakingPoolFactoryNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `StakingPoolFactoryClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<StakingPoolFactoryClient> {\n return new StakingPoolFactoryClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `StakingPoolFactoryClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<StakingPoolFactoryClient> {\n return new StakingPoolFactoryClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(StakingPoolFactoryParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n newPool: (params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.newPool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deletePool(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deletePool: (params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.deletePool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n newPoolCost: (params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n initBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n loadBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(StakingPoolFactoryParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n newPool: (params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.newPool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deletePool(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deletePool: (params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.deletePool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n newPoolCost: (params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n initBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n loadBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(StakingPoolFactoryParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n newPool: async (params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.newPool(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deletePool(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deletePool: async (params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.deletePool(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['deletePool(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n newPoolCost: async (params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['newPoolCost()uint64'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n mbr: async (params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n initBoxedContract: async (params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.initBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['initBoxedContract(string,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n loadBoxedContract: async (params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.loadBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['loadBoxedContract(uint64,byte[])void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteBoxedContract: async (params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.deleteBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['deleteBoxedContract()void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['updateAkitaDAOEscrow(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['opUp()void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new StakingPoolFactoryClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async newPoolCost(params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n return result.return as unknown as StakingPoolFactoryReturns['newPoolCost()uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n async mbr(params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.mbr(params))\n return result.return as unknown as StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.optInCost(params))\n return result.return as unknown as StakingPoolFactoryReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Methods to access state for the current StakingPoolFactory app\n */\n state = {\n /**\n * Methods to access global state for the current StakingPoolFactory app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n childContractVersion: result.childContractVersion,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the childContractVersion key in global state\n */\n childContractVersion: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"childContractVersion\")) as string | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current StakingPoolFactory app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n boxedContract: new BinaryStateValue(result.boxedContract),\n }\n },\n /**\n * Get the current value of the boxedContract key in box state\n */\n boxedContract: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.box.getValue(\"boxedContract\")) as Uint8Array | undefined) },\n },\n }\n\n public newGroup(): StakingPoolFactoryComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64 method call against the StakingPoolFactory contract\n */\n newPool(params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.newPool(params)))\n resultMappers.push((v) => client.decodeReturnValue('newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64', v))\n return this\n },\n /**\n * Add a deletePool(uint64)void method call against the StakingPoolFactory contract\n */\n deletePool(params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deletePool(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a newPoolCost()uint64 method call against the StakingPoolFactory contract\n */\n newPoolCost(params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.newPoolCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('newPoolCost()uint64', v))\n return this\n },\n /**\n * Add a mbr(uint64)(uint64,uint64,uint64,uint64,uint64) method call against the StakingPoolFactory contract\n */\n mbr(params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n resultMappers.push((v) => client.decodeReturnValue('mbr(uint64)(uint64,uint64,uint64,uint64,uint64)', v))\n return this\n },\n /**\n * Add a initBoxedContract(string,uint64)void method call against the StakingPoolFactory contract\n */\n initBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a loadBoxedContract(uint64,byte[])void method call against the StakingPoolFactory contract\n */\n loadBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteBoxedContract()void method call against the StakingPoolFactory contract\n */\n deleteBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the StakingPoolFactory contract\n */\n optIn(params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the StakingPoolFactory contract\n */\n optInCost(params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost(uint64)uint64', v))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow(uint64)void method call against the StakingPoolFactory contract\n */\n updateAkitaDaoEscrow(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the StakingPoolFactory contract\n */\n updateAkitaDao(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a opUp()void method call against the StakingPoolFactory contract\n */\n opUp(params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n get update() {\n return {\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the StakingPoolFactory contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as StakingPoolFactoryComposer\n }\n}\nexport type StakingPoolFactoryComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n newPool(params?: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | undefined]>\n\n /**\n * Calls the deletePool(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deletePool(params?: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['deletePool(uint64)void'] | undefined]>\n\n /**\n * Calls the newPoolCost()uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n newPoolCost(params?: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['newPoolCost()uint64'] | undefined]>\n\n /**\n * Calls the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Calls the initBoxedContract(string,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n initBoxedContract(params?: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['initBoxedContract(string,uint64)void'] | undefined]>\n\n /**\n * Calls the loadBoxedContract(uint64,byte[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n loadBoxedContract(params?: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['loadBoxedContract(uint64,byte[])void'] | undefined]>\n\n /**\n * Calls the deleteBoxedContract()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteBoxedContract(params?: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['deleteBoxedContract()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['updateAkitaDAOEscrow(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['opUp()void'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): StakingPoolFactoryComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): StakingPoolFactoryComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<StakingPoolFactoryComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<StakingPoolFactoryComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<StakingPoolFactoryComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<StakingPoolFactoryComposerResults<TReturns>>\n}\nexport type StakingPoolFactoryComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { StakingPoolFactoryArgs, StakingPoolFactoryClient, StakingPoolFactoryFactory } from '../generated/StakingPoolFactoryClient'\nimport { MaybeSigner, NewContractSDKParams } from '../types';\nimport { StakingPoolSDK } from './index';\nimport { BaseSDK } from '../base';\nimport { ENV_VAR_NAMES } from '../config';\nimport { emptySigner } from '../constants';\nimport { microAlgo, microAlgos } from '@algorandfoundation/algokit-utils';\nimport { NewPoolParams, DeletePoolParams, StakingPoolMbrParams } from './types';\nimport { StakingPoolMbrData } from '../generated/StakingPoolClient';\n\nexport type StakingPoolFactoryContractArgs = StakingPoolFactoryArgs[\"obj\"];\n\n/**\n * SDK for interacting with the Staking Pool Factory contract.\n * Used to create new staking pools and manage pool templates.\n */\nexport class StakingPoolFactorySDK extends BaseSDK<StakingPoolFactoryClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: StakingPoolFactoryFactory, ...params }, ENV_VAR_NAMES.STAKING_POOL_FACTORY_APP_ID);\n }\n\n /**\n * Creates a new staking pool via the factory and returns a StakingPoolSDK instance.\n * @returns StakingPoolSDK for the newly created pool\n */\n async new({\n sender,\n signer,\n title,\n type,\n marketplace,\n stakeKey,\n minimumStakeAmount,\n allowLateSignups = false,\n gateId = 0n,\n maxEntries = 0n\n }: NewPoolParams): Promise<StakingPoolSDK> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const poolCost = await this.cost();\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(poolCost),\n receiver: this.client.appAddress,\n });\n\n const group = this.client.newGroup();\n\n group.newPool({\n ...sendParams,\n args: {\n payment,\n title,\n type,\n marketplace,\n stakeKey,\n minimumStakeAmount,\n allowLateSignups,\n gateId,\n maxEntries\n }\n });\n\n // Add opUp calls to get more reference slots for impact/social contract calls\n group.opUp({\n ...sendParams,\n args: {},\n maxFee: microAlgos(1_000),\n });\n group.opUp({\n ...sendParams,\n args: {},\n maxFee: microAlgos(1_000),\n note: '1'\n });\n\n const result = await group.send({ populateAppCallResources: true, coverAppCallInnerTransactionFees: true });\n \n // Extract appId from the newPool call result\n const appId = result.returns[0] as bigint | undefined;\n\n if (appId === undefined) {\n throw new Error('Failed to create new staking pool');\n }\n\n return new StakingPoolSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: sendParams.sender,\n defaultSigner: sendParams.signer\n }\n });\n }\n\n /**\n * Gets a StakingPoolSDK instance for an existing pool.\n * Note: Cannot be static as it requires instance properties (algorand, sendParams).\n * @param appId - The app ID of the pool\n * @returns StakingPoolSDK for the specified pool\n */\n get({ appId }: { appId: bigint }): StakingPoolSDK {\n return new StakingPoolSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: this.sendParams.sender,\n defaultSigner: this.sendParams.signer\n }\n });\n }\n\n /**\n * Gets the cost to create a new staking pool.\n */\n async cost(params?: MaybeSigner): Promise<bigint> {\n\n const sendParams = this.getSendParams({\n sender: this.readerAccount,\n signer: emptySigner,\n ...params\n });\n\n const cost = await this.client.newPoolCost({\n ...sendParams,\n args: {}\n });\n\n return cost;\n }\n\n /**\n * Deletes a pool created by this factory.\n */\n async deletePool({ sender, signer, appId }: DeletePoolParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.deletePool({\n ...sendParams,\n args: { appId }\n });\n }\n\n /**\n * Gets MBR (Minimum Balance Requirement) data for pool operations.\n */\n async getMbr({ winningTickets }: StakingPoolMbrParams): Promise<StakingPoolMbrData> {\n return await this.client.mbr({ args: { winningTickets } });\n }\n}\n\n/**\n * Convenience function to create a new staking pool and return the SDK.\n * Creates a factory SDK, creates the pool, and returns the pool SDK.\n */\nexport async function newStakingPool({\n factoryParams,\n algorand,\n readerAccount,\n sendParams,\n ...poolParams\n}: NewContractSDKParams & NewPoolParams): Promise<StakingPoolSDK> {\n const factory = new StakingPoolFactorySDK({ factoryParams, algorand, readerAccount, sendParams });\n return await factory.new(poolParams);\n}","import { MaybeSigner } from \"../types\";\nimport {\n StakingPoolArgs,\n StakingPoolState,\n Reward,\n RootKey,\n FunderInfo,\n StakingPoolMbrData,\n EntryData\n} from '../generated/StakingPoolClient';\nimport { StakingPoolFactoryArgs } from '../generated/StakingPoolFactoryClient';\nimport { AppCallMethodCall } from \"@algorandfoundation/algokit-utils/types/composer\";\n\n// Re-export types from generated clients for convenience\nexport { StakingPoolState, Reward, RootKey, FunderInfo, StakingPoolMbrData, EntryData };\n\n// Pool Factory Types\ntype FactoryContractArgs = StakingPoolFactoryArgs[\"obj\"];\n\nexport type NewPoolParams = MaybeSigner & Omit<FactoryContractArgs['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'], 'payment'>;\n\nexport type DeletePoolParams = MaybeSigner & FactoryContractArgs['deletePool(uint64)void'];\n\n// Individual Pool Types \ntype PoolContractArgs = StakingPoolArgs[\"obj\"];\n\nexport type AddRewardParams = MaybeSigner & Omit<PoolContractArgs['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'], 'payment'>;\n\nexport type AddRewardAsaParams = MaybeSigner & Omit<PoolContractArgs['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'], 'payment' | 'assetXfer'> & {\n /** the asset ID of the reward */\n asset: bigint;\n /** The amount of the asset to transfer for the reward */\n amount: bigint;\n};\n\nexport type FinalizePoolParams = MaybeSigner & PoolContractArgs['finalize(uint64,uint64,uint64)void'];\n\nexport type Entry = {\n /** The asset ID being staked */\n asset: bigint | number;\n /** The amount being entered */\n amount: bigint | number;\n /** Optional merkle proofs for gated entry */\n proofs?: Uint8Array[];\n};\n\nexport type EnterPoolParams = MaybeSigner & {\n /** Array of entries (asset, amount, optional proofs) */\n entries: Entry[];\n /** Optional additional arguments for gated entry */\n gateTxn?: AppCallMethodCall\n};\n\nexport type StartDisbursementParams = MaybeSigner & PoolContractArgs['startDisbursement(uint64)void'];\n\nexport type RaffleParams = MaybeSigner & PoolContractArgs['raffle(uint64)void'];\n\nexport type DisburseRewardsParams = MaybeSigner & PoolContractArgs['disburseRewards(uint64,uint64)void'];\n\nexport type FinalizeDistributionParams = MaybeSigner & PoolContractArgs['finalizeDistribution(uint64)void'];\n\nexport type OptinAssetParams = MaybeSigner & Omit<PoolContractArgs['optIn(pay,uint64)void'], 'payment'>;\n\nexport type CheckParams = PoolContractArgs['check(address,uint64)(bool,uint64)'];\n\nexport type GateCheckParams = PoolContractArgs['gateCheck(appl,address,uint64)void'];\n\nexport type CheckResult = {\n isEligible: boolean;\n stake: bigint;\n};\n\nexport type IsEnteredParams = PoolContractArgs['isEntered(address)bool'];\n\nexport type StakingPoolMbrParams = PoolContractArgs['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'];\n\n\nexport enum PoolStatus {\n Draft = 0,\n Final = 10\n}\n\nexport enum StakingPoolStakingType {\n NONE = 0,\n HEARTBEAT = 10,\n SOFT = 20,\n HARD = 30,\n LOCK = 40\n}\n\nexport enum DistributionType {\n Percentage = 10,\n Flat = 20,\n Even = 30,\n Shuffle = 40,\n}\n\nexport enum DisbursementPhase {\n Idle = 0,\n Preparation = 10,\n Allocation = 20,\n Finalization = 30\n}"]}
1
+ {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-HIDVSX3C.js","../src/staking-pool/index.ts","../src/generated/StakingPoolClient.ts","../src/generated/StakingPoolFactoryClient.ts","../src/staking-pool/factory.ts","../src/staking-pool/types.ts"],"names":["APP_SPEC","BinaryStateValue","_AppFactory","_AppClient","getArc56ReturnValue","PoolStatus","StakingPoolStakingType","DistributionType","DisbursementPhase","microAlgo"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-HIDVSX3C.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport {\n StakingPoolClient,\n StakingPoolFactory,\n StakingPoolArgs,\n StakingPoolState,\n StakingPoolMbrData,\n Reward\n} from '../generated/StakingPoolClient';\nimport { GroupReturn, MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n AddRewardParams,\n AddRewardAsaParams,\n FinalizePoolParams,\n EnterPoolParams,\n StartDisbursementParams,\n RaffleParams,\n DisburseRewardsParams,\n FinalizeDistributionParams,\n OptinAssetParams,\n CheckParams,\n CheckResult,\n IsEnteredParams,\n StakingPoolMbrParams,\n GateCheckParams\n} from \"./types\";\n\nexport * from \"./factory\";\nexport * from \"./types\";\n\ntype PoolContractArgs = StakingPoolArgs[\"obj\"];\n\n/**\n * SDK for interacting with an individual Staking Pool contract.\n * Use this to manage pool state, add rewards, and handle entries.\n */\nexport class StakingPoolSDK extends BaseSDK<StakingPoolClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: StakingPoolFactory, ...params });\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current state of the pool.\n */\n async getState(): Promise<StakingPoolState> {\n const { return: state } = await this.client.send.getState({ args: {} });\n\n if (state === undefined) {\n throw new Error('Failed to get pool state');\n }\n\n return state;\n }\n\n /**\n * Checks if pool signups are currently open.\n */\n async signUpsOpen(): Promise<boolean> {\n const isOpen = await this.client.signUpsOpen();\n return isOpen ?? false;\n }\n\n /**\n * Checks if the pool is currently live (active).\n */\n async isLive(): Promise<boolean> {\n const isLive = await this.client.isLive();\n return isLive ?? false;\n }\n\n /**\n * Checks if an address is entered in the pool.\n */\n async isEntered({ address }: IsEnteredParams): Promise<boolean> {\n const entered = await this.client.isEntered({ args: { address } });\n return entered ?? false;\n }\n\n /**\n * Checks eligibility and stake amount for an address/asset combination.\n */\n async check({ address, asset }: CheckParams): Promise<CheckResult> {\n const { return: result } = await this.client.send.check({ args: { address, asset } });\n\n if (result === undefined) {\n throw new Error('Failed to check eligibility');\n }\n\n return {\n isEligible: result.valid,\n stake: result.balance\n };\n }\n\n async gateCheck({ gateTxn, address, asset }: GateCheckParams): Promise<void> {\n \n \n await this.client.send.gateCheck({ args: { gateTxn, address, asset } });\n }\n\n /**\n * Gets MBR data for the pool based on winning tickets count.\n */\n async getMbr({ winningTickets }: StakingPoolMbrParams): Promise<StakingPoolMbrData> {\n const { return: mbrData } = await this.client.send.mbr({ args: { winningTickets } });\n\n if (mbrData === undefined) {\n throw new Error('Failed to get MBR data');\n }\n\n return mbrData;\n }\n\n\n async getReward(rewardId: number): Promise<Reward> {\n const reward = await this.client.state.box.rewards.value(rewardId);\n\n if (reward === undefined) {\n throw new Error('Failed to get reward');\n }\n\n return reward;\n }\n\n async getRewards(): Promise<Map<number, Reward>> {\n const rewards = await this.client.state.box.rewards.getMap();\n return new Map(Array.from(rewards.entries()).map(([key, value]) => [Number(key), value]));\n }\n\n // ========== Write Methods ==========\n\n /**\n * Initializes the pool after creation.\n */\n async init(params?: MaybeSigner): Promise<void> {\n const sendParams = this.getSendParams(params);\n\n await this.client.send.init({\n ...sendParams,\n args: {}\n });\n }\n\n /**\n * Opts the pool contract into an asset.\n */\n async optIn({ sender, signer, asset }: OptinAssetParams): Promise<GroupReturn> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.client.optInCost({ args: { asset } });\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n const group = this.client.newGroup();\n\n group.optIn({\n ...sendParams,\n args: {\n payment,\n asset\n }\n });\n\n group.opUp({\n ...sendParams,\n args: {},\n });\n\n return await group.send({ ...sendParams, });\n }\n\n /**\n * Adds a reward to the pool.\n */\n async addReward({ sender, signer, reward, amount }: AddRewardAsaParams): Promise<void> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get MBR for reward\n const mbrData = await this.getMbr({ winningTickets: reward.winnerCount });\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.rewards),\n receiver: this.client.appAddress,\n });\n\n const assetXfer = this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(reward.asset),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.addRewardAsa({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n reward\n }\n });\n }\n\n /**\n * Finalizes the pool with signup, start, and end timestamps.\n */\n async finalize({ sender, signer, signupTimestamp, startTimestamp, endTimestamp }: FinalizePoolParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.finalize({\n ...sendParams,\n args: {\n signupTimestamp,\n startTimestamp,\n endTimestamp\n }\n });\n }\n\n /**\n * Gets the cost to enter the pool for a given address and entry count.\n * This calls the contract's enterCost method which accounts for box MBR and any pool funding shortfall.\n */\n async enterCost({ address, entryCount }: { address: string; entryCount: number }): Promise<bigint> {\n return await this.client.enterCost({\n args: { address, entryCount }\n });\n }\n\n /**\n * Enters the pool with specified entries.\n */\n async enter({ sender, signer, entries, gateTxn }: EnterPoolParams): Promise<void> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get the total cost from the contract (includes box MBR + any pool funding shortfall)\n const paymentAmount = await this.enterCost({\n address: sendParams.sender.toString(),\n entryCount: entries.length\n });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(paymentAmount),\n receiver: this.client.appAddress,\n });\n\n // Transform entries to the expected format\n const formattedEntries: [bigint | number, bigint | number, Uint8Array[]][] = entries.map(e => [\n e.asset,\n e.amount,\n e.proofs ?? []\n ]);\n\n const isGated = gateTxn !== undefined;\n\n if (isGated) {\n await this.client.send.gatedEnter({\n ...sendParams,\n extraFee: microAlgo(1000 * entries.length), // Cover inner transactions to Staking contract\n args: {\n payment,\n gateTxn,\n entries: formattedEntries,\n }\n });\n } else {\n await this.client.send.enter({\n ...sendParams,\n extraFee: microAlgo(1000 * entries.length), // Cover inner transactions to Staking contract\n args: {\n payment,\n entries: formattedEntries,\n }\n });\n }\n }\n\n /**\n * Starts the disbursement phase for a reward.\n */\n async startDisbursement({ sender, signer, rewardId }: StartDisbursementParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.startDisbursement({\n ...sendParams,\n args: { rewardId }\n });\n }\n\n /**\n * Runs a raffle for a raffle-type reward.\n */\n async raffle({ sender, signer, rewardId }: RaffleParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.raffle({\n ...sendParams,\n args: { rewardId }\n });\n }\n\n /**\n * Disburses rewards to participants.\n */\n async disburseRewards({ sender, signer, rewardId, iterationAmount }: DisburseRewardsParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.disburseRewards({\n ...sendParams,\n args: {\n rewardId,\n iterationAmount\n }\n });\n }\n\n /**\n * Finalizes the distribution for a reward.\n */\n async finalizeDistribution({ sender, signer, rewardId }: FinalizeDistributionParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.finalizeDistribution({\n ...sendParams,\n args: { rewardId }\n });\n }\n\n /**\n * Updates the Akita DAO escrow reference.\n */\n async updateAkitaDAOEscrow({ sender, signer, app }: MaybeSigner & PoolContractArgs['updateAkitaDAOEscrow(uint64)void']): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDaoEscrow({\n ...sendParams,\n args: { app }\n });\n }\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDAO({ sender, signer, akitaDao }: MaybeSigner & PoolContractArgs['updateAkitaDAO(uint64)void']): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao }\n });\n }\n}\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"StakingPool\",\"structs\":{\"ObjectC3416591\":[{\"name\":\"valid\",\"type\":\"bool\"},{\"name\":\"balance\",\"type\":\"uint64\"}],\"RootKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"name\",\"type\":\"string\"}],\"AddRewardParams\":[{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"distribution\",\"type\":\"uint8\"},{\"name\":\"rate\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"},{\"name\":\"interval\",\"type\":\"uint64\"},{\"name\":\"winnerCount\",\"type\":\"uint64\"}],\"EntryData\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"quantity\",\"type\":\"uint64\"},{\"name\":\"gateArgs\",\"type\":\"byte[][]\"},{\"name\":\"disqualified\",\"type\":\"bool\"}],\"EntryKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"}],\"RaffleCursor\":[{\"name\":\"ticket\",\"type\":\"uint64\"},{\"name\":\"stake\",\"type\":\"uint64\"},{\"name\":\"disbursed\",\"type\":\"uint64\"}],\"Reward\":[{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"distribution\",\"type\":\"uint8\"},{\"name\":\"rate\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"},{\"name\":\"interval\",\"type\":\"uint64\"},{\"name\":\"qualifiedStakers\",\"type\":\"uint64\"},{\"name\":\"qualifiedStake\",\"type\":\"uint64\"},{\"name\":\"winnerCount\",\"type\":\"uint64\"},{\"name\":\"winningTickets\",\"type\":\"uint64[]\"},{\"name\":\"raffleCursor\",\"type\":\"RaffleCursor\"},{\"name\":\"vrfFailureCount\",\"type\":\"uint64\"},{\"name\":\"phase\",\"type\":\"uint8\"},{\"name\":\"disbursementCursor\",\"type\":\"uint64\"},{\"name\":\"activeDisbursementId\",\"type\":\"uint64\"},{\"name\":\"activeDisbursementRoundStart\",\"type\":\"uint64\"},{\"name\":\"lastDisbursementTimestamp\",\"type\":\"uint64\"}],\"StakingPoolMBRData\":[{\"name\":\"entries\",\"type\":\"uint64\"},{\"name\":\"uniques\",\"type\":\"uint64\"},{\"name\":\"entriesByAddress\",\"type\":\"uint64\"},{\"name\":\"rewards\",\"type\":\"uint64\"},{\"name\":\"disbursements\",\"type\":\"uint64\"}],\"StakingPoolState\":[{\"name\":\"status\",\"type\":\"uint8\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"uint8\"},{\"name\":\"signupTimestamp\",\"type\":\"uint64\"},{\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"name\":\"allowLateSignups\",\"type\":\"bool\"},{\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"name\":\"maxEntries\",\"type\":\"uint64\"},{\"name\":\"entryCount\",\"type\":\"uint64\"},{\"name\":\"rewardCount\",\"type\":\"uint64\"},{\"name\":\"totalStaked\",\"type\":\"uint64\"},{\"name\":\"stakeKey\",\"type\":\"RootKey\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint64\"},{\"name\":\"gateId\",\"type\":\"uint64\"},{\"name\":\"creator\",\"type\":\"address\"}],\"FunderInfo\":[{\"name\":\"account\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"address\",\"name\":\"creator\"},{\"type\":\"(address,uint64)\",\"struct\":\"FunderInfo\",\"name\":\"funder\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"(address,string)\",\"struct\":\"RootKey\",\"name\":\"stakeKey\"},{\"type\":\"uint64\",\"name\":\"minimumStakeAmount\"},{\"type\":\"bool\",\"name\":\"allowLateSignups\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"uint64\",\"name\":\"maxEntries\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"init\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delete\",\"args\":[{\"type\":\"address\",\"name\":\"caller\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\",\"events\":[],\"recommendations\":{}},{\"name\":\"addReward\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"(uint64,uint8,uint64,uint64,uint64,uint64)\",\"struct\":\"AddRewardParams\",\"name\":\"reward\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"addRewardAsa\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"(uint64,uint8,uint64,uint64,uint64,uint64)\",\"struct\":\"AddRewardParams\",\"name\":\"reward\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"finalize\",\"args\":[{\"type\":\"uint64\",\"name\":\"signupTimestamp\"},{\"type\":\"uint64\",\"name\":\"startTimestamp\"},{\"type\":\"uint64\",\"name\":\"endTimestamp\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedEnter\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"(uint64,uint64,byte[32][])[]\",\"name\":\"entries\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"enter\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"(uint64,uint64,byte[32][])[]\",\"name\":\"entries\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"startDisbursement\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"raffle\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"disburseRewards\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"},{\"type\":\"uint64\",\"name\":\"iterationAmount\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"finalizeDistribution\",\"args\":[{\"type\":\"uint64\",\"name\":\"rewardID\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"check\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(bool,uint64)\",\"struct\":\"ObjectC3416591\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gateCheck\",\"args\":[{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"enterCost\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"The address that will be entering\"},{\"type\":\"uint64\",\"name\":\"entryCount\",\"desc\":\"The number of entries being added\"}],\"returns\":{\"type\":\"uint64\",\"desc\":\"The total payment amount needed (includes box MBR + any shortfall to meet min balance)\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"desc\":\"Calculates the total cost required to enter the pool\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"signUpsOpen\",\"args\":[],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean of whether sign ups are open\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"isLive\",\"args\":[],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean of whether the pool is live\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"isEntered\",\"args\":[{\"type\":\"address\",\"name\":\"address\"}],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean indicating if the address has entered the staking pool\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getState\",\"args\":[],\"returns\":{\"type\":\"(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)\",\"struct\":\"StakingPoolState\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"uint64\",\"name\":\"app\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[{\"type\":\"uint64\",\"name\":\"winningTickets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64,uint64)\",\"struct\":\"StakingPoolMBRData\",\"desc\":\"the mbr created for each boxmap entry\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":16,\"bytes\":9},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"status\":{\"keyType\":\"AVMString\",\"valueType\":\"uint8\",\"key\":\"c3RhdHVz\",\"desc\":\"the status the pool is in\"},\"title\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dGl0bGU=\",\"desc\":\"title of the staking pool\"},\"type\":{\"keyType\":\"AVMString\",\"valueType\":\"uint8\",\"key\":\"dHlwZQ==\",\"desc\":\"the method of staking to be used for the pool\"},\"signupTimestamp\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"c2lnbnVwX3RpbWVzdGFtcA==\",\"desc\":\"the timestamp when sign ups for the pool are allowed\"},\"allowLateSignups\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWxsb3dfbGF0ZV9zaWdudXBz\",\"desc\":\"whether signups are allowed after the staking pool begins\"},\"startTimestamp\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"c3RhcnRfdGltZXN0YW1w\",\"desc\":\"the timestamp when the pool starts\"},\"endTimestamp\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZW5kX3RpbWVzdGFtcA==\",\"desc\":\"the timestamp when the pool ends\"},\"maxEntries\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWF4X2VudHJpZXM=\",\"desc\":\"the maximum entries allowed for the pool\"},\"entryID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZW50cnlfY291bnQ=\",\"desc\":\"the number of entries in a pool\"},\"rewardID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cmV3YXJkX2NvdW50\",\"desc\":\"the number of rewards for the pool\"},\"totalStaked\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"dG90YWxfc3Rha2Vk\",\"desc\":\"the total amount staked in the pool\"},\"stakeKey\":{\"keyType\":\"AVMString\",\"valueType\":\"RootKey\",\"key\":\"c3Rha2Vfa2V5\",\"desc\":\"the name for the meta merkle asset group to validate staking\\nstake key can be empty if distribution !== DistributionTypePercentage\"},\"minimumStakeAmount\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWluaW11bV9zdGFrZV9hbW91bnQ=\",\"desc\":\"minimum stake amount\"},\"gateID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9pZA==\",\"desc\":\"the gate id of the pool\"},\"gateSize\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9zaXpl\",\"desc\":\"the size of the gate were using\"},\"creator\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"Y3JlYXRvcg==\",\"desc\":\"the address of the creator of the staking pool\"},\"marketplace\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"bWFya2V0cGxhY2U=\",\"desc\":\"marketplace is pool creation side marketplace\"},\"marketplaceRoyalties\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWFya2V0cGxhY2Vfcm95YWx0aWVz\",\"desc\":\"the amount the marketplaces will get for the sale\"},\"akitaRoyalty\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfcm95YWx0eQ==\",\"desc\":\"the akita royalty for the pool\"},\"akitaRoyaltyAmount\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfcm95YWx0eV9hbW91bnQ=\",\"desc\":\"the amount of royalties that were paid in a disbursement\"},\"salt\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"c2FsdA==\",\"desc\":\"salt for randomness\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow to use\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"},\"funder\":{\"keyType\":\"AVMString\",\"valueType\":\"FunderInfo\",\"key\":\"ZnVuZGVy\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"entries\":{\"keyType\":\"uint64\",\"valueType\":\"EntryData\",\"desc\":\"indexed entries for efficient iteration\",\"prefix\":\"ZQ==\"},\"uniques\":{\"keyType\":\"address\",\"valueType\":\"uint64\",\"desc\":\"the number of unique asset entries by address\",\"prefix\":\"dQ==\"},\"entriesByAddress\":{\"keyType\":\"EntryKey\",\"valueType\":\"uint64\",\"desc\":\"the entries in the pool\",\"prefix\":\"YQ==\"},\"rewards\":{\"keyType\":\"uint64\",\"valueType\":\"Reward\",\"desc\":\"the rewards for this staking pool\",\"prefix\":\"cg==\"},\"disbursements\":{\"keyType\":\"uint64\",\"valueType\":\"AVMBytes\",\"desc\":\"the disbursements this pool as created & finalized\",\"prefix\":\"ZA==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[4429,4531,6827],\"errorMessage\":\"Box must have value\"},{\"pc\":[779,1222,1340,1615,2376,2748,5226,5327,5770,5899,6464],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[2924],\"errorMessage\":\"DAO not opted in to the asset\"},{\"pc\":[4319],\"errorMessage\":\"Disbursement not ready for finalization\"},{\"pc\":[1635],\"errorMessage\":\"Escrow does not exist\"},{\"pc\":[1453,6046],\"errorMessage\":\"Forbidden\"},{\"pc\":[2111],\"errorMessage\":\"Gate check failed\"},{\"pc\":[4984],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[6384],\"errorMessage\":\"Invalid disbursement phase\"},{\"pc\":[1513,5587,6197],\"errorMessage\":\"Invalid payment\"},{\"pc\":[2859,2959,3147,3315],\"errorMessage\":\"Invalid percentage\"},{\"pc\":[3136],\"errorMessage\":\"Invalid percentage of args\"},{\"pc\":[5111],\"errorMessage\":\"Invalid pool type for check\"},{\"pc\":[1877],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[6162],\"errorMessage\":\"Max entries cannot be greater than rate\"},{\"pc\":[6061],\"errorMessage\":\"Must be an Algo asset\"},{\"pc\":[3336,3576,3841],\"errorMessage\":\"Not enough funds\"},{\"pc\":[2519],\"errorMessage\":\"Not ready to disburse\"},{\"pc\":[685],\"errorMessage\":\"OnCompletion must be DeleteApplication && can only call when not creating\"},{\"pc\":[475],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[673],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[4932,4973,5021],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[6130],\"errorMessage\":\"Rate must be greater than winner count\"},{\"pc\":[6169],\"errorMessage\":\"Rate must be greater than zero\"},{\"pc\":[6088],\"errorMessage\":\"Stake key required\"},{\"pc\":[6394],\"errorMessage\":\"Winning tickets already exist\"},{\"pc\":[1645],\"errorMessage\":\"Wrong escrow for this operation\"},{\"pc\":[3332,3562,3827,6015],\"errorMessage\":\"account funded\"},{\"pc\":[1464,1484,1708,1728,2305,2890,2914,2929,4622,4930,4969,5019,5391,5443,5460],\"errorMessage\":\"application exists\"},{\"pc\":[1376],\"errorMessage\":\"call must come from factory\"},{\"pc\":[1141,1175,1180,1286,1294,1306,1381,1388,1400,1451,1461,1476,1481,1540,1640,1725,1920,1927,1946,1981,2074,2092,2098,2155,2232,2259,2281,2568,2576,2629,2677,2700,2807,2854,2887,2910,2954,3044,3052,3062,3222,3302,3310,3345,3353,3474,3567,3585,3593,3721,3832,3850,3858,4323,4474,4488,4493,4512,4614,4619,4650,4662,4673,4682,4747,4752,4757,4762,4767,4772,4777,4782,4786,4793,4800,4805,4810,4815,4820,4923,4961,5012,5093,5103,5169,5180,5277,5288,5365,5526,5533,5542,5592,5677,5692,5783,5794,5837,5847,5865,5915,6044,6066,6143,6151,6202,6419,6871,6883,6894,6903],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[2254],\"errorMessage\":\"distribution window is not open\"},{\"pc\":[5778],\"errorMessage\":\"failed to verify stake requirements\"},{\"pc\":[2094],\"errorMessage\":\"gate id is not set\"},{\"pc\":[2157],\"errorMessage\":\"gate id is set\"},{\"pc\":[1986],\"errorMessage\":\"if the starting round is zero, the signup round must be zero and allowLateSignups must be true\"},{\"pc\":[5648],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[5231],\"errorMessage\":\"invalid number of bytes for (bool1,uint64)\"},{\"pc\":[1628],\"errorMessage\":\"invalid number of bytes for (len+(uint64,bool1)[])\"},{\"pc\":[789,6474],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[957,4952],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[5332,5904],\"errorMessage\":\"invalid number of bytes for (uint64,uint64,uint64)\"},{\"pc\":[1817,1854],\"errorMessage\":\"invalid number of bytes for (uint64,uint8,uint64,uint64,uint64,uint64)\"},{\"pc\":[986],\"errorMessage\":\"invalid number of bytes for (uint8[32],uint64)\"},{\"pc\":[1015,5775],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[1006,1025,1034,1043,1052,1227,1345,1442,1891,1901,1911,2174,2381,2446,2467,2477,2753,4289,4420,4468,4576,4609,4916,5005,5034],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[968],\"errorMessage\":\"invalid number of bytes for uint8\"},{\"pc\":[977,995,1370,4412,4460,4568,4724],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[3165,3421,3668,4008,6768],\"errorMessage\":\"max array length exceeded\"},{\"pc\":[1383],\"errorMessage\":\"only the creator can delete the pool\"},{\"pc\":[1922],\"errorMessage\":\"only the creator can finalize the pool\"},{\"pc\":[1281],\"errorMessage\":\"only the factory can init the pool\"},{\"pc\":[5547],\"errorMessage\":\"pool has reached maximum entries\"},{\"pc\":[5679],\"errorMessage\":\"quantity is less than minimum stake amount\"},{\"pc\":[2190,2490,4300,6350],\"errorMessage\":\"reward does not exist\"},{\"pc\":[2224],\"errorMessage\":\"reward is already in a disbursement phase\"},{\"pc\":[2007],\"errorMessage\":\"the ending round must be zero or after the starting round + 10\"},{\"pc\":[2179,5522],\"errorMessage\":\"the pool is not live\"},{\"pc\":[1406],\"errorMessage\":\"the pool must be in draft or ended\"},{\"pc\":[1930],\"errorMessage\":\"the pool must be in draft state to finalize\"},{\"pc\":[1951],\"errorMessage\":\"the signup round must be zero and late sign ups allowed or in the future\"},{\"pc\":[1966],\"errorMessage\":\"the starting round must be zero or in the future\"},{\"pc\":[2067,4450],\"errorMessage\":\"transaction type is appl\"},{\"pc\":[1845],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[1434,1808,1834,2056,2147],\"errorMessage\":\"transaction type is pay\"},{\"pc\":[3758],\"errorMessage\":\"unknown reward rate type\"},{\"pc\":[5911],\"errorMessage\":\"user does not have enough staked\"},{\"pc\":[5832],\"errorMessage\":\"user does not have min balance\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggOTIgMTAwMDAwIDYzNjQxMzYyMjM4NDY3OTMwMDUgNDAwIDE0NDI2OTUwNDA4ODg5NjM0MDcgMTQ0MjY5NTA0MDg4ODk2MzQwOSA0Mjk0OTY3Mjk1IDUwNjAwIDE4OTAwIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJlbnRyeV9jb3VudCIgMHgxNTFmN2M3NSAweDAwICJ0eXBlIiAweDAwMDAgImFhbCIgImFraXRhX2VzY3JvdyIgMHgwYSAiZSIgInN0YXR1cyIgImNyZWF0b3IiICJnYXRlX2lkIiAweDE0IDB4MWUgImFsbG93X2xhdGVfc2lnbnVwcyIgInN0YXJ0X3RpbWVzdGFtcCIgImVuZF90aW1lc3RhbXAiICJtYXhfZW50cmllcyIgMHg4MCAid2FsbGV0IiAiciIgImFraXRhX3JveWFsdHlfYW1vdW50IiAidSIgInNpZ251cF90aW1lc3RhbXAiICJyZXdhcmRfY291bnQiICJzdGFrZV9rZXkiICJha2l0YV9yb3lhbHR5IiAidGl0bGUiICJtaW5pbXVtX3N0YWtlX2Ftb3VudCIgImEiICJ0b3RhbF9zdGFrZWQiIDB4NzFiOTU3YWYgIm9hbCIgInNhbHQiICJzYWwiICJwYWwiICJjb250cm9sbGVkX2FkZHJlc3MiIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMDAwIDB4YzkwNjg4MDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjAKICAgIC8vIHNpZ251cFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U2lnbnVwVGltZXN0YW1wIH0pCiAgICBieXRlYyAyNCAvLyAic2lnbnVwX3RpbWVzdGFtcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhcnRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE2IC8vICJzdGFydF90aW1lc3RhbXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuZFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW5kVGltZXN0YW1wIH0pCiAgICBieXRlYyAxNyAvLyAiZW5kX3RpbWVzdGFtcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJld2FyZElEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlSZXdhcmRDb3VudCB9KQogICAgYnl0ZWMgMjUgLy8gInJld2FyZF9jb3VudCIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzNAogICAgLy8gdG90YWxTdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVRvdGFsU3Rha2VkIH0pCiAgICBieXRlYyAzMSAvLyAidG90YWxfc3Rha2VkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDUtMTA5CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBjbGFzc2VzKAogICAgLy8gICBCYXNlU3Rha2luZ1Bvb2wsCiAgICAvLyAgIEFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0LAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHB1c2hieXRlc3MgMHhhYjhiMjEzYSAweGVhOTE4MGRkIC8vIG1ldGhvZCAiZGVsZXRlKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAidXBkYXRlKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVANCBtYWluX3VwZGF0ZV9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDUtMTA5CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBjbGFzc2VzKAogICAgLy8gICBCYXNlU3Rha2luZ1Bvb2wsCiAgICAvLyAgIEFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0LAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzMgogICAgcHVzaGJ5dGVzcyAweDgzZjE0NzQ4IDB4Mzk0ZWFlYjIgLy8gbWV0aG9kICJpbml0KCl2b2lkIiwgbWV0aG9kICJvcHRJbihwYXksdWludDY0KXZvaWQiCiAgICBieXRlYyAzMiAvLyBtZXRob2QgImFkZFJld2FyZChwYXksKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4YTAwY2NlYzYgMHgxODFlODI5MSAweGZkY2ZkZmY2IDB4YjgyZWQxYjMgMHhhOTQxOGQzNyAweGZjNjk5Y2IzIDB4NmU3NmIyY2EgMHhjZGIwYWM2YSAweGIyMjNkMzVkIDB4YmM1OGFkMDkgMHg4ZTA4MjQ4NCAweDMzZjc4ODA4IDB4NTkyZWUzNDEgMHg4ZmE0YTE2MCAweGUzMzc3MzQyIDB4NzE3MDQ2NDkgMHgxZWFkMjBhOSAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgMHhhNGIzZTc4OSAvLyBtZXRob2QgImFkZFJld2FyZEFzYShwYXksYXhmZXIsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgImZpbmFsaXplKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImdhdGVkRW50ZXIocGF5LGFwcGwsKHVpbnQ2NCx1aW50NjQsYnl0ZVszMl1bXSlbXSl2b2lkIiwgbWV0aG9kICJlbnRlcihwYXksKHVpbnQ2NCx1aW50NjQsYnl0ZVszMl1bXSlbXSl2b2lkIiwgbWV0aG9kICJzdGFydERpc2J1cnNlbWVudCh1aW50NjQpdm9pZCIsIG1ldGhvZCAicmFmZmxlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJkaXNidXJzZVJld2FyZHModWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZURpc3RyaWJ1dGlvbih1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2hlY2soYWRkcmVzcyx1aW50NjQpKGJvb2wsdWludDY0KSIsIG1ldGhvZCAiZ2F0ZUNoZWNrKGFwcGwsYWRkcmVzcyx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZW50ZXJDb3N0KGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNpZ25VcHNPcGVuKClib29sIiwgbWV0aG9kICJpc0xpdmUoKWJvb2wiLCBtZXRob2QgImlzRW50ZXJlZChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldFN0YXRlKCkodWludDgsc3RyaW5nLHVpbnQ4LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LChhZGRyZXNzLHN0cmluZyksdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU9Fc2Nyb3codWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJtYnIodWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGluaXQgb3B0SW4gYWRkUmV3YXJkIGFkZFJld2FyZEFzYSBmaW5hbGl6ZSBnYXRlZEVudGVyIGVudGVyIHN0YXJ0RGlzYnVyc2VtZW50IHJhZmZsZSBkaXNidXJzZVJld2FyZHMgZmluYWxpemVEaXN0cmlidXRpb24gY2hlY2sgc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ10gZW50ZXJDb3N0IG9wdEluQ29zdCBzaWduVXBzT3BlbiBpc0xpdmUgaXNFbnRlcmVkIGdldFN0YXRlIHVwZGF0ZUFraXRhREFPRXNjcm93IHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAyOSBtYnIKICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA1LTEwOQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgY2xhc3NlcygKICAgIC8vICAgQmFzZVN0YWtpbmdQb29sLAogICAgLy8gICBBa2l0YUJhc2VGZWVHZW5lcmF0b3JDb250cmFjdCwKICAgIC8vICAgQ2hpbGRDb250cmFjdAogICAgLy8gKSB7CiAgICBwdXNoYnl0ZXMgMHhhMmYzYzU0NCAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDgsYWRkcmVzcywoYWRkcmVzcyx1aW50NjQpLGFkZHJlc3MsKGFkZHJlc3Msc3RyaW5nKSx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCm1haW5fZGVsZXRlX3JvdXRlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIGRlbGV0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6Ol9fcGNnMzJPdXRwdXQoc3RhdGU6IHVpbnQ2NCkgLT4gdWludDY0OgpfX3BjZzMyT3V0cHV0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoyMwogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIF9fcGNnMzJPdXRwdXQoc3RhdGU6IFBDRzMyU1RBVEUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjI0CiAgICAvLyBjb25zdCB4b3JzaGlmdGVkID0gX19tYXNrVG9VaW50MzIob3Auc2hyKG9wLnNocihzdGF0ZSwgMTgpIF4gc3RhdGUsIDI3KSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgc2hyCiAgICBmcmFtZV9kaWcgLTEKICAgIF4KICAgIHB1c2hpbnQgMjcgLy8gMjcKICAgIHNocgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxMwogICAgLy8gcmV0dXJuIHZhbHVlICYgKG9wLnNobCgxLCAzMikgLSAxKQogICAgaW50YyA5IC8vIDQyOTQ5NjcyOTUKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6MjUKICAgIC8vIGNvbnN0IHJvdCA9IG9wLnNocihzdGF0ZSwgNTkpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNTkgLy8gNTkKICAgIHNocgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoyNgogICAgLy8gcmV0dXJuIG9wLnNocih4b3JzaGlmdGVkLCByb3QpIHwgX19tYXNrVG9VaW50MzIob3Auc2hsKHhvcnNoaWZ0ZWQsIF9fdWludDY0VHdvcyhyb3QpICYgMzEpKQogICAgZHVwMgogICAgc2hyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjgKICAgIC8vIGNvbnN0IFssIGFkZExvd10gPSBvcC5hZGR3KH52YWx1ZSwgMSkKICAgIHN3YXAKICAgIH4KICAgIGludGNfMSAvLyAxCiAgICBhZGR3CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6MjYKICAgIC8vIHJldHVybiBvcC5zaHIoeG9yc2hpZnRlZCwgcm90KSB8IF9fbWFza1RvVWludDMyKG9wLnNobCh4b3JzaGlmdGVkLCBfX3VpbnQ2NFR3b3Mocm90KSAmIDMxKSkKICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgICYKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgc2hsCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjEzCiAgICAvLyByZXR1cm4gdmFsdWUgJiAob3Auc2hsKDEsIDMyKSAtIDEpCiAgICBpbnRjIDkgLy8gNDI5NDk2NzI5NQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoyNgogICAgLy8gcmV0dXJuIG9wLnNocih4b3JzaGlmdGVkLCByb3QpIHwgX19tYXNrVG9VaW50MzIob3Auc2hsKHhvcnNoaWZ0ZWQsIF9fdWludDY0VHdvcyhyb3QpICYgMzEpKQogICAgfAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiB1aW50NjQsIGFkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFdhbGxldElEVXNpbmdBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYWRkcmVzczogQWNjb3VudCk6IEFwcGxpY2F0aW9uIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OQogICAgLy8gY29uc3QgW290aGVyQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c090aGVyQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjIDMzIC8vICJvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjY0CiAgICAvLyByZXR1cm4gZ2V0T3RoZXJBcHBMaXN0KGFraXRhREFPKS5lc2Nyb3cKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4Ni0xODkKICAgIC8vIGNvbnN0IGRhdGEgPSBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5nZXQ+KHsKICAgIC8vICAgYXBwSWQ6IGVzY3Jvd0ZhY3RvcnksCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDNjMWE2ZjMzIC8vIG1ldGhvZCAiZ2V0KGFkZHJlc3MpYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgNiAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkxCiAgICAvLyBpZiAoQnl0ZXMoZGF0YSkubGVuZ3RoID09PSAwIHx8IEJ5dGVzKGRhdGEpLmxlbmd0aCAhPT0gOCkgewogICAgbGVuCiAgICBkdXAKICAgIGJ6IGdldFdhbGxldElEVXNpbmdBa2l0YURBT19pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgIT0KICAgIGJ6IGdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pZl9lbHNlQDcKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19pZl9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTUKICAgIC8vIHJldHVybiBidG9pKGRhdGEpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdhdGVDaGVjayhnYXRlVHhuOiB1aW50NjQsIGFraXRhREFPOiB1aW50NjQsIGNhbGxlcjogYnl0ZXMsIGlkOiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2F0ZUNoZWNrOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnYXRlQ2hlY2soZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sIGFraXRhREFPOiBBcHBsaWNhdGlvbiwgY2FsbGVyOiBBY2NvdW50LCBpZDogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMwogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM0CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzNAogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYm56IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM1CiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzUKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDQzOTIyNjU1IC8vIG1ldGhvZCAibXVzdENoZWNrKGFkZHJlc3MsdWludDY0LGJ5dGVbXVtdKXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM2CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzcKICAgIC8vIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzEgLy8gMQogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNwogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzgKICAgIC8vIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIGZyYW1lX2RpZyAtNAogICAgcHVzaGludCAyIC8vIDIKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzgKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMi0yMzkKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vICAgZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gICBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICAvLyApCiAgICByZXRzdWIKCmdhdGVDaGVja19ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzItMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyAgIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vICAgZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKc3BsaXRPcHRJbkNvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBzcGxpdE9wdEluQ291bnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBlc2Nyb3c6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIyCiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyNAogICAgLy8gaWYgKCFlc2Nyb3cuaXNPcHRlZEluKGFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDMKICAgIC8vIGNvbnN0IFtzcGxpdHNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNSZXZlbnVlU3BsaXRzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJyZXZlbnVlX3NwbGl0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI4CiAgICAvLyBjb3VudCArPSBzcGxpdHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzU4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA0MCAvLyA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ4WzMyXSx1aW50NjQpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3RhdHVzPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhdHVzIH0pCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc3MwogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgPSBQb29sU3RhdHVzRHJhZnQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIHRpdGxlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VGl0bGUgfSkKICAgIGJ5dGVjIDI4IC8vICJ0aXRsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NzQKICAgIC8vIHRoaXMudGl0bGUudmFsdWUgPSB0aXRsZQogICAgdW5jb3ZlciAxMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9IHR5cGUKICAgIHVuY292ZXIgMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUNyZWF0b3IgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc3NgogICAgLy8gdGhpcy5jcmVhdG9yLnZhbHVlID0gY3JlYXRvcgogICAgdW5jb3ZlciAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9jaGlsZC50czoxMQogICAgLy8gZnVuZGVyID0gR2xvYmFsU3RhdGU8RnVuZGVySW5mbz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5RnVuZGVyIH0pCiAgICBwdXNoYnl0ZXMgImZ1bmRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIHRoaXMuZnVuZGVyLnZhbHVlID0gY2xvbmUoZnVuZGVyKQogICAgdW5jb3ZlciA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIHB1c2hieXRlcyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzc4CiAgICAvLyB0aGlzLm1hcmtldHBsYWNlLnZhbHVlID0gbWFya2V0cGxhY2UKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIHN0YWtlS2V5ID0gR2xvYmFsU3RhdGU8Um9vdEtleT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YWtlS2V5IH0pCiAgICBieXRlYyAyNiAvLyAic3Rha2Vfa2V5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gdGhpcy5zdGFrZUtleS52YWx1ZSA9IGNsb25lKHN0YWtlS2V5KQogICAgdW5jb3ZlciA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbWluaW11bVN0YWtlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWluaW11bVN0YWtlQW1vdW50IH0pCiAgICBieXRlYyAyOSAvLyAibWluaW11bV9zdGFrZV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzgxCiAgICAvLyB0aGlzLm1pbmltdW1TdGFrZUFtb3VudC52YWx1ZSA9IG1pbmltdW1TdGFrZUFtb3VudAogICAgdW5jb3ZlciA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4MgogICAgLy8gdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlID0gYWxsb3dMYXRlU2lnbnVwcwogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMiAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3ODMKICAgIC8vIHRoaXMuZ2F0ZUlELnZhbHVlID0gZ2F0ZUlECiAgICB1bmNvdmVyIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBtYXhFbnRyaWVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWF4RW50cmllcyB9KQogICAgYnl0ZWMgMTggLy8gIm1heF9lbnRyaWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4NAogICAgLy8gdGhpcy5tYXhFbnRyaWVzLnZhbHVlID0gbWF4RW50cmllcwogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NwogICAgLy8gc2FsdCA9IEdsb2JhbFN0YXRlPGJ5dGVzPDMyPj4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVNhbHQgfSkKICAgIGJ5dGVjIDM0IC8vICJzYWx0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4NgogICAgLy8gdGhpcy5zYWx0LnZhbHVlID0gVHhuLnR4SWQKICAgIHR4biBUeElECiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzg3CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFraXRhREFPRXNjcm93CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gY29uc3QgZmVlcyA9IGdldFN0YWtpbmdGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzkwCiAgICAvLyBjb25zdCBmZWVzID0gZ2V0U3Rha2luZ0ZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjc4CiAgICAvLyBjb25zdCBbc3Rha2luZ0ZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNTdGFraW5nRmVlcykpCiAgICBkdXAKICAgIHB1c2hieXRlcyAic3Rha2luZ19mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0OQogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YVNvY2lhbEFwcExpc3QpKQogICAgYnl0ZWMgMzUgLy8gInNhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTIKICAgIC8vIGNvbnN0IHsgaW1wYWN0OiBpbXBhY3RBcHAgfSA9IGdldEFraXRhU29jaWFsQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKTsKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzk0CiAgICAvLyBsZXQgaW1wYWN0OiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTUKICAgIC8vIGlmIChpbXBhY3RBcHAgIT09IDApIHsKICAgIGJ6IGNyZWF0ZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTYKICAgIC8vIGltcGFjdCA9IGdldFVzZXJJbXBhY3QodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5jcmVhdG9yLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gaW1wYWN0ID0gZ2V0VXNlckltcGFjdCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmNyZWF0b3IudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5Q3JlYXRvciB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Nzk2CiAgICAvLyBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuY3JlYXRvci52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNi0xMzkKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBBa2l0YVNvY2lhbEltcGFjdC5wcm90b3R5cGUuZ2V0VXNlckltcGFjdD4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICAvLyAgIGFyZ3M6IFthY2NvdW50XQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDkKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFTb2NpYWxBcHBMaXN0KSkKICAgIHN3YXAKICAgIGJ5dGVjIDM1IC8vICJzYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNwogICAgLy8gYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM2LTEzOQogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIEFraXRhU29jaWFsSW1wYWN0LnByb3RvdHlwZS5nZXRVc2VySW1wYWN0Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YVNvY2lhbEFwcExpc3QoYWtpdGFEQU8pLmltcGFjdCwKICAgIC8vICAgYXJnczogW2FjY291bnRdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4ZDU3NGJiMTAgLy8gbWV0aG9kICJnZXRVc2VySW1wYWN0KGFkZHJlc3MpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGJ1cnkgMQoKY3JlYXRlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTgKICAgIC8vIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlID0gaW1wYWN0UmFuZ2UoaW1wYWN0LCBmZWVzLmltcGFjdFRheE1pbiwgZmVlcy5pbXBhY3RUYXhNYXgpCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzEKICAgIC8vIGNvbnN0IG1pbkltcGFjdDogdWludDY0ID0gKGltcGFjdCA+IDEpID8gaW1wYWN0IC0gMSA6IDEKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGNyZWF0ZV90ZXJuYXJ5X2ZhbHNlQDYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KCmNyZWF0ZV90ZXJuYXJ5X21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMgogICAgLy8gcmV0dXJuIG1heCAtICgoKG1heCAtIG1pbikgKiBtaW5JbXBhY3QpIC8gSU1QQUNUX0RJVklTT1IpCiAgICBkaWcgNAogICAgZHVwCiAgICBkaWcgNQogICAgLQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgLwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gYWtpdGFSb3lhbHR5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5IH0pCiAgICBieXRlYyAyNyAvLyAiYWtpdGFfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3OTgKICAgIC8vIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlID0gaW1wYWN0UmFuZ2UoaW1wYWN0LCBmZWVzLmltcGFjdFRheE1pbiwgZmVlcy5pbXBhY3RUYXhNYXgpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc1OAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV90ZXJuYXJ5X2ZhbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMQogICAgLy8gY29uc3QgbWluSW1wYWN0OiB1aW50NjQgPSAoaW1wYWN0ID4gMSkgPyBpbXBhY3QgLSAxIDogMQogICAgaW50Y18xIC8vIDEKICAgIGIgY3JlYXRlX3Rlcm5hcnlfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODAyCiAgICAvLyBhc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uQWRkcmVzcyA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCAnb25seSB0aGUgZmFjdG9yeSBjYW4gaW5pdCB0aGUgcG9vbCcpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgZmFjdG9yeSBjYW4gaW5pdCB0aGUgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgwNAogICAgLy8gaWYgKHRoaXMuZ2F0ZUlELnZhbHVlID4gMCkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA0CiAgICAvLyBpZiAodGhpcy5nYXRlSUQudmFsdWUgPiAwKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogaW5pdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDUtODA4CiAgICAvLyB0aGlzLmdhdGVTaXplLnZhbHVlID0gYWJpQ2FsbDx0eXBlb2YgR2F0ZS5wcm90b3R5cGUuc2l6ZT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmdhdGVJRC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgwNgogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgwNgogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA3CiAgICAvLyBhcmdzOiBbdGhpcy5nYXRlSUQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA3CiAgICAvLyBhcmdzOiBbdGhpcy5nYXRlSUQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDUtODA4CiAgICAvLyB0aGlzLmdhdGVTaXplLnZhbHVlID0gYWJpQ2FsbDx0eXBlb2YgR2F0ZS5wcm90b3R5cGUuc2l6ZT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmdhdGVJRC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4ZGY1NmIwMWUgLy8gbWV0aG9kICJzaXplKHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gZ2F0ZVNpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlHYXRlU2l6ZSB9KQogICAgcHVzaGJ5dGVzICJnYXRlX3NpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODA1LTgwOAogICAgLy8gdGhpcy5nYXRlU2l6ZS52YWx1ZSA9IGFiaUNhbGw8dHlwZW9mIEdhdGUucHJvdG90eXBlLnNpemU+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlLAogICAgLy8gICBhcmdzOiBbdGhpcy5nYXRlSUQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgppbml0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MDEKICAgIC8vIGluaXQoKSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODE0CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCAnY2FsbCBtdXN0IGNvbWUgZnJvbSBmYWN0b3J5JykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjYWxsIG11c3QgY29tZSBmcm9tIGZhY3RvcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGFzc2VydChjYWxsZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGRlbGV0ZSB0aGUgcG9vbCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlDcmVhdG9yIH0pCiAgICBieXRlYyAxMSAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGFzc2VydChjYWxsZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGRlbGV0ZSB0aGUgcG9vbCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIGNhbiBkZWxldGUgdGhlIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gUG9vbFN0YXR1c0RyYWZ0IHx8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSwgJ3RoZSBwb29sIG11c3QgYmUgaW4gZHJhZnQgb3IgZW5kZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3RhdHVzPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhdHVzIH0pCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgxNgogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBQb29sU3RhdHVzRHJhZnQgfHwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLCAndGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBvciBlbmRlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAweDAwCiAgICA9PQogICAgYm56IGRlbGV0ZV9ib29sX3RydWVAMwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuZFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW5kVGltZXN0YW1wIH0pCiAgICBieXRlYyAxNyAvLyAiZW5kX3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gUG9vbFN0YXR1c0RyYWZ0IHx8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSwgJ3RoZSBwb29sIG11c3QgYmUgaW4gZHJhZnQgb3IgZW5kZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGRlbGV0ZV9ib29sX2ZhbHNlQDQKCmRlbGV0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpkZWxldGVfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgxNgogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBQb29sU3RhdHVzRHJhZnQgfHwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLCAndGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBvciBlbmRlZCcpCiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBvciBlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgyMC04MjIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODIxCiAgICAvLyAucGF5bWVudCh7IGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MjAtODIxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODIwLTgyMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpkZWxldGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZGVsZXRlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzIKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsIEVSUl9GT1JCSURERU4pCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlDcmVhdG9yIH0pCiAgICBieXRlYyAxMSAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsIEVSUl9GT1JCSURERU4pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBGb3JiaWRkZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzUKICAgIC8vIGxldCBvcHRpbk1CUjogdWludDY0ID0gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzgKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDcgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzgKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBzd2FwCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IG9wdEluX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4MzkKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjgzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMwogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDAKICAgIC8vIG9wdGluTUJSICs9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGNvdW50CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICoKICAgICsKCm9wdEluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDUtODUyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IG9wdGluTUJSICsgcmV3YXJkc01CUiwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDgKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODQ1LTg1MgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBvcHRpbk1CUiArIHJld2FyZHNNQlIsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIGFtb3VudDogb3B0aW5NQlIgKyByZXdhcmRzTUJSLAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODQzCiAgICAvLyBjb25zdCByZXdhcmRzTUJSOiB1aW50NjQgPSB0aGlzLnJld2FyZHNNYnIoV2lubmVyQ291bnRDYXApICogMgogICAgcHVzaGludCA4MDAwIC8vIDgwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIGFtb3VudDogb3B0aW5NQlIgKyByZXdhcmRzTUJSLAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg0NS04NTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogb3B0aW5NQlIgKyByZXdhcmRzTUJSLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NTQtODYwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NTQtODU5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg1NC04NjAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAzNiAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODMKICAgIC8vIGNvbnN0IHsgcmV2ZW51ZU1hbmFnZXIgfSA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgZGlnIDIKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3MC03MwogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NzIKICAgIC8vIGFyZ3M6IFtbbmFtZV1dLAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIwMDA4NzI2NTc2NWY3MDZmNmY2YwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NzAtNzMKICAgIC8vIGNvbnN0IGVzY3JvdyA9IGFiaUNhbGw8dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9nZXRFc2Nyb3dzPih7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbW25hbWVdXSwKICAgIC8vIH0pLnJldHVyblZhbHVlWzBdCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCA5IC8vIDkKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rKHVpbnQ2NCxib29sMSlbXSkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjc1CiAgICAvLyBhc3NlcnQoZXNjcm93LmlkICE9PSAwLCBFUlJfRVNDUk9XX0RPRVNfTk9UX0VYSVNUKQogICAgZXh0cmFjdCA2IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBhc3NlcnQgLy8gRXNjcm93IGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NgogICAgLy8gYXNzZXJ0KGlkID09PSB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmlkLCBFUlJfV1JPTkdfRVNDUk9XX0ZPUl9PUEVSQVRJT04pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlYyA3IC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NgogICAgLy8gYXNzZXJ0KGlkID09PSB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmlkLCBFUlJfV1JPTkdfRVNDUk9XX0ZPUl9PUEVSQVRJT04pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgZXNjcm93IGZvciB0aGlzIG9wZXJhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODgtOTcKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfcmVrZXlUb1BsdWdpbj4oewogICAgLy8gICBhcHBJZDogd2FsbGV0LAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIC8vICAgICBbXQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDU4MmZmMzgyIC8vIG1ldGhvZCAiYXJjNThfcmVrZXlUb1BsdWdpbih1aW50NjQsYm9vbCxzdHJpbmcsdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5MgogICAgLy8gdHJ1ZSwKICAgIGJ5dGVjIDE5IC8vIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5MwogICAgLy8gbmFtZSwKICAgIHB1c2hieXRlcyAweDAwMDg3MjY1NzY1ZjcwNmY2ZjZjCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OTQKICAgIC8vIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OTUKICAgIC8vIFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg4LTk3CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMDEKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk5LTEwMwogICAgLy8gY29uc3Qgb3B0SW5Db3VudCA9IHNwbGl0T3B0SW5Db3VudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhc3NldAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgNAogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNQogICAgLy8gY29uc3QgbWJyQW1vdW50OiB1aW50NjQgPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBvcHRJbkNvdW50CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMTMtMTE2CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG1ickFtb3VudAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEwCiAgICAvLyB3YWxsZXQsCiAgICBkaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEyCiAgICAvLyBbYXNzZXQuaWRdLAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjkyCiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7IGFwcElkOiB3YWxsZXQgfSkKICAgIGl0eG5fbmV4dAogICAgcHVzaGJ5dGVzIDB4NmNjM2Y2MDYgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzMgogICAgLy8gaXR4bkNvbXBvc2Uuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODMyCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkUmV3YXJkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg2OQogICAgLy8gYWRkUmV3YXJkKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgcmV3YXJkOiBBZGRSZXdhcmRQYXJhbXMpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yICh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZAogICAgcG9wCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRBc2Fbcm91dGluZ10oKSAtPiB2b2lkOgphZGRSZXdhcmRBc2E6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTA4CiAgICAvLyBhZGRSZXdhcmRBc2EocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwgcmV3YXJkOiBBZGRSZXdhcmRQYXJhbXMpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yICh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkwOS05MTkKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KHJld2FyZC5hc3NldCksCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHsKICAgIC8vICAgICAgIGdyZWF0ZXJUaGFuOiAwCiAgICAvLyAgICAgfQogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MTIKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MDktOTE5CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChyZXdhcmQuYXNzZXQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7CiAgICAvLyAgICAgICBncmVhdGVyVGhhbjogMAogICAgLy8gICAgIH0KICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgID09CiAgICBkaWcgMgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTEzCiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHJld2FyZC5hc3NldCksCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTA5LTkxOQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIGFzc2V0WGZlciwKICAgIC8vICAgewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogQXNzZXQocmV3YXJkLmFzc2V0KSwKICAgIC8vICAgICBhc3NldEFtb3VudDogewogICAgLy8gICAgICAgZ3JlYXRlclRoYW46IDAKICAgIC8vICAgICB9CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gdGhpcy5hZGRSZXdhcmQocGF5bWVudCwgcmV3YXJkKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTA4CiAgICAvLyBhZGRSZXdhcmRBc2EocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwgcmV3YXJkOiBBZGRSZXdhcmRQYXJhbXMpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmZpbmFsaXplW3JvdXRpbmddKCkgLT4gdm9pZDoKZmluYWxpemU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTI0CiAgICAvLyBmaW5hbGl6ZShzaWdudXBUaW1lc3RhbXA6IHVpbnQ2NCwgc3RhcnRUaW1lc3RhbXA6IHVpbnQ2NCwgZW5kVGltZXN0YW1wOiB1aW50NjQpIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGZpbmFsaXplIHRoZSBwb29sJykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUNyZWF0b3IgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgdGhlIGNyZWF0b3IgY2FuIGZpbmFsaXplIHRoZSBwb29sJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNyZWF0b3IgY2FuIGZpbmFsaXplIHRoZSBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTI2CiAgICAvLyBhc3NlcnQodGhpcy5zdGF0dXMudmFsdWUgPT09IFBvb2xTdGF0dXNEcmFmdCwgJ3RoZSBwb29sIG11c3QgYmUgaW4gZHJhZnQgc3RhdGUgdG8gZmluYWxpemUnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3RhdHVzPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhdHVzIH0pCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNgogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdHVzLnZhbHVlID09PSBQb29sU3RhdHVzRHJhZnQsICd0aGUgcG9vbCBtdXN0IGJlIGluIGRyYWZ0IHN0YXRlIHRvIGZpbmFsaXplJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vIDB4MDAKICAgID09CiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgbXVzdCBiZSBpbiBkcmFmdCBzdGF0ZSB0byBmaW5hbGl6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyOAogICAgLy8gc2lnbnVwVGltZXN0YW1wID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCB8fCAoc2lnbnVwVGltZXN0YW1wID09PSAwICYmIHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZmluYWxpemVfYm9vbF90cnVlQDQKICAgIGRpZyAyCiAgICBibnogZmluYWxpemVfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyOAogICAgLy8gc2lnbnVwVGltZXN0YW1wID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCB8fCAoc2lnbnVwVGltZXN0YW1wID09PSAwICYmIHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZmluYWxpemVfYm9vbF9mYWxzZUA1CgpmaW5hbGl6ZV9ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgpmaW5hbGl6ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTI3LTkzMAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBzaWdudXBUaW1lc3RhbXAgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIHx8IChzaWdudXBUaW1lc3RhbXAgPT09IDAgJiYgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKSwKICAgIC8vICAgJ3RoZSBzaWdudXAgcm91bmQgbXVzdCBiZSB6ZXJvIGFuZCBsYXRlIHNpZ24gdXBzIGFsbG93ZWQgb3IgaW4gdGhlIGZ1dHVyZScKICAgIC8vICkKICAgIGFzc2VydCAvLyB0aGUgc2lnbnVwIHJvdW5kIG11c3QgYmUgemVybyBhbmQgbGF0ZSBzaWduIHVwcyBhbGxvd2VkIG9yIGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MzMtOTM0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA9PT0gMCB8fAogICAgLy8gc3RhcnRUaW1lc3RhbXAgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgZGlnIDEKICAgIGJ6IGZpbmFsaXplX2Jvb2xfdHJ1ZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTM0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBkaWcgMQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkzMy05MzQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID09PSAwIHx8CiAgICAvLyBzdGFydFRpbWVzdGFtcCA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBieiBmaW5hbGl6ZV9ib29sX2ZhbHNlQDkKCmZpbmFsaXplX2Jvb2xfdHJ1ZUA4OgogICAgaW50Y18xIC8vIDEKCmZpbmFsaXplX2Jvb2xfbWVyZ2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTMyLTkzNgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBzdGFydFRpbWVzdGFtcCA9PT0gMCB8fAogICAgLy8gICBzdGFydFRpbWVzdGFtcCA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgICd0aGUgc3RhcnRpbmcgcm91bmQgbXVzdCBiZSB6ZXJvIG9yIGluIHRoZSBmdXR1cmUnCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdGhlIHN0YXJ0aW5nIHJvdW5kIG11c3QgYmUgemVybyBvciBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTM4CiAgICAvLyBpZiAoc3RhcnRUaW1lc3RhbXAgPT09IDApIHsKICAgIGRpZyAxCiAgICBibnogZmluYWxpemVfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkzOQogICAgLy8gYXNzZXJ0KHNpZ251cFRpbWVzdGFtcCA9PT0gMCAmJiB0aGlzLmFsbG93TGF0ZVNpZ251cHMudmFsdWUsICdpZiB0aGUgc3RhcnRpbmcgcm91bmQgaXMgemVybywgdGhlIHNpZ251cCByb3VuZCBtdXN0IGJlIHplcm8gYW5kIGFsbG93TGF0ZVNpZ251cHMgbXVzdCBiZSB0cnVlJykKICAgIGRpZyAyCiAgICBibnogZmluYWxpemVfYm9vbF9mYWxzZUAxNAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGFsbG93TGF0ZVNpZ251cHMgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWxsb3dMYXRlU2lnbnVwcyB9KQogICAgYnl0ZWMgMTUgLy8gImFsbG93X2xhdGVfc2lnbnVwcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MzkKICAgIC8vIGFzc2VydChzaWdudXBUaW1lc3RhbXAgPT09IDAgJiYgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlLCAnaWYgdGhlIHN0YXJ0aW5nIHJvdW5kIGlzIHplcm8sIHRoZSBzaWdudXAgcm91bmQgbXVzdCBiZSB6ZXJvIGFuZCBhbGxvd0xhdGVTaWdudXBzIG11c3QgYmUgdHJ1ZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZmluYWxpemVfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmZpbmFsaXplX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTM5CiAgICAvLyBhc3NlcnQoc2lnbnVwVGltZXN0YW1wID09PSAwICYmIHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSwgJ2lmIHRoZSBzdGFydGluZyByb3VuZCBpcyB6ZXJvLCB0aGUgc2lnbnVwIHJvdW5kIG11c3QgYmUgemVybyBhbmQgYWxsb3dMYXRlU2lnbnVwcyBtdXN0IGJlIHRydWUnKQogICAgYXNzZXJ0IC8vIGlmIHRoZSBzdGFydGluZyByb3VuZCBpcyB6ZXJvLCB0aGUgc2lnbnVwIHJvdW5kIG11c3QgYmUgemVybyBhbmQgYWxsb3dMYXRlU2lnbnVwcyBtdXN0IGJlIHRydWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NDAKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYnVyeSAyCgpmaW5hbGl6ZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk0NAogICAgLy8gZW5kVGltZXN0YW1wID09PSAwIHx8IGVuZFRpbWVzdGFtcCA+IChzdGFydFRpbWVzdGFtcCArIDEwKSwKICAgIGR1cAogICAgYnogZmluYWxpemVfYm9vbF90cnVlQDE4CiAgICBkaWcgMQogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwogICAgZGlnIDEKICAgIDwKICAgIGJ6IGZpbmFsaXplX2Jvb2xfZmFsc2VAMTkKCmZpbmFsaXplX2Jvb2xfdHJ1ZUAxODoKICAgIGludGNfMSAvLyAxCgpmaW5hbGl6ZV9ib29sX21lcmdlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk0My05NDYKICAgIC8vIGFzc2VydCgKICAgIC8vICAgZW5kVGltZXN0YW1wID09PSAwIHx8IGVuZFRpbWVzdGFtcCA+IChzdGFydFRpbWVzdGFtcCArIDEwKSwKICAgIC8vICAgJ3RoZSBlbmRpbmcgcm91bmQgbXVzdCBiZSB6ZXJvIG9yIGFmdGVyIHRoZSBzdGFydGluZyByb3VuZCArIDEwJwogICAgLy8gKQogICAgYXNzZXJ0IC8vIHRoZSBlbmRpbmcgcm91bmQgbXVzdCBiZSB6ZXJvIG9yIGFmdGVyIHRoZSBzdGFydGluZyByb3VuZCArIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyBzaWdudXBUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVNpZ251cFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMjQgLy8gInNpZ251cF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTQ4CiAgICAvLyB0aGlzLnNpZ251cFRpbWVzdGFtcC52YWx1ZSA9IHNpZ251cFRpbWVzdGFtcAogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBzdGFydFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3RhcnRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE2IC8vICJzdGFydF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTQ5CiAgICAvLyB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlID0gc3RhcnRUaW1lc3RhbXAKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gZW5kVGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbmRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE3IC8vICJlbmRfdGltZXN0YW1wIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk1MAogICAgLy8gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPSBlbmRUaW1lc3RhbXAKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGF0dXM+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGF0dXMgfSkKICAgIGJ5dGVjIDEwIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTUxCiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSA9IFBvb2xTdGF0dXNGaW5hbAogICAgYnl0ZWMgOCAvLyAweDBhCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkyNAogICAgLy8gZmluYWxpemUoc2lnbnVwVGltZXN0YW1wOiB1aW50NjQsIHN0YXJ0VGltZXN0YW1wOiB1aW50NjQsIGVuZFRpbWVzdGFtcDogdWludDY0KSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmaW5hbGl6ZV9ib29sX2ZhbHNlQDE5OgogICAgaW50Y18wIC8vIDAKICAgIGIgZmluYWxpemVfYm9vbF9tZXJnZUAyMAoKZmluYWxpemVfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplX2Jvb2xfbWVyZ2VAMTUKCmZpbmFsaXplX2Jvb2xfZmFsc2VAOToKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplX2Jvb2xfbWVyZ2VAMTAKCmZpbmFsaXplX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZWRFbnRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdhdGVkRW50ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTU0LTk1OAogICAgLy8gZ2F0ZWRFbnRlcigKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBnYXRlVHhuOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFR4biwKICAgIC8vICAgZW50cmllczogU3Rha2VFbnRyeVtdLAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTU5CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NTkKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyh0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0MwogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBibnogZ2F0ZWRFbnRlcl9hZnRlcl9pZl9lbHNlQDMKICAgIGR1cAoKZ2F0ZWRFbnRlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTYyCiAgICAvLyBhc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgIT09IDAsICdnYXRlIGlkIGlzIG5vdCBzZXQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTYyCiAgICAvLyBhc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgIT09IDAsICdnYXRlIGlkIGlzIG5vdCBzZXQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIGdhdGUgaWQgaXMgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2MwogICAgLy8gYXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2MwogICAgLy8gYXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgZ2F0ZUNoZWNrCiAgICBhc3NlcnQgLy8gR2F0ZSBjaGVjayBmYWlsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjQzCiAgICAvLyByZXR1cm4gZGVjb2RlQXJjNDxHYXRlQXJncz4oZ2F0ZVR4bi5hcHBBcmdzKDMpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTY1CiAgICAvLyB0aGlzLmNyZWF0ZVBvb2xFbnRyaWVzKHBheW1lbnQsIGVudHJpZXMsIGdldEdhdGVBcmdzKGdhdGVUeG4pKQogICAgZGlnIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgY3JlYXRlUG9vbEVudHJpZXMKICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk1NC05NTgKICAgIC8vIGdhdGVkRW50ZXIoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGVudHJpZXM6IFN0YWtlRW50cnlbXSwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2F0ZWRFbnRlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgYnl0ZWMgMzcgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICBiIGdhdGVkRW50ZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5lbnRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmVudGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2OAogICAgLy8gZW50ZXIocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBlbnRyaWVzOiBTdGFrZUVudHJ5W10pOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2OQogICAgLy8gYXNzZXJ0KHRoaXMuZ2F0ZUlELnZhbHVlID09PSAwLCAnZ2F0ZSBpZCBpcyBzZXQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGdhdGVJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUdhdGVJRCB9KQogICAgYnl0ZWMgMTIgLy8gImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTY5CiAgICAvLyBhc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgPT09IDAsICdnYXRlIGlkIGlzIHNldCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGdhdGUgaWQgaXMgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTcwCiAgICAvLyB0aGlzLmNyZWF0ZVBvb2xFbnRyaWVzKHBheW1lbnQsIGVudHJpZXMsIFtdKQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGNhbGxzdWIgY3JlYXRlUG9vbEVudHJpZXMKICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk2OAogICAgLy8gZW50ZXIocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBlbnRyaWVzOiBTdGFrZUVudHJ5W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnN0YXJ0RGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKc3RhcnREaXNidXJzZW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBzdGFydERpc2J1cnNlbWVudChyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk3NAogICAgLy8gYXNzZXJ0KHRoaXMuaXNMaXZlKCksICd0aGUgcG9vbCBpcyBub3QgbGl2ZScpCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlCiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgaXMgbm90IGxpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NzUKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NzUKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyByZXdhcmQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5NzcKICAgIC8vIGNvbnN0IHsgcGhhc2UsIGludGVydmFsLCBsYXN0RGlzYnVyc2VtZW50VGltZXN0YW1wLCBleHBpcmF0aW9uIH0gPSB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIHB1c2hpbnQgMjUgLy8gMjUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDIKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTcgLy8gMTcKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk3OQogICAgLy8gYXNzZXJ0KHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUlkbGUsICdyZXdhcmQgaXMgYWxyZWFkeSBpbiBhIGRpc2J1cnNlbWVudCBwaGFzZScpCiAgICBzd2FwCiAgICBieXRlY18zIC8vIDB4MDAKICAgID09CiAgICBhc3NlcnQgLy8gcmV3YXJkIGlzIGFscmVhZHkgaW4gYSBkaXNidXJzZW1lbnQgcGhhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gKChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSkgJSBpbnRlcnZhbCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFydFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTYgLy8gInN0YXJ0X3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gKChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSkgJSBpbnRlcnZhbCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAtCiAgICB1bmNvdmVyIDIKICAgICUKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUzNQogICAgLy8gcmV0dXJuIGxhdGVzdFdpbmRvd1N0YXJ0ICE9PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICYmIGxhc3QgPCBsYXRlc3RXaW5kb3dTdGFydAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgIT0KICAgIGJ6IHN0YXJ0RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VANAogICAgZGlnIDIKICAgIGRpZyAxCiAgICA8CiAgICBieiBzdGFydERpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpzdGFydERpc2J1cnNlbWVudF9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyBhc3NlcnQodGhpcy52YWxpZFdpbmRvdyhpbnRlcnZhbCwgbGFzdERpc2J1cnNlbWVudFRpbWVzdGFtcCksICdkaXN0cmlidXRpb24gd2luZG93IGlzIG5vdCBvcGVuJykKICAgIGFzc2VydCAvLyBkaXN0cmlidXRpb24gd2luZG93IGlzIG5vdCBvcGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTgzCiAgICAvLyBgJHt0aGlzLnRpdGxlLnZhbHVlfSAtIFJld2FyZHNgLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIHRpdGxlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VGl0bGUgfSkKICAgIGJ5dGVjIDI4IC8vICJ0aXRsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5ODMKICAgIC8vIGAke3RoaXMudGl0bGUudmFsdWV9IC0gUmV3YXJkc2AsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgLSBSZXdhcmRzIgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTg1CiAgICAvLyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgZXhwaXJhdGlvbgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTcKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkucmV3YXJkcykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTcKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkucmV3YXJkcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTU3CiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTgKICAgIC8vIGNvbnN0IHJld2FyZE1CUjogdWludDY0ID0gTWluRGlzYnVyc2VtZW50c01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIEJ5dGVzKHRpdGxlKS5sZW5ndGgpCiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjIDYgLy8gNDAwCiAgICBkaWcgMQogICAgKgogICAgcHVzaGludCAzNTMwMCAvLyAzNTMwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2MQogICAgLy8gcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTY1LTU3NAogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZURpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgdGl0bGUsCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgJycsCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NjAtNTYzCiAgICAvLyBjb25zdCBtYnJQYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiByZXdhcmRNQlIsCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2NS01NzQKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIHRpdGxlLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICcnLAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2OQogICAgLy8gdGl0bGUsCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5ODQKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU3MAogICAgLy8gdGltZVRvVW5sb2NrLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU3MQogICAgLy8gZXhwaXJhdGlvbiwKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU2NS01NzQKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIHRpdGxlLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICcnLAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDFjOWViYmRiIC8vIG1ldGhvZCAiY3JlYXRlRGlzYnVyc2VtZW50KHBheSxzdHJpbmcsdWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NzIKICAgIC8vICcnLAogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NjUtNTc0CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICB0aXRsZSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAnJywKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTg4CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnF1YWxpZmllZFN0YWtlcnMgPSAwCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDMzIC8vIDMzCiAgICBkaWcgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5ODkKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucXVhbGlmaWVkU3Rha2UgPSAwCiAgICBkdXAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTAKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucGhhc2UgPSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGJ5dGVjIDggLy8gMHgwYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuYWN0aXZlRGlzYnVyc2VtZW50SUQgPSBkaXNidXJzZW1lbnRJRAogICAgZHVwCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuYWN0aXZlRGlzYnVyc2VtZW50Um91bmRTdGFydCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCAxMDggLy8gMTA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTk0CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXAgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBzdGFydERpc2J1cnNlbWVudChyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzdGFydERpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFydERpc2J1cnNlbWVudF9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJhZmZsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5OTcKICAgIC8vIHJhZmZsZShyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZGlzYnVyc2VSZXdhcmRzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGlzYnVyc2VSZXdhcmRzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAzNwogICAgLy8gZGlzYnVyc2VSZXdhcmRzKHJld2FyZElEOiB1aW50NjQsIGl0ZXJhdGlvbkFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzkKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDM5CiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRzKHJld2FyZElEKS5leGlzdHMsICdyZXdhcmQgZG9lcyBub3QgZXhpc3QnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gcmV3YXJkIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA0MQogICAgLy8gY29uc3QgeyBwaGFzZSwgZGlzdHJpYnV0aW9uLCB3aW5uaW5nVGlja2V0cyB9ID0gY2xvbmUodGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZSkKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNDQKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICBieXRlYyA4IC8vIDB4MGEKICAgID09CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDQ0LTEwNDUKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICAvLyBwaGFzZSA9PT0gRGlzYnVyc2VtZW50UGhhc2VBbGxvY2F0aW9uLAogICAgYm56IGRpc2J1cnNlUmV3YXJkc19ib29sX3RydWVAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNDUKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUFsbG9jYXRpb24sCiAgICBkaWcgMgogICAgYnl0ZWMgMTMgLy8gMHgxNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDQ0LTEwNDUKICAgIC8vIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICAvLyBwaGFzZSA9PT0gRGlzYnVyc2VtZW50UGhhc2VBbGxvY2F0aW9uLAogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Jvb2xfZmFsc2VANAoKZGlzYnVyc2VSZXdhcmRzX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmRpc2J1cnNlUmV3YXJkc19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA0My0xMDQ3CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZVByZXBhcmF0aW9uIHx8CiAgICAvLyAgIHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUFsbG9jYXRpb24sCiAgICAvLyAgIEVSUl9OT1RfUkVBRFlfVE9fRElTQlVSU0UKICAgIC8vICkKICAgIGFzc2VydCAvLyBOb3QgcmVhZHkgdG8gZGlzYnVyc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDQ5CiAgICAvLyBpZiAocGhhc2UgPT09IERpc2J1cnNlbWVudFBoYXNlUHJlcGFyYXRpb24pIHsKICAgIGR1cAogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjI0CiAgICAvLyBjb25zdCB7IGRpc2J1cnNlbWVudEN1cnNvciwgZGlzdHJpYnV0aW9uLCByYXRlLCBhc3NldCB9ID0gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZQogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAyMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDQKICAgIGR1cAogICAgcHVzaGludCA5IC8vIDkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gbGV0IGNvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyA1CiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMjkKICAgIC8vIGl0ZXJhdGlvbkFtb3VudCA9IHRoaXMuZW50cnlJRC52YWx1ZSAtIGRpc2J1cnNlbWVudEN1cnNvcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gaXRlcmF0aW9uQW1vdW50ID0gdGhpcy5lbnRyeUlELnZhbHVlIC0gZGlzYnVyc2VtZW50Q3Vyc29yCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDIxCiAgICAtCiAgICBidXJ5IDUKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDEwMDoKICAgIGRpZyAyMAogICAgYnVyeSAxOAoKZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEAxMDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBmb3IgKGxldCBpZCA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaWQgPCAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KTsgaWQrKykgewogICAgZGlnIDIwCiAgICBkaWcgNQogICAgKwogICAgZGlnIDE4CiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfd2hpbGVAMTEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgcXVhbnRpdHkgfSA9IGNsb25lKHRoaXMuZW50cmllcyhpZCkudmFsdWUpCiAgICBkaWcgMTcKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgcXVhbnRpdHkgfSA9IGNsb25lKHRoaXMuZW50cmllcyhpZCkudmFsdWUpCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgcHVzaGludCA0MCAvLyA0MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDExMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUzOQogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfTk9ORSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MzkKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX05PTkUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vIDB4MDAKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEwNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU0MAogICAgLy8gcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGJhbGFuY2U6IDAgfQogICAgcHVzaGJ5dGVzIDB4ODAwMDAwMDAwMDAwMDAwMDAwCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmdldFN0YWtlVmFsdWVAMTA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gY29uc3QgeyB2YWxpZCB9ID0gdGhpcy5nZXRTdGFrZVZhbHVlKGlkKQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gaWYgKCF2YWxpZCkgewogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDExMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDI1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI0NQogICAgLy8gdG90YWwgKz0gcXVhbnRpdHkKICAgIGRpZyA3CiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgOAoKZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDExMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMzIKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMTcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDE4CiAgICBiIGRpc2J1cnNlUmV3YXJkc193aGlsZV90b3BAMTAxCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEwNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NDEKICAgIC8vIH0gZWxzZSBpZiAodGhpcy50eXBlLnZhbHVlID09PSBQT09MX1NUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQxCiAgICAvLyB9IGVsc2UgaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDBhCiAgICA9PQogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQyCiAgICAvLyBjb25zdCB7IGFkZHJlc3MsIGFzc2V0IH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkaWcgMzQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NDQtNTQ3CiAgICAvLyBjb25zdCBhdmcgPSBhYmlDYWxsPHR5cGVvZiBTdGFraW5nLnByb3RvdHlwZS5nZXRIZWFydGJlYXRBdmVyYWdlPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIC8vICAgYXJnczogW2FkZHJlc3MsIGFzc2V0LCB0cnVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU0NQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ0LTU0NwogICAgLy8gY29uc3QgYXZnID0gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZy5wcm90b3R5cGUuZ2V0SGVhcnRiZWF0QXZlcmFnZT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzLCBhc3NldCwgdHJ1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4YzZmZDBjYTUgLy8gbWV0aG9kICJnZXRIZWFydGJlYXRBdmVyYWdlKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTQ2CiAgICAvLyBhcmdzOiBbYWRkcmVzcywgYXNzZXQsIHRydWVdLAogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU0NC01NDcKICAgIC8vIGNvbnN0IGF2ZyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEhlYXJ0YmVhdEF2ZXJhZ2U+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbYWRkcmVzcywgYXNzZXQsIHRydWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NDkKICAgIC8vIHJldHVybiB7IHZhbGlkOiB0cnVlLCBiYWxhbmNlOiBhdmcgfQogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyBjb25zdCB7IHZhbGlkIH0gPSB0aGlzLmdldFN0YWtlVmFsdWUoaWQpCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2V0U3Rha2VWYWx1ZUAxMDkKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDEwODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NTIKICAgIC8vIHJldHVybiB0aGlzLmNoZWNrQnlJRChpZCkKICAgIGRpZyAxNwogICAgY2FsbHN1YiBjaGVja0J5SUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIGNvbnN0IHsgdmFsaWQgfSA9IHRoaXMuZ2V0U3Rha2VWYWx1ZShpZCkKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nZXRTdGFrZVZhbHVlQDEwOQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDExMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNDgKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucXVhbGlmaWVkU3Rha2VycyArPSBjb3VudAogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCAzMyAvLyAzMwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMjcKICAgICsKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDMzIC8vIDMzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjQ5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnF1YWxpZmllZFN0YWtlICs9IHRvdGFsCiAgICBkdXAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDkKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjUxCiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSBkaXNidXJzZW1lbnRDdXJzb3IpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGlmICh0aGlzLmVudHJ5SUQudmFsdWUgPT09IGRpc2J1cnNlbWVudEN1cnNvcikgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyMQogICAgPT0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlAMTIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnBoYXNlID0gRGlzYnVyc2VtZW50UGhhc2VBbGxvY2F0aW9uCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDkxIC8vIDkxCiAgICBieXRlYyAxMyAvLyAweDE0CiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI1NAogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5kaXNidXJzZW1lbnRDdXJzb3IgPSAxIC8vIEVudHJ5IElEcyBzdGFydCBhdCAxCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgZGlnIDEKICAgIGludGNfMyAvLyA5MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI1NgogICAgLy8gdGhpcy5wYXlBa2l0YVJveWFsdHkoZGlzdHJpYnV0aW9uLCByYXRlLCBhc3NldCwgdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5xdWFsaWZpZWRTdGFrZXJzKQogICAgcHVzaGludCAzMyAvLyAzMwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBpZiAoZGlzdHJpYnV0aW9uID09PSBEaXN0cmlidXRpb25UeXBlRmxhdCkgewogICAgZGlnIDEKICAgIGJ5dGVjIDEzIC8vIDB4MTQKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDExNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gYW1vdW50ID0gY2FsY1BlcmNlbnQoKHF1YWxpZmllZFN0YWtlcnMgKiByYXRlKSwgdGhpcy5ha2l0YVJveWFsdHkudmFsdWUpCiAgICBkaWcgMTQKICAgIGRpZyAxMwogICAgKgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFraXRhUm95YWx0eSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eSB9KQogICAgYnl0ZWMgMjcgLy8gImFraXRhX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyBhbW91bnQgPSBjYWxjUGVyY2VudCgocXVhbGlmaWVkU3Rha2VycyAqIHJhdGUpLCB0aGlzLmFraXRhUm95YWx0eS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgYnVyeSAyOQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gYWtpdGFSb3lhbHR5QW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5QW1vdW50IH0pCiAgICBieXRlYyAyMiAvLyAiYWtpdGFfcm95YWx0eV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZSA9IGFtb3VudAogICAgZGlnIDI5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBpZiAoYW1vdW50ID09PSAwKSB7CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBkaWcgMjcKICAgIGJueiBkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEyMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIwNC0yMDkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlYyA3IC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyAyOQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMDQtMjA4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMDQtMjA5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAzNwogICAgLy8gZGlzYnVyc2VSZXdhcmRzKHJld2FyZElEOiB1aW50NjQsIGl0ZXJhdGlvbkFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDEyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIGFzc2VydCh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSksIEVSUl9EQU9fTk9UX09QVEVEX0lOKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNyAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gYXNzZXJ0KHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSwgRVJSX0RBT19OT1RfT1BURURfSU4pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMjkKICAgIGR1cAogICAgY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBEQU8gbm90IG9wdGVkIGluIHRvIHRoZSBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIxMy0yMTkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyAyOQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjEzLTIxOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyMTMtMjE5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDExNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGFtb3VudCA9IGNhbGNQZXJjZW50KHJhdGUsIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFraXRhUm95YWx0eSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eSB9KQogICAgYnl0ZWMgMjcgLy8gImFraXRhX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTkyCiAgICAvLyBhbW91bnQgPSBjYWxjUGVyY2VudChyYXRlLCB0aGlzLmFraXRhUm95YWx0eS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZGlnIDEzCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBidXJ5IDI5CiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDExNwoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUAxMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjU5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciArPSBpdGVyYXRpb25BbW91bnQKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMyAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDkyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNTMKICAgIC8vIGNhc2UgRGlzdHJpYnV0aW9uVHlwZVBlcmNlbnRhZ2U6IHsKICAgIGRpZyAxCiAgICBieXRlYyA4IC8vIDB4MGEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA1My0xMDU2CiAgICAvLyBjYXNlIERpc3RyaWJ1dGlvblR5cGVQZXJjZW50YWdlOiB7CiAgICAvLyAgIHRoaXMuY3JlYXRlUGVyY2VudGFnZURpc2J1cnNlbWVudChyZXdhcmRJRCwgaXRlcmF0aW9uQW1vdW50KQogICAgLy8gICBicmVhawogICAgLy8gfQogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIH0gPSB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDI5CiAgICBkdXAKICAgIGludGNfMyAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMjMKICAgIGR1cAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMzYKICAgIGR1cAogICAgcHVzaGludCA0MSAvLyA0MQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE4CiAgICBwdXNoaW50IDkgLy8gOQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyA1CiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA4OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI3MwogICAgLy8gaXRlcmF0aW9uQW1vdW50ID0gdGhpcy5lbnRyeUlELnZhbHVlIC0gZGlzYnVyc2VtZW50Q3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjczCiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMjEKICAgIC0KICAgIGJ1cnkgNQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAODg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBjb25zdCBhY3R1YWxBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIHRoaXMuYWtpdGFSb3lhbHR5QW1vdW50LnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gYWtpdGFSb3lhbHR5QW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5QW1vdW50IH0pCiAgICBieXRlYyAyMiAvLyAiYWtpdGFfcm95YWx0eV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBjb25zdCBhY3R1YWxBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIHRoaXMuYWtpdGFSb3lhbHR5QW1vdW50LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDI5CiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDMzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjc3CiAgICAvLyBsZXQgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyNzgKICAgIC8vIGxldCBzdW06IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDExCiAgICBkaWcgMjAKICAgIGJ1cnkgMTgKCmRpc2J1cnNlUmV3YXJkc193aGlsZV90b3BAODk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyBmb3IgKGxldCBpZCA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaWQgPCAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KTsgaWQrKykgewogICAgZGlnIDIwCiAgICBkaWcgNQogICAgKwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkaWcgMTgKICAgID4KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl93aGlsZUA5NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gY29uc3QgeyBkaXNxdWFsaWZpZWQsIHF1YW50aXR5LCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkaWcgMTcKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gY29uc3QgeyBkaXNxdWFsaWZpZWQsIHF1YW50aXR5LCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgZGlnIDEKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNgogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjgyCiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDkzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjExMwogICAgLy8gYXNzZXJ0KGEgPCBiLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFX09GX0FSR1MpCiAgICBkaWcgMTMKICAgIGR1cAogICAgZGlnIDE3CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2Ugb2YgYXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMTQKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgRElWSVNPUiksIGIpCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBtdWx3CiAgICB1bmNvdmVyIDIKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGVyY2VudGFnZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBkaWcgMzMKICAgIG11bHcKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyODcKICAgIC8vIGFsbG9jYXRpb25zLnB1c2goeyBhZGRyZXNzLCBhbW91bnQ6IGluZGl2aWR1YWxBbW91bnQgfSkKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDM4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIHN1bSArPSBpbmRpdmlkdWFsQW1vdW50CiAgICBkaWcgMTEKICAgICsKICAgIGJ1cnkgMTEKCmRpc2J1cnNlUmV3YXJkc19ibG9ja0A5MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMTcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDE4CiAgICBiIGRpc2J1cnNlUmV3YXJkc193aGlsZV90b3BAODkKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl93aGlsZUA5NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yICs9IGl0ZXJhdGlvbkFtb3VudAogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gOTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MjkzCiAgICAvLyB0aGlzLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGFjdGl2ZURpc2J1cnNlbWVudElELCBhc3NldCwgYWxsb2NhdGlvbnMsIHN1bSkKICAgIGRpZyAzMwogICAgZGlnIDI4CiAgICBkaWcgMzcKICAgIGRpZyAxMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjk1CiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gaWYgKHRoaXMuZW50cnlJRC52YWx1ZSA9PT0gKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgOQogICAgPT0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnBoYXNlID0gRGlzYnVyc2VtZW50UGhhc2VGaW5hbGl6YXRpb24KICAgIGRpZyAzCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGJ5dGVjIDE0IC8vIDB4MWUKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciA9IDEgLy8gRW50cnkgSURzIHN0YXJ0IGF0IDEKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gOTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDU3CiAgICAvLyBjYXNlIERpc3RyaWJ1dGlvblR5cGVGbGF0OiB7CiAgICBkaWcgMQogICAgYnl0ZWMgMTMgLy8gMHgxNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDU3LTEwNjAKICAgIC8vIGNhc2UgRGlzdHJpYnV0aW9uVHlwZUZsYXQ6IHsKICAgIC8vICAgdGhpcy5jcmVhdGVGbGF0RGlzYnVyc2VtZW50KHJld2FyZElELCBpdGVyYXRpb25BbW91bnQpCiAgICAvLyAgIGJyZWFrCiAgICAvLyB9CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gfSA9IHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUKICAgIGRpZyAzCiAgICBkdXAKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDM1CiAgICBkdXAKICAgIGludGNfMyAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDIyCiAgICBkdXAKICAgIHB1c2hpbnQgMzMgLy8gMzMKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBjb25zdCB0b3RhbDogdWludDY0ID0gKHF1YWxpZmllZFN0YWtlcnMgKiBhbW91bnQpIC0gdGhpcy5ha2l0YVJveWFsdHlBbW91bnQudmFsdWUKICAgIHN3YXAKICAgIGRpZyAxCiAgICAqCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gYWtpdGFSb3lhbHR5QW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWtpdGFSb3lhbHR5QW1vdW50IH0pCiAgICBieXRlYyAyMiAvLyAiYWtpdGFfcm95YWx0eV9hbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBjb25zdCB0b3RhbDogdWludDY0ID0gKHF1YWxpZmllZFN0YWtlcnMgKiBhbW91bnQpIC0gdGhpcy5ha2l0YVJveWFsdHlBbW91bnQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBjb25zdCBwZXJjZW50YWdlQWtpdGFGZWUgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFraXRhUm95YWx0eSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eSB9KQogICAgYnl0ZWMgMjcgLy8gImFraXRhX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBjb25zdCBwZXJjZW50YWdlQWtpdGFGZWUgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuYWtpdGFSb3lhbHR5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGVyY2VudGFnZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBkaWcgMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gY29uc3QgYWRqdXN0ZWRBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIHBlcmNlbnRhZ2VBa2l0YUZlZQogICAgLQogICAgYnVyeSAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3MwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYmFsYW5jZSA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzIyCiAgICAvLyBhc3NlcnQoYmFsYW5jZSA+PSB0b3RhbCwgRVJSX05PVF9FTk9VR0hfRlVORFMpCiAgICBkaWcgOAogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzI0CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyAyMAogICAgZGlnIDUKICAgICsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIGlmICgoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KSA+IHRoaXMuZW50cnlJRC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDc2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzI1CiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMjUKICAgIC8vIGl0ZXJhdGlvbkFtb3VudCA9IHRoaXMuZW50cnlJRC52YWx1ZSAtIGRpc2J1cnNlbWVudEN1cnNvcgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyMQogICAgLQogICAgYnVyeSA1CgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA3NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMjgKICAgIC8vIGxldCBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSA9IFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYnVyeSAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gbGV0IHN1bTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKICAgIGRpZyAyMAogICAgYnVyeSAxOAoKZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEA3NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMjAKICAgIGRpZyA1CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIGRpZyAxOAogICAgPgogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDgyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzMyCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcyB9ID0gdGhpcy5lbnRyaWVzKGlkKS52YWx1ZQogICAgZGlnIDE3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBlbnRyaWVzID0gQm94TWFwPHVpbnQ2NCwgRW50cnlEYXRhPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeEVudHJpZXMgfSkKICAgIGJ5dGVjIDkgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGNvbnN0IHsgZGlzcXVhbGlmaWVkLCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDgxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBhbGxvY2F0aW9ucy5wdXNoKHsgYWRkcmVzcywgYW1vdW50OiBhZGp1c3RlZEFtb3VudCB9KQogICAgZGlnIDMwCiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAzOAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMzcKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBzdW0gKz0gYWRqdXN0ZWRBbW91bnQKICAgIGRpZyAxMQogICAgKwogICAgYnVyeSAxMQoKZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDgxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjMzMQogICAgLy8gZm9yIChsZXQgaWQgPSBkaXNidXJzZW1lbnRDdXJzb3I7IGlkIDwgKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCk7IGlkKyspIHsKICAgIGRpZyAxNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTgKICAgIGIgZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEA3NwoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDgyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM0MgogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5kaXNidXJzZW1lbnRDdXJzb3IgPSBuZXdDdXJzb3JWYWx1ZQogICAgZGlnIDE2CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyA1CiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHRoaXMuY3JlYXRlUmV3YXJkQWxsb2NhdGlvbnMoYWN0aXZlRGlzYnVyc2VtZW50SUQsIGFzc2V0LCBhbGxvY2F0aW9ucywgc3VtKQogICAgZGlnIDM0CiAgICBkaWcgMjkKICAgIGRpZyAzOAogICAgZGlnIDE0CiAgICBjYWxsc3ViIGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNDUKICAgIC8vIGlmICh0aGlzLmVudHJ5SUQudmFsdWUgPT09IG5ld0N1cnNvclZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSBuZXdDdXJzb3JWYWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5waGFzZSA9IERpc2J1cnNlbWVudFBoYXNlRmluYWxpemF0aW9uCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDkxIC8vIDkxCiAgICBieXRlYyAxNCAvLyAweDFlCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5kaXNidXJzZW1lbnRDdXJzb3IgPSAxIC8vIEVudHJ5IElEcyBzdGFydCBhdCAxCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgaW50Y18zIC8vIDkyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA3MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIFtiYWxhbmNlXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGFzc2V0KQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAyOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANzQKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNjEKICAgIC8vIGNhc2UgRGlzdHJpYnV0aW9uVHlwZUV2ZW46IHsKICAgIGRpZyAxCiAgICBieXRlYyAxNCAvLyAweDFlCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNjEtMTA2NAogICAgLy8gY2FzZSBEaXN0cmlidXRpb25UeXBlRXZlbjogewogICAgLy8gICB0aGlzLmNyZWF0ZUV2ZW5EaXNidXJzZW1lbnQocmV3YXJkSUQsIGl0ZXJhdGlvbkFtb3VudCkKICAgIC8vICAgYnJlYWsKICAgIC8vIH0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyB9ID0gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZQogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMzUKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMjIKICAgIGR1cAogICAgcHVzaGludCAzMyAvLyAzMwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDE2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAzMAogICAgcHVzaGludCA5IC8vIDkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2MwogICAgLy8gYmFsYW5jZSA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBjb25zdCBhY3R1YWxTdW06IHVpbnQ2NCA9IHJhdGUgLSB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIGFraXRhUm95YWx0eUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eUFtb3VudCB9KQogICAgYnl0ZWMgMjIgLy8gImFraXRhX3JveWFsdHlfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gY29uc3QgYWN0dWFsU3VtOiB1aW50NjQgPSByYXRlIC0gdGhpcy5ha2l0YVJveWFsdHlBbW91bnQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMTQKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgYnVyeSAzNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gYXNzZXJ0KGJhbGFuY2UgPj0gYWN0dWFsU3VtLCBFUlJfTk9UX0VOT1VHSF9GVU5EUykKICAgID49CiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gaWYgKChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpID4gdGhpcy5lbnRyeUlELnZhbHVlKSB7CiAgICBkaWcgMjAKICAgIGRpZyA1CiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA2MQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gaXRlcmF0aW9uQW1vdW50ID0gdGhpcy5lbnRyeUlELnZhbHVlIC0gZGlzYnVyc2VtZW50Q3Vyc29yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMjEKICAgIC0KICAgIGJ1cnkgNQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCBhbW91bnQ6IHVpbnQ2NCA9IGFjdHVhbFN1bSAvIHF1YWxpZmllZFN0YWtlcnMKICAgIGRpZyAzMQogICAgZGlnIDE1CiAgICAvCiAgICBidXJ5IDI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc1CiAgICAvLyBsZXQgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNzYKICAgIC8vIGxldCBhbGxvY1N1bTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMzAKICAgIGRpZyAyMAogICAgYnVyeSAxOAoKZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEA2MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIGZvciAobGV0IGlkID0gZGlzYnVyc2VtZW50Q3Vyc29yOyBpZCA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpZCsrKSB7CiAgICBkaWcgMjAKICAgIGRpZyA1CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIGRpZyAxOAogICAgPgogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX3doaWxlQDY3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc4CiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcyB9ID0gdGhpcy5lbnRyaWVzKGlkKS52YWx1ZQogICAgZGlnIDE3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBlbnRyaWVzID0gQm94TWFwPHVpbnQ2NCwgRW50cnlEYXRhPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeEVudHJpZXMgfSkKICAgIGJ5dGVjIDkgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozNzgKICAgIC8vIGNvbnN0IHsgZGlzcXVhbGlmaWVkLCBhZGRyZXNzIH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDY2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzgzCiAgICAvLyBhbGxvY2F0aW9ucy5wdXNoKHsgYWRkcmVzcywgYW1vdW50IH0pCiAgICBkaWcgMjgKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDM4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozODQKICAgIC8vIGFsbG9jU3VtICs9IGFtb3VudAogICAgZGlnIDMwCiAgICArCiAgICBidXJ5IDMwCgpkaXNidXJzZVJld2FyZHNfYmxvY2tANjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzc3CiAgICAvLyBmb3IgKGxldCBpZCA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaWQgPCAoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KTsgaWQrKykgewogICAgZGlnIDE3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxOAogICAgYiBkaXNidXJzZVJld2FyZHNfd2hpbGVfdG9wQDYyCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfd2hpbGVANjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciA9IG5ld0N1cnNvclZhbHVlCiAgICBkaWcgMTYKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDUKICAgIGludGNfMyAvLyA5MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gdGhpcy5jcmVhdGVSZXdhcmRBbGxvY2F0aW9ucyhhY3RpdmVEaXNidXJzZW1lbnRJRCwgYXNzZXQsIGFsbG9jYXRpb25zLCBhbGxvY1N1bSkKICAgIGRpZyAzNAogICAgZGlnIDI5CiAgICBkaWcgMzgKICAgIGRpZyAzMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzkxCiAgICAvLyBpZiAodGhpcy5lbnRyeUlELnZhbHVlID09PSBuZXdDdXJzb3JWYWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gaWYgKHRoaXMuZW50cnlJRC52YWx1ZSA9PT0gbmV3Q3Vyc29yVmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozOTIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucGhhc2UgPSBEaXNidXJzZW1lbnRQaGFzZUZpbmFsaXphdGlvbgogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgYnl0ZWMgMTQgLy8gMHgxZQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGludGNfMyAvLyA5MgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzAKCmRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlANTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MzY1CiAgICAvLyBiYWxhbmNlID0gQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYXNzZXQpWzBdCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDI4CiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1OQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA2NQogICAgLy8gY2FzZSBEaXN0cmlidXRpb25UeXBlU2h1ZmZsZTogewogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweDI4CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwNjUtMTA3MgogICAgLy8gY2FzZSBEaXN0cmlidXRpb25UeXBlU2h1ZmZsZTogewogICAgLy8gICBpZiAod2lubmluZ1RpY2tldHMubGVuZ3RoID09PSAwKSB7CiAgICAvLyAgICAgdGhpcy5yYWZmbGUocmV3YXJkSUQpCiAgICAvLyAgIH0gZWxzZSB7CiAgICAvLyAgICAgdGhpcy5jcmVhdGVTaHVmZmxlRGlzYnVyc2VtZW50KHJld2FyZElELCBpdGVyYXRpb25BbW91bnQpCiAgICAvLyAgIH0KICAgIC8vICAgYnJlYWsKICAgIC8vIH0KICAgIGFzc2VydCAvLyB1bmtub3duIHJld2FyZCByYXRlIHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDY2CiAgICAvLyBpZiAod2lubmluZ1RpY2tldHMubGVuZ3RoID09PSAwKSB7CiAgICBkaWcgMwogICAgcHVzaGludHMgMTI0IDIgLy8gMTI0LCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYm56IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDY3CiAgICAvLyB0aGlzLnJhZmZsZShyZXdhcmRJRCkKICAgIGRpZyA1CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfZWxzZV9ib2R5QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQwNgogICAgLy8gfSA9IGNsb25lKHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUpCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAzNQogICAgZHVwCiAgICBpbnRjXzMgLy8gOTIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAyMgogICAgZHVwCiAgICBwdXNoaW50IDQ5IC8vIDQ5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMzAKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgYm56IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIGJhbGFuY2UgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcy5iYWxhbmNlCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKCmRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gY29uc3QgYWN0dWFsU3VtOiB1aW50NjQgPSBzdW0gLSB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIGFraXRhUm95YWx0eUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUFraXRhUm95YWx0eUFtb3VudCB9KQogICAgYnl0ZWMgMjIgLy8gImFraXRhX3JveWFsdHlfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gY29uc3QgYWN0dWFsU3VtOiB1aW50NjQgPSBzdW0gLSB0aGlzLmFraXRhUm95YWx0eUFtb3VudC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxMgogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBidXJ5IDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDE2CiAgICAvLyBhc3NlcnQoYmFsYW5jZSA+PSBhY3R1YWxTdW0sIEVSUl9OT1RfRU5PVUdIX0ZVTkRTKQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDE4CiAgICAvLyBpZiAoKGRpc2J1cnNlbWVudEN1cnNvciArIGl0ZXJhdGlvbkFtb3VudCkgPiB0aGlzLmVudHJ5SUQudmFsdWUpIHsKICAgIGRpZyAyMAogICAgZGlnIDUKICAgICsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTgKICAgIC8vIGlmICgoZGlzYnVyc2VtZW50Q3Vyc29yICsgaXRlcmF0aW9uQW1vdW50KSA+IHRoaXMuZW50cnlJRC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBpdGVyYXRpb25BbW91bnQgPSB0aGlzLmVudHJ5SUQudmFsdWUgLSBkaXNidXJzZW1lbnRDdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIGl0ZXJhdGlvbkFtb3VudCA9IHRoaXMuZW50cnlJRC52YWx1ZSAtIGRpc2J1cnNlbWVudEN1cnNvcgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyMQogICAgLQogICAgYnVyeSA1CgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MjMKICAgIC8vIGlmICh3aW5uZXJDb3VudCA+IDApIHsKICAgIGRpZyA2CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2lmX2JvZHlAMzcKICAgIGRpZyAzMQogICAgYnVyeSAyOQoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDI3CiAgICAvLyBsZXQgeyBzdGFrZSwgdGlja2V0LCBkaXNidXJzZWQgfSA9IHJhZmZsZUN1cnNvcgogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludHMgNTkgMjQgLy8gNTksIDI0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIGxldCBjdXJyZW50VGlja2V0ID0gdGlja2V0c1t0aWNrZXRdCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgcHVzaGludCAxMjYgLy8gMTI2CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIGxldCBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSA9IFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYnVyeSAzNwogICAgYnVyeSAyNAogICAgZGlnIDIwCiAgICBidXJ5IDE5CgpkaXNidXJzZVJld2FyZHNfd2hpbGVfdG9wQDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gZm9yIChsZXQgaSA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaSA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpKyspIHsKICAgIGRpZyAyMAogICAgZGlnIDUKICAgICsKICAgIGRpZyAxOQogICAgPgogICAgYnogZGlzYnVyc2VSZXdhcmRzX2Jsb2NrQDUxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcywgYXNzZXQsIHF1YW50aXR5IH0gPSB0aGlzLmVudHJpZXMoaSkudmFsdWUKICAgIGRpZyAxOAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gZW50cmllcyA9IEJveE1hcDx1aW50NjQsIEVudHJ5RGF0YT4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzIH0pCiAgICBieXRlYyA5IC8vICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcywgYXNzZXQsIHF1YW50aXR5IH0gPSB0aGlzLmVudHJpZXMoaSkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBidXJ5IDIxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgYnVyeSAzOAogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMjgKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzNgogICAgLy8gY3VycmVudFJhbmdlRW5kID0gY3VycmVudFJhbmdlU3RhcnQgKyBxdWFudGl0eQogICAgZGlnIDI0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gaWYgKGN1cnJlbnRUaWNrZXQgPj0gY3VycmVudFJhbmdlU3RhcnQgJiYgY3VycmVudFRpY2tldCA8PSBjdXJyZW50UmFuZ2VFbmQpIHsKICAgIGRpZyAyMwogICAgPD0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDQ5CiAgICBkaWcgMjIKICAgIGRpZyAyNQogICAgPD0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyBpZiAoIWRpc3F1YWxpZmllZCkgewogICAgZGlnIDE5CiAgICBibnogZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGFsbG9jYXRpb25zLnB1c2goeyBhZGRyZXNzLCBhbW91bnQgfSkKICAgIGRpZyAyOAogICAgaXRvYgogICAgZGlnIDM3CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGRpc2J1cnNlZCsrCiAgICBkaWcgMjEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDIyCgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIGlmICh0aWNrZXQgPT09IHRpY2tldHMubGVuZ3RoIC0gMSkgewogICAgZGlnIDMKICAgIHB1c2hpbnRzIDEyNCAyIC8vIDEyNCwgMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMTAKICAgID09CiAgICBieiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ0NQogICAgLy8gaWYgKHdpbm5lckNvdW50ICE9PSBkaXNidXJzZWQpIHsKICAgIGRpZyA2CiAgICBkaWcgMjIKICAgICE9CiAgICBieiBkaXNidXJzZVJld2FyZHNfYmxvY2tANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA5MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ0Ny00NTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucmFmZmxlQ3Vyc29yID0gewogICAgLy8gICB0aWNrZXQ6IDAsCiAgICAvLyAgIHN0YWtlOiAwLAogICAgLy8gICBkaXNidXJzZWQ6IDAsCiAgICAvLyB9CiAgICBkdXAKICAgIHB1c2hpbnQgNTkgLy8gNTkKICAgIGJ5dGVjIDM4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ1MgogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS53aW5uaW5nVGlja2V0cyA9IFtdCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBwdXNoaW50IDU3IC8vIDU3CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyB0aGlzLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGFjdGl2ZURpc2J1cnNlbWVudElELCBhc3NldCwgYWxsb2NhdGlvbnMsIHN1bSkKICAgIGRpZyAzMwogICAgZGlnIDI3CiAgICBkaWcgMzcKICAgIGRpZyAxMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA2OQogICAgLy8gdGhpcy5jcmVhdGVTaHVmZmxlRGlzYnVyc2VtZW50KHJld2FyZElELCBpdGVyYXRpb25BbW91bnQpCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDMwCgpkaXNidXJzZVJld2FyZHNfYmxvY2tANTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDcwCiAgICAvLyB0aGlzLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGFjdGl2ZURpc2J1cnNlbWVudElELCBhc3NldCwgYWxsb2NhdGlvbnMsIHN1bSkKICAgIGRpZyAzMwogICAgZGlnIDI4CiAgICBkaWcgMzcKICAgIGRpZyAxMwogICAgY2FsbHN1YiBjcmVhdGVSZXdhcmRBbGxvY2F0aW9ucwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBpZiAod2lubmVyQ291bnQgPT09IGRpc2J1cnNlZCkgewogICAgZGlnIDYKICAgIGRpZyAyMgogICAgPT0KICAgIGJ6IGRpc2J1cnNlUmV3YXJkc19lbHNlX2JvZHlANTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUucGhhc2UgPSBEaXNidXJzZW1lbnRQaGFzZUZpbmFsaXphdGlvbgogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgYnl0ZWMgMTQgLy8gMHgxZQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NzUtNDc5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnJhZmZsZUN1cnNvciA9IHsKICAgIC8vICAgdGlja2V0OiAwLAogICAgLy8gICBzdGFrZTogMCwKICAgIC8vICAgZGlzYnVyc2VkOiAwLAogICAgLy8gfQogICAgZHVwCiAgICBwdXNoaW50IDU5IC8vIDU5CiAgICBieXRlYyAzOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0ODAKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUud2lubmluZ1RpY2tldHMgPSBbXQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgcHVzaGludCA1NyAvLyA1NwogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUA1MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yICs9IGl0ZXJhdGlvbkFtb3VudAogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18zIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDkyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDgzCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnJhZmZsZUN1cnNvciA9IHsgdGlja2V0LCBzdGFrZSwgZGlzYnVyc2VkIH0KICAgIGRpZyAxMAogICAgaXRvYgogICAgZGlnIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyMwogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoaW50IDU5IC8vIDU5CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzMAoKZGlzYnVyc2VSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyBpdGVyYXRpb25BbW91bnQgLT0gaQogICAgZGlnIDQKICAgIGRpZyAxOQogICAgLQogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyB0aWNrZXQrKwogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGN1cnJlbnRUaWNrZXQgPSB0aWNrZXRzW3RpY2tldF0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBwdXNoaW50IDEyNiAvLyAxMjYKICAgICsKICAgIGRpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDYyCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmRpc2J1cnNlbWVudEN1cnNvciA9IDEgLy8gRW50cnkgSURzIHN0YXJ0IGF0IDEKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBpbnRjXzMgLy8gOTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBpID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIHN0YWtlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIGN1cnJlbnRSYW5nZUVuZCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDI1CgpkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA0OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0NjcKICAgIC8vIGN1cnJlbnRSYW5nZVN0YXJ0ID0gY3VycmVudFJhbmdlRW5kICsgMQogICAgZGlnIDI0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gZm9yIChsZXQgaSA9IGRpc2J1cnNlbWVudEN1cnNvcjsgaSA8IChkaXNidXJzZW1lbnRDdXJzb3IgKyBpdGVyYXRpb25BbW91bnQpOyBpKyspIHsKICAgIGRpZyAxOAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTkKICAgIGIgZGlzYnVyc2VSZXdhcmRzX3doaWxlX3RvcEAzOQoKZGlzYnVyc2VSZXdhcmRzX2lmX2JvZHlAMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDI0CiAgICAvLyBhbW91bnQgPSBhY3R1YWxTdW0gLyB3aW5uZXJDb3VudAogICAgZGlnIDMxCiAgICBkaWcgNwogICAgLwogICAgYnVyeSAyOQogICAgYiBkaXNidXJzZVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAzOAoKZGlzYnVyc2VSZXdhcmRzX2Vsc2VfYm9keUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGJhbGFuY2UgPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBhc3NldClbMF0KICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMjgKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICBiIGRpc2J1cnNlUmV3YXJkc19hZnRlcl9pZl9lbHNlQDM0CgpkaXNidXJzZVJld2FyZHNfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZGlzYnVyc2VSZXdhcmRzX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZmluYWxpemVEaXN0cmlidXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpmaW5hbGl6ZURpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDgwCiAgICAvLyBmaW5hbGl6ZURpc3RyaWJ1dGlvbihyZXdhcmRJRDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwODEKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHMocmV3YXJkSUQpLmV4aXN0cywgJ3Jld2FyZCBkb2VzIG5vdCBleGlzdCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4MQogICAgLy8gYXNzZXJ0KHRoaXMucmV3YXJkcyhyZXdhcmRJRCkuZXhpc3RzLCAncmV3YXJkIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gcmV3YXJkIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4MgogICAgLy8gY29uc3QgeyBwaGFzZSwgYWN0aXZlRGlzYnVyc2VtZW50SUQgfSA9IHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCA5MSAvLyA5MQogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwODMKICAgIC8vIGFzc2VydChwaGFzZSA9PT0gRGlzYnVyc2VtZW50UGhhc2VGaW5hbGl6YXRpb24sIEVSUl9ESVNCVVJTRU1FTlRfTk9UX1JFQURZX0ZPUl9GSU5BTElaQVRJT04pCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDE0IC8vIDB4MWUKICAgID09CiAgICBhc3NlcnQgLy8gRGlzYnVyc2VtZW50IG5vdCByZWFkeSBmb3IgZmluYWxpemF0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYyMgogICAgLy8gY29uc3QgcmV3YXJkc0FwcCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5yZXdhcmRzKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjI0LTYyNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuZmluYWxpemVEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFtkaXNidXJzZW1lbnRJRF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4NTQyNGE1OTEgLy8gbWV0aG9kICJmaW5hbGl6ZURpc2J1cnNlbWVudCh1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGFjdGl2ZURpc2J1cnNlbWVudElEKS5jcmVhdGUoKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIGJ5dGVzPDA+Pih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwODcKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhhY3RpdmVEaXNidXJzZW1lbnRJRCkuY3JlYXRlKCkKICAgIGludGNfMCAvLyAwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDg5CiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnBoYXNlID0gRGlzYnVyc2VtZW50UGhhc2VJZGxlCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDkwCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLmFjdGl2ZURpc2J1cnNlbWVudElEID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwOTEKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuYWN0aXZlRGlzYnVyc2VtZW50Um91bmRTdGFydCA9IDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwOTIKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUuZGlzYnVyc2VtZW50Q3Vyc29yID0gMSAvLyBFbnRyeSBJRHMgc3RhcnQgYXQgMQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gOTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDkzCiAgICAvLyB0aGlzLnJld2FyZHMocmV3YXJkSUQpLnZhbHVlLnF1YWxpZmllZFN0YWtlcnMgPSAwCiAgICBkaWcgMQogICAgcHVzaGludCAzMyAvLyAzMwogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA5NAogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS5xdWFsaWZpZWRTdGFrZSA9IDAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTA4MAogICAgLy8gZmluYWxpemVEaXN0cmlidXRpb24ocmV3YXJkSUQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuY2hlY2tbcm91dGluZ10oKSAtPiB2b2lkOgpjaGVjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyBjaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogeyB2YWxpZDogYm9vbGVhbiwgYmFsYW5jZTogdWludDY0IH0gewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDk4CiAgICAvLyBjb25zdCBrZXk6IEVudHJ5S2V5ID0geyBhZGRyZXNzLCBhc3NldCB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGVudHJpZXNCeUFkZHJlc3MgPSBCb3hNYXA8RW50cnlLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzQnlBZGRyZXNzIH0pCiAgICBieXRlYyAzMCAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwOTkKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5lbnRyaWVzQnlBZGRyZXNzKGtleSkudmFsdWUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEwMAogICAgLy8gcmV0dXJuIHRoaXMuY2hlY2tCeUlEKGlkKQogICAgY2FsbHN1YiBjaGVja0J5SUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyBjaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogeyB2YWxpZDogYm9vbGVhbiwgYmFsYW5jZTogdWludDY0IH0gewogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ106CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEwMwogICAgLy8gZ2F0ZUNoZWNrKGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLCBhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTA0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgYWRkcmVzcykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTA0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgYWRkcmVzcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0MwogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaWZfZWxzZUA3CiAgICBkaWcgMgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIGNvbnN0IHBhc3NlcyA9IGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIGNvbnN0IHBhc3NlcyA9IGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBnYXRlSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlHYXRlSUQgfSkKICAgIGJ5dGVjIDEyIC8vICJnYXRlX2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIGNvbnN0IHBhc3NlcyA9IGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIHRoaXMuZ2F0ZUlELnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGdhdGVDaGVjawogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDgKICAgIC8vIGlmICghcGFzc2VzICYmIHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3Rha2luZ1R5cGU+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlUeXBlIH0pCiAgICBieXRlYyA0IC8vICJ0eXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMDgKICAgIC8vIGlmICghcGFzc2VzICYmIHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDBhCiAgICAhPQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nYXRlQ2hlY2tbcm91dGluZ11fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEwOQogICAgLy8gY29uc3Qga2V5OiBFbnRyeUtleSA9IHsgYWRkcmVzcywgYXNzZXQgfQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGVudHJpZXNCeUFkZHJlc3MgPSBCb3hNYXA8RW50cnlLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzQnlBZGRyZXNzIH0pCiAgICBieXRlYyAzMCAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMTAKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5lbnRyaWVzQnlBZGRyZXNzKGtleSkudmFsdWUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTExMQogICAgLy8gdGhpcy5lbnRyaWVzKGlkKS52YWx1ZS5kaXNxdWFsaWZpZWQgPSB0cnVlCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBlbnRyaWVzID0gQm94TWFwPHVpbnQ2NCwgRW50cnlEYXRhPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeEVudHJpZXMgfSkKICAgIGJ5dGVjIDkgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTExCiAgICAvLyB0aGlzLmVudHJpZXMoaWQpLnZhbHVlLmRpc3F1YWxpZmllZCA9IHRydWUKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDEKICAgIHNldGJpdAogICAgcHVzaGludCA1MCAvLyA1MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTAzCiAgICAvLyBnYXRlQ2hlY2soZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sIGFkZHJlc3M6IEFjY291bnQsIGFzc2V0OiB1aW50NjQpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgYnl0ZWMgMzcgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTA1CiAgICAvLyBjb25zdCBvcmlnaW4gPSBvcmlnaW5Pcih3YWxsZXQsIGFkZHJlc3MpCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2F0ZUNoZWNrW3JvdXRpbmddX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6b3JpZ2luT3JAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuZW50ZXJDb3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKZW50ZXJDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMjMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTI3CiAgICAvLyBsZXQgYm94TWJyOiB1aW50NjQgPSBlbnRyeU1CUiAqIGVudHJ5Q291bnQKICAgIGludGMgMTAgLy8gNTA2MDAKICAgICoKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHVuaXF1ZXMgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogUG9vbEdsb2JhbFN0YXRlS2V5VW5pcXVlcyB9KQogICAgYnl0ZWMgMjMgLy8gInUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTMwCiAgICAvLyBpZiAoIXRoaXMudW5pcXVlcyhhZGRyZXNzKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGVudGVyQ29zdF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTMxCiAgICAvLyBib3hNYnIgKz0gUG9vbFVuaXF1ZXNNQlIKICAgIGludGMgMTEgLy8gMTg5MDAKICAgICsKCmVudGVyQ29zdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEyMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExMzkKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlYyA3IC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0MAogICAgLy8gcmV0dXJuIChHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAoMSArIGNvdW50KSkgKyAodGhpcy5yZXdhcmRzTWJyKFdpbm5lckNvdW50Q2FwKSAqIDIpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDIKICAgICsKICAgICoKICAgIHB1c2hpbnQgODAwMCAvLyA4MDAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTEzNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5zaWduVXBzT3Blbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpZ25VcHNPcGVuOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDcKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBQb29sU3RhdHVzRHJhZnQgJiYKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyBzdGF0dXMgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YXR1cz4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YXR1cyB9KQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ3CiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gUG9vbFN0YXR1c0RyYWZ0ICYmCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAweDAwCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDctMTE0OAogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlICYmCiAgICBieiBzaWduVXBzT3Blbl9ib29sX2ZhbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ4CiAgICAvLyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wID4gdGhpcy5zaWdudXBUaW1lc3RhbXAudmFsdWUgJiYKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyBzaWdudXBUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVNpZ251cFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMjQgLy8gInNpZ251cF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0OAogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlICYmCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDctMTE0OAogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlICYmCiAgICBieiBzaWduVXBzT3Blbl9ib29sX2ZhbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFydFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTYgLy8gInN0YXJ0X3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDwKICAgIGJueiBzaWduVXBzT3Blbl9ib29sX3RydWVANQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGFsbG93TGF0ZVNpZ251cHMgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5QWxsb3dMYXRlU2lnbnVwcyB9KQogICAgYnl0ZWMgMTUgLy8gImFsbG93X2xhdGVfc2lnbnVwcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IHNpZ25VcHNPcGVuX2Jvb2xfZmFsc2VANgoKc2lnblVwc09wZW5fYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKc2lnblVwc09wZW5fYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNDQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnNpZ25VcHNPcGVuX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHNpZ25VcHNPcGVuX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlW3JvdXRpbmddKCkgLT4gdm9pZDoKaXNMaXZlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzTGl2ZQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzRW50ZXJlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmlzRW50ZXJlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTY0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHVuaXF1ZXMgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogUG9vbEdsb2JhbFN0YXRlS2V5VW5pcXVlcyB9KQogICAgYnl0ZWMgMjMgLy8gInUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTY2CiAgICAvLyByZXR1cm4gdGhpcy51bmlxdWVzKGFkZHJlc3MpLmV4aXN0czsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNjQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmdldFN0YXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U3RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3MgogICAgLy8gc3RhdHVzOiB0aGlzLnN0YXR1cy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyBzdGF0dXMgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YXR1cz4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YXR1cyB9KQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTcyCiAgICAvLyBzdGF0dXM6IHRoaXMuc3RhdHVzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTczCiAgICAvLyB0aXRsZTogdGhpcy50aXRsZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyB0aXRsZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVRpdGxlIH0pCiAgICBieXRlYyAyOCAvLyAidGl0bGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3MwogICAgLy8gdGl0bGU6IHRoaXMudGl0bGUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzQKICAgIC8vIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3NAogICAgLy8gdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc1CiAgICAvLyBzaWdudXBUaW1lc3RhbXA6IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjAKICAgIC8vIHNpZ251cFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U2lnbnVwVGltZXN0YW1wIH0pCiAgICBieXRlYyAyNCAvLyAic2lnbnVwX3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc1CiAgICAvLyBzaWdudXBUaW1lc3RhbXA6IHRoaXMuc2lnbnVwVGltZXN0YW1wLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc2CiAgICAvLyBhbGxvd0xhdGVTaWdudXBzOiB0aGlzLmFsbG93TGF0ZVNpZ251cHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYWxsb3dMYXRlU2lnbnVwcyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlBbGxvd0xhdGVTaWdudXBzIH0pCiAgICBieXRlYyAxNSAvLyAiYWxsb3dfbGF0ZV9zaWdudXBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzYKICAgIC8vIGFsbG93TGF0ZVNpZ251cHM6IHRoaXMuYWxsb3dMYXRlU2lnbnVwcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE3NwogICAgLy8gc3RhcnRUaW1lc3RhbXA6IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gc3RhcnRUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YXJ0VGltZXN0YW1wIH0pCiAgICBieXRlYyAxNiAvLyAic3RhcnRfdGltZXN0YW1wIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzcKICAgIC8vIHN0YXJ0VGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc4CiAgICAvLyBlbmRUaW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGVuZFRpbWVzdGFtcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW5kVGltZXN0YW1wIH0pCiAgICBieXRlYyAxNyAvLyAiZW5kX3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc4CiAgICAvLyBlbmRUaW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc5CiAgICAvLyBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gbWF4RW50cmllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1heEVudHJpZXMgfSkKICAgIGJ5dGVjIDE4IC8vICJtYXhfZW50cmllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTc5CiAgICAvLyBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODAKICAgIC8vIGVudHJ5Q291bnQ6ICh0aGlzLmVudHJ5SUQudmFsdWUgKyAxKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgwCiAgICAvLyBlbnRyeUNvdW50OiAodGhpcy5lbnRyeUlELnZhbHVlICsgMSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgxCiAgICAvLyByZXdhcmRDb3VudDogKHRoaXMucmV3YXJkSUQudmFsdWUgKyAxKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyByZXdhcmRJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5UmV3YXJkQ291bnQgfSkKICAgIGJ5dGVjIDI1IC8vICJyZXdhcmRfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4MQogICAgLy8gcmV3YXJkQ291bnQ6ICh0aGlzLnJld2FyZElELnZhbHVlICsgMSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgyCiAgICAvLyB0b3RhbFN0YWtlZDogdGhpcy50b3RhbFN0YWtlZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyB0b3RhbFN0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VG90YWxTdGFrZWQgfSkKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9zdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4MgogICAgLy8gdG90YWxTdGFrZWQ6IHRoaXMudG90YWxTdGFrZWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODMKICAgIC8vIHN0YWtlS2V5OiB0aGlzLnN0YWtlS2V5LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIHN0YWtlS2V5ID0gR2xvYmFsU3RhdGU8Um9vdEtleT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVN0YWtlS2V5IH0pCiAgICBieXRlYyAyNiAvLyAic3Rha2Vfa2V5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODMKICAgIC8vIHN0YWtlS2V5OiB0aGlzLnN0YWtlS2V5LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg0CiAgICAvLyBtaW5pbXVtU3Rha2VBbW91bnQ6IHRoaXMubWluaW11bVN0YWtlQW1vdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIG1pbmltdW1TdGFrZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1pbmltdW1TdGFrZUFtb3VudCB9KQogICAgYnl0ZWMgMjkgLy8gIm1pbmltdW1fc3Rha2VfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODQKICAgIC8vIG1pbmltdW1TdGFrZUFtb3VudDogdGhpcy5taW5pbXVtU3Rha2VBbW91bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExODUKICAgIC8vIGdhdGVJRDogdGhpcy5nYXRlSUQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMiAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg1CiAgICAvLyBnYXRlSUQ6IHRoaXMuZ2F0ZUlELnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg2CiAgICAvLyBjcmVhdG9yOiB0aGlzLmNyZWF0b3IudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlDcmVhdG9yIH0pCiAgICBieXRlYyAxMSAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTg2CiAgICAvLyBjcmVhdG9yOiB0aGlzLmNyZWF0b3IudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNzEtMTE4NwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgc3RhdHVzOiB0aGlzLnN0YXR1cy52YWx1ZSwKICAgIC8vICAgdGl0bGU6IHRoaXMudGl0bGUudmFsdWUsCiAgICAvLyAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vICAgc2lnbnVwVGltZXN0YW1wOiB0aGlzLnNpZ251cFRpbWVzdGFtcC52YWx1ZSwKICAgIC8vICAgYWxsb3dMYXRlU2lnbnVwczogdGhpcy5hbGxvd0xhdGVTaWdudXBzLnZhbHVlLAogICAgLy8gICBzdGFydFRpbWVzdGFtcDogdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSwKICAgIC8vICAgZW5kVGltZXN0YW1wOiB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSwKICAgIC8vICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLnZhbHVlLAogICAgLy8gICBlbnRyeUNvdW50OiAodGhpcy5lbnRyeUlELnZhbHVlICsgMSksCiAgICAvLyAgIHJld2FyZENvdW50OiAodGhpcy5yZXdhcmRJRC52YWx1ZSArIDEpLAogICAgLy8gICB0b3RhbFN0YWtlZDogdGhpcy50b3RhbFN0YWtlZC52YWx1ZSwKICAgIC8vICAgc3Rha2VLZXk6IHRoaXMuc3Rha2VLZXkudmFsdWUsCiAgICAvLyAgIG1pbmltdW1TdGFrZUFtb3VudDogdGhpcy5taW5pbXVtU3Rha2VBbW91bnQudmFsdWUsCiAgICAvLyAgIGdhdGVJRDogdGhpcy5nYXRlSUQudmFsdWUsCiAgICAvLyAgIGNyZWF0b3I6IHRoaXMuY3JlYXRvci52YWx1ZSwKICAgIC8vIH0KICAgIGRpZyAxMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBwdXNoYnl0ZXMgMHgwMDZmCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTExIC8vIDExMQogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAxNAogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNjkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VGZWVHZW5lcmF0b3JDb250cmFjdC51cGRhdGVBa2l0YURBT0VzY3Jvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM3CiAgICAvLyB1cGRhdGVBa2l0YURBT0VzY3JvdyhhcHA6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDcgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFwcAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coYXBwOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBieXRlYyAyMCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQKICAgIC8vIGNvbnN0IFtwbHVnaW5BcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUGx1Z2luQXBwTGlzdCkpCiAgICBieXRlYyAzNiAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTIKICAgIC8vIGFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhcHAgdXBncmFkZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIHB1c2hieXRlcyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjUzCiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSBuZXdWZXJzaW9uCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VDb250cmFjdC51cGRhdGVBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDIwIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6OkJhc2VTdGFraW5nUG9vbC5tYnJbcm91dGluZ10oKSAtPiB2b2lkOgptYnI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czo5CiAgICAvLyByZXR1cm4gTWluUG9vbFJld2FyZHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiB3aW5uaW5nVGlja2V0cykKICAgIGludGMgNiAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czoxNS0yMQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZW50cmllczogUG9vbEVudHJpZXNNQlIsCiAgICAvLyAgIHVuaXF1ZXM6IFBvb2xVbmlxdWVzTUJSLAogICAgLy8gICBlbnRyaWVzQnlBZGRyZXNzOiBQb29sRW50cmllc0J5QWRkcmVzc01CUiwKICAgIC8vICAgcmV3YXJkczogdGhpcy5yZXdhcmRzTWJyKHdpbm5pbmdUaWNrZXRzKSwKICAgIC8vICAgZGlzYnVyc2VtZW50czogUG9vbERpc2J1cnNlbWVudFNNQlIKICAgIC8vIH0KICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDYyZDQwMDAwMDAwMDAwMDA0OWQ0MDAwMDAwMDAwMDAwNjJkNAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MjAKICAgIC8vIGRpc2J1cnNlbWVudHM6IFBvb2xEaXNidXJzZW1lbnRTTUJSCiAgICBwdXNoaW50IDYxMDAgLy8gNjEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjE1LTIxCiAgICAvLyByZXR1cm4gewogICAgLy8gICBlbnRyaWVzOiBQb29sRW50cmllc01CUiwKICAgIC8vICAgdW5pcXVlczogUG9vbFVuaXF1ZXNNQlIsCiAgICAvLyAgIGVudHJpZXNCeUFkZHJlc3M6IFBvb2xFbnRyaWVzQnlBZGRyZXNzTUJSLAogICAgLy8gICByZXdhcmRzOiB0aGlzLnJld2FyZHNNYnIod2lubmluZ1RpY2tldHMpLAogICAgLy8gICBkaXNidXJzZW1lbnRzOiBQb29sRGlzYnVyc2VtZW50U01CUgogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuY2hlY2tCeUlEKGlkOiB1aW50NjQpIC0+IGJ5dGVzOgpjaGVja0J5SUQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDg3CiAgICAvLyBwcml2YXRlIGNoZWNrQnlJRChpZDogdWludDY0KTogeyB2YWxpZDogYm9vbGVhbiwgYmFsYW5jZTogdWludDY0IH0gewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gdGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FIHx8IHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFULAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfTk9ORSB8fCB0aGlzLnR5cGUudmFsdWUgIT09IFBPT0xfU1RBS0lOR19UWVBFX0hFQVJUQkVBVCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vIDB4MDAKICAgICE9CiAgICBibnogY2hlY2tCeUlEX2Jvb2xfdHJ1ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFN0YWtpbmdQb29sU3Rha2luZ1R5cGU+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlUeXBlIH0pCiAgICBieXRlYyA0IC8vICJ0eXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gdGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FIHx8IHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFULAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwYQogICAgIT0KICAgIGJ6IGNoZWNrQnlJRF9ib29sX2ZhbHNlQDMKCmNoZWNrQnlJRF9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpjaGVja0J5SURfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ4OC00OTEKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FIHx8IHRoaXMudHlwZS52YWx1ZSAhPT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFULAogICAgLy8gICBFUlJfSU5WQUxJRF9QT09MX1RZUEVfRk9SX0NIRUNLCiAgICAvLyApCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwb29sIHR5cGUgZm9yIGNoZWNrCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDkzCiAgICAvLyBjb25zdCB7IGRpc3F1YWxpZmllZCwgYWRkcmVzcywgYXNzZXQsIHF1YW50aXR5IH0gPSB0aGlzLmVudHJpZXMoaWQpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0OTMKICAgIC8vIGNvbnN0IHsgZGlzcXVhbGlmaWVkLCBhZGRyZXNzLCBhc3NldCwgcXVhbnRpdHkgfSA9IHRoaXMuZW50cmllcyhpZCkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9idXJ5IDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIHN3YXAKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDk1CiAgICAvLyBpZiAoZGlzcXVhbGlmaWVkKSB7CiAgICBieiBjaGVja0J5SURfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyByZXR1cm4geyB2YWxpZDogZmFsc2UsIGJhbGFuY2U6IDAgfQogICAgYnl0ZWMgMzkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjaGVja0J5SURfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjQ5OQogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfU09GVCkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo0OTkKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyAxMyAvLyAweDE0CiAgICA9PQogICAgYnogY2hlY2tCeUlEX2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUwMC01MDMKICAgIC8vIGNvbnN0IGNoZWNrID0gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZy5wcm90b3R5cGUuc29mdENoZWNrPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIC8vICAgYXJnczogW2FkZHJlc3MsIGFzc2V0XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTAwLTUwMwogICAgLy8gY29uc3QgY2hlY2sgPSBhYmlDYWxsPHR5cGVvZiBTdGFraW5nLnByb3RvdHlwZS5zb2Z0Q2hlY2s+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbYWRkcmVzcywgYXNzZXRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDQ4NzE2ZjFhIC8vIG1ldGhvZCAic29mdENoZWNrKGFkZHJlc3MsdWludDY0KShib29sLHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGJvb2wxLHVpbnQ2NCkKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTA1CiAgICAvLyBpZiAoY2hlY2suYmFsYW5jZSA+PSBxdWFudGl0eSkgewogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICBmcmFtZV9kaWcgNAogICAgPj0KICAgIGJ6IGNoZWNrQnlJRF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTA2CiAgICAvLyByZXR1cm4geyB2YWxpZDogdHJ1ZSwgYmFsYW5jZTogY2hlY2suYmFsYW5jZSB9CiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2hlY2tCeUlEX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTI1CiAgICAvLyB0aGlzLmVudHJpZXMoaWQpLnZhbHVlLmRpc3F1YWxpZmllZCA9IHRydWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAxCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTI2CiAgICAvLyByZXR1cm4geyB2YWxpZDogZmFsc2UsIGJhbGFuY2U6IDAgfQogICAgYnl0ZWMgMzkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjaGVja0J5SURfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUwOS01MTgKICAgIC8vIGNvbnN0IGluZm8gPSBhYmlDYWxsPHR5cGVvZiBTdGFraW5nLnByb3RvdHlwZS5nZXRJbmZvPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGFkZHJlc3MsCiAgICAvLyAgICAgewogICAgLy8gICAgICAgYXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgLy8gICAgIH0sCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MTAKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MTUKICAgIC8vIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTEzLTUxNgogICAgLy8gewogICAgLy8gICBhc3NldDogYXNzZXQsCiAgICAvLyAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vIH0sCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTA5LTUxOAogICAgLy8gY29uc3QgaW5mbyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEluZm8+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgICB7CiAgICAvLyAgICAgICBhc3NldDogYXNzZXQsCiAgICAvLyAgICAgICB0eXBlOiB0aGlzLnR5cGUudmFsdWUsCiAgICAvLyAgICAgfSwKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyA0MCAvLyBtZXRob2QgImdldEluZm8oYWRkcmVzcywodWludDY0LHVpbnQ4KSkodWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgbGVuCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAodWludDY0LHVpbnQ2NCx1aW50NjQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjUyMAogICAgLy8gaWYgKGluZm8uYW1vdW50ID49IHF1YW50aXR5KSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2RpZyA0CiAgICA+PQogICAgYnogY2hlY2tCeUlEX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1MjEKICAgIC8vIHJldHVybiB7IHZhbGlkOiB0cnVlLCBiYWxhbmNlOiBpbmZvLmFtb3VudCB9CiAgICBmcmFtZV9kaWcgNgogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHg4MAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2hlY2tCeUlEX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNoZWNrQnlJRF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKGRpc2J1cnNlbWVudElEOiB1aW50NjQsIGFzc2V0OiB1aW50NjQsIGFsbG9jYXRpb25zOiBieXRlcywgc3VtOiB1aW50NjQpIC0+IGJ5dGVzOgpjcmVhdGVSZXdhcmRBbGxvY2F0aW9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1NzctNTgyCiAgICAvLyBwcml2YXRlIGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zKAogICAgLy8gICBkaXNidXJzZW1lbnRJRDogdWludDY0LAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSwKICAgIC8vICAgc3VtOiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg0CiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg0CiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnJld2FyZHMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU4NAogICAgLy8gY29uc3QgcmV3YXJkc0FwcCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5yZXdhcmRzKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjU1CiAgICAvLyByZXR1cm4gVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDI1MzAwIC8vIDI1MzAwCiAgICAqCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg3CiAgICAvLyBpZiAoYXNzZXQgPT09IDApIHsKICAgIGZyYW1lX2RpZyAtMwogICAgYm56IGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zX2Vsc2VfYm9keUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTg5LTU5OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlVXNlckFsbG9jYXRpb25zPih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCArIHN1bSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBkaXNidXJzZW1lbnRJRCwKICAgIC8vICAgICBhbGxvY2F0aW9ucywKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTkzCiAgICAvLyByZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyBhbW91bnQ6IG1ickFtb3VudCArIHN1bSwKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NTkyLTU5NQogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQgKyBzdW0sCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1ODktNTk5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVVc2VyQWxsb2NhdGlvbnM+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50ICsgc3VtLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGRpc2J1cnNlbWVudElELAogICAgLy8gICAgIGFsbG9jYXRpb25zLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gZGlzYnVyc2VtZW50SUQsCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo1ODktNTk5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVVc2VyQWxsb2NhdGlvbnM+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50ICsgc3VtLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGRpc2J1cnNlbWVudElELAogICAgLy8gICAgIGFsbG9jYXRpb25zLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDU2NTZhY2Y5IC8vIG1ldGhvZCAiY3JlYXRlVXNlckFsbG9jYXRpb25zKHBheSx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCmNyZWF0ZVJld2FyZEFsbG9jYXRpb25zX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHJldHN1YgoKY3JlYXRlUmV3YXJkQWxsb2NhdGlvbnNfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjAyLTYxNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zPih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBzdW0sCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgZGlzYnVyc2VtZW50SUQsCiAgICAvLyAgICAgYWxsb2NhdGlvbnMsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYwNgogICAgLy8gcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjA1LTYwOAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2MDktNjEzCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBzdW0sCiAgICAvLyB9KSwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYxMAogICAgLy8gYXNzZXRSZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYwOS02MTMKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHN1bSwKICAgIC8vIH0pLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYwMi02MTcKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9ucz4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogcmV3YXJkc0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogc3VtLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGRpc2J1cnNlbWVudElELAogICAgLy8gICAgIGFsbG9jYXRpb25zLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gZGlzYnVyc2VtZW50SUQsCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2MDItNjE3CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnM+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHJld2FyZHNBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiByZXdhcmRzQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IHN1bSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBkaXNidXJzZW1lbnRJRCwKICAgIC8vICAgICBhbGxvY2F0aW9ucywKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgzYzYwZGZhMCAvLyBtZXRob2QgImNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9ucyhwYXksYXhmZXIsdWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNyZWF0ZVJld2FyZEFsbG9jYXRpb25zX2FmdGVyX2lmX2Vsc2VAMTAKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZVBvb2xFbnRyaWVzKHBheW1lbnQ6IHVpbnQ2NCwgZW50cmllczogYnl0ZXMsIGdhdGVBcmdzOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpjcmVhdGVQb29sRW50cmllczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NTgKICAgIC8vIHByaXZhdGUgY3JlYXRlUG9vbEVudHJpZXMocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBlbnRyaWVzOiBTdGFrZUVudHJ5W10sIGdhdGVBcmdzOiBHYXRlQXJncyk6IHZvaWQgewogICAgcHJvdG8gMyAyCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY1OQogICAgLy8gYXNzZXJ0KHRoaXMuaXNMaXZlKCksICd0aGUgcG9vbCBpcyBub3QgbGl2ZScpCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlCiAgICBhc3NlcnQgLy8gdGhlIHBvb2wgaXMgbm90IGxpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjIKICAgIC8vICh0aGlzLmVudHJ5SUQudmFsdWUgKyAxKSA8PSB0aGlzLm1heEVudHJpZXMudmFsdWUgfHwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBlbnRyeUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbnRyeUNvdW50IH0pCiAgICBieXRlY18xIC8vICJlbnRyeV9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjIKICAgIC8vICh0aGlzLmVudHJ5SUQudmFsdWUgKyAxKSA8PSB0aGlzLm1heEVudHJpZXMudmFsdWUgfHwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjgKICAgIC8vIG1heEVudHJpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlNYXhFbnRyaWVzIH0pCiAgICBieXRlYyAxOCAvLyAibWF4X2VudHJpZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjYyCiAgICAvLyAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjItNjYzCiAgICAvLyAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICAvLyB0aGlzLm1heEVudHJpZXMudmFsdWUgPT09IDAsCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF90cnVlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjMKICAgIC8vIHRoaXMubWF4RW50cmllcy52YWx1ZSA9PT0gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBtYXhFbnRyaWVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWF4RW50cmllcyB9KQogICAgYnl0ZWMgMTggLy8gIm1heF9lbnRyaWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY2MwogICAgLy8gdGhpcy5tYXhFbnRyaWVzLnZhbHVlID09PSAwLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NjItNjYzCiAgICAvLyAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICAvLyB0aGlzLm1heEVudHJpZXMudmFsdWUgPT09IDAsCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAzCgpjcmVhdGVQb29sRW50cmllc19ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpjcmVhdGVQb29sRW50cmllc19ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjYxLTY2NQogICAgLy8gYXNzZXJ0KAogICAgLy8gICAodGhpcy5lbnRyeUlELnZhbHVlICsgMSkgPD0gdGhpcy5tYXhFbnRyaWVzLnZhbHVlIHx8CiAgICAvLyAgIHRoaXMubWF4RW50cmllcy52YWx1ZSA9PT0gMCwKICAgIC8vICAgJ3Bvb2wgaGFzIHJlYWNoZWQgbWF4aW11bSBlbnRyaWVzJwogICAgLy8gKQogICAgYXNzZXJ0IC8vIHBvb2wgaGFzIHJlYWNoZWQgbWF4aW11bSBlbnRyaWVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IGVudHJ5TUJSICogZW50cmllcy5sZW5ndGgKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgaW50YyAxMCAvLyA1MDYwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBieXRlYyAyMyAvLyAidSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NzAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NzAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyB0b3RhbCArPSBQb29sVW5pcXVlc01CUgogICAgaW50YyAxMSAvLyAxODkwMAogICAgKwoKY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY3NC02ODEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogeyBncmVhdGVyVGhhbkVxOiB0b3RhbCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY3NC02ODEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogeyBncmVhdGVyVGhhbkVxOiB0b3RhbCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjgzCiAgICAvLyBjb25zdCB7IGFkZHJlc3MsIG5hbWUgfSA9IHRoaXMuc3Rha2VLZXkudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBzdGFrZUtleSA9IEdsb2JhbFN0YXRlPFJvb3RLZXk+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFrZUtleSB9KQogICAgYnl0ZWMgMjYgLy8gInN0YWtlX2tleSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2ODMKICAgIC8vIGNvbnN0IHsgYWRkcmVzcywgbmFtZSB9ID0gdGhpcy5zdGFrZUtleS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmNyZWF0ZVBvb2xFbnRyaWVzX3doaWxlX3RvcEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfd2hpbGVAMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2ODYKICAgIC8vIGFzc2VydChlbnRyaWVzW2ldLnF1YW50aXR5ID49IHRoaXMubWluaW11bVN0YWtlQW1vdW50LnZhbHVlLCAncXVhbnRpdHkgaXMgbGVzcyB0aGFuIG1pbmltdW0gc3Rha2UgYW1vdW50JykKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICBmcmFtZV9kaWcgMwogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIG1pbmltdW1TdGFrZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1pbmltdW1TdGFrZUFtb3VudCB9KQogICAgYnl0ZWMgMjkgLy8gIm1pbmltdW1fc3Rha2VfYW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4NgogICAgLy8gYXNzZXJ0KGVudHJpZXNbaV0ucXVhbnRpdHkgPj0gdGhpcy5taW5pbXVtU3Rha2VBbW91bnQudmFsdWUsICdxdWFudGl0eSBpcyBsZXNzIHRoYW4gbWluaW11bSBzdGFrZSBhbW91bnQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gcXVhbnRpdHkgaXMgbGVzcyB0aGFuIG1pbmltdW0gc3Rha2UgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Njg4CiAgICAvLyBpZiAoYWRkcmVzcyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4OS02OTgKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoaXRvYihlbnRyaWVzW2ldLmFzc2V0KSkpLAogICAgLy8gICAgIGVudHJpZXNbaV0ucHJvb2YsCiAgICAvLyAgICAgTUVSS0xFX1RSRUVfVFlQRV9BU1NFVCwKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjkwCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY5MAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjkwCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2OTQKICAgIC8vIHNoYTI1NihzaGEyNTYoaXRvYihlbnRyaWVzW2ldLmFzc2V0KSkpLAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHNoYTI1NgogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6Njk1CiAgICAvLyBlbnRyaWVzW2ldLnByb29mLAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2OTYKICAgIC8vIE1FUktMRV9UUkVFX1RZUEVfQVNTRVQsCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY4OS02OTgKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoaXRvYihlbnRyaWVzW2ldLmFzc2V0KSkpLAogICAgLy8gICAgIGVudHJpZXNbaV0ucHJvb2YsCiAgICAvLyAgICAgTUVSS0xFX1RSRUVfVFlQRV9BU1NFVCwKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHgyYmYzY2M1YSAvLyBtZXRob2QgInZlcmlmeShhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NClib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyBhc3NlcnQodmVyaWZpZWQsICdmYWlsZWQgdG8gdmVyaWZ5IHN0YWtlIHJlcXVpcmVtZW50cycpCiAgICBhc3NlcnQgLy8gZmFpbGVkIHRvIHZlcmlmeSBzdGFrZSByZXF1aXJlbWVudHMKCmNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzA1CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX0hFQVJUQkVBVCB8fAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MDUKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUIHx8CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDBhCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcwNS03MDYKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUIHx8CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGJueiBjcmVhdGVQb29sRW50cmllc19pZl9ib2R5QDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzA2CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzA2CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyAxMyAvLyAweDE0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcwNS03MDYKICAgIC8vIHRoaXMudHlwZS52YWx1ZSA9PT0gUE9PTF9TVEFLSU5HX1RZUEVfSEVBUlRCRUFUIHx8CiAgICAvLyB0aGlzLnR5cGUudmFsdWUgPT09IFBPT0xfU1RBS0lOR19UWVBFX1NPRlQKICAgIGJ6IGNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMjEKCmNyZWF0ZVBvb2xFbnRyaWVzX2lmX2JvZHlAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzEwCiAgICAvLyBpZiAoZW50cmllc1tpXS5hc3NldCAhPT0gMCkgewogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGJ6IGNyZWF0ZVBvb2xFbnRyaWVzX2Vsc2VfYm9keUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcxMQogICAgLy8gKFtiYWxhbmNlLCBvcHRlZEluXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoVHhuLnNlbmRlciwgZW50cmllc1tpXS5hc3NldCkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgNwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKCmNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzE2CiAgICAvLyBhc3NlcnQob3B0ZWRJbiAmJiBiYWxhbmNlID49IGVudHJpZXNbaV0ucXVhbnRpdHksICd1c2VyIGRvZXMgbm90IGhhdmUgbWluIGJhbGFuY2UnKQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAxOQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA+PQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAxOQogICAgaW50Y18xIC8vIDEKCmNyZWF0ZVBvb2xFbnRyaWVzX2Jvb2xfbWVyZ2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzE2CiAgICAvLyBhc3NlcnQob3B0ZWRJbiAmJiBiYWxhbmNlID49IGVudHJpZXNbaV0ucXVhbnRpdHksICd1c2VyIGRvZXMgbm90IGhhdmUgbWluIGJhbGFuY2UnKQogICAgYXNzZXJ0IC8vIHVzZXIgZG9lcyBub3QgaGF2ZSBtaW4gYmFsYW5jZQoKY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjAKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgIT09IFBPT0xfU1RBS0lOR19UWVBFX05PTkUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0eXBlID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGFraW5nVHlwZT4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDQgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzIwCiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlICE9PSBQT09MX1NUQUtJTkdfVFlQRV9OT05FKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAweDAwCiAgICAhPQogICAgYnogY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcyMS03MzAKICAgIC8vIGNvbnN0IHN0YWtlSW5mbyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEluZm8+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICB7CiAgICAvLyAgICAgICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgICAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vICAgICB9LAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Rha2luZywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzIyCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN0YWtpbmcsCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjQKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzI2CiAgICAvLyBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDAgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcyNwogICAgLy8gdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxTdGFraW5nUG9vbFN0YWtpbmdUeXBlPih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNCAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzI1LTcyOAogICAgLy8gewogICAgLy8gICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLAogICAgLy8gfSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjcyMS03MzAKICAgIC8vIGNvbnN0IHN0YWtlSW5mbyA9IGFiaUNhbGw8dHlwZW9mIFN0YWtpbmcucHJvdG90eXBlLmdldEluZm8+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdGFraW5nLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICB7CiAgICAvLyAgICAgICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgICAgIHR5cGU6IHRoaXMudHlwZS52YWx1ZSwKICAgIC8vICAgICB9LAogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDQwIC8vIG1ldGhvZCAiZ2V0SW5mbyhhZGRyZXNzLCh1aW50NjQsdWludDgpKSh1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgcHVzaGludCAyNCAvLyAyNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgcHVzaGludCA0IC8vIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MzIKICAgIC8vIGFzc2VydChzdGFrZUluZm8uYW1vdW50ID49IGVudHJpZXNbaV0ucXVhbnRpdHksICd1c2VyIGRvZXMgbm90IGhhdmUgZW5vdWdoIHN0YWtlZCcpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDYKICAgID49CiAgICBhc3NlcnQgLy8gdXNlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBzdGFrZWQKCmNyZWF0ZVBvb2xFbnRyaWVzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBjb25zdCBpZCA9IHRoaXMuZW50cnlJRC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGVudHJ5SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVudHJ5Q291bnQgfSkKICAgIGJ5dGVjXzEgLy8gImVudHJ5X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gY29uc3QgaWQgPSB0aGlzLmVudHJ5SUQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyB0aGlzLmVudHJ5SUQudmFsdWUgKz0gMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gZW50cnlJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5RW50cnlDb3VudCB9KQogICAgYnl0ZWNfMSAvLyAiZW50cnlfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyB0aGlzLmVudHJ5SUQudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MzcKICAgIC8vIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzM2LTc0MgogICAgLy8gdGhpcy5lbnRyaWVzKGVudHJ5SUQpLnZhbHVlID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vICAgcXVhbnRpdHk6IGVudHJpZXNbaV0ucXVhbnRpdHksCiAgICAvLyAgIGdhdGVBcmdzOiBjbG9uZShnYXRlQXJncyksCiAgICAvLyAgIGRpc3F1YWxpZmllZDogZmFsc2UKICAgIC8vIH0KICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAzMzAwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzM2CiAgICAvLyB0aGlzLmVudHJpZXMoZW50cnlJRCkudmFsdWUgPSB7CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGVudHJpZXMgPSBCb3hNYXA8dWludDY0LCBFbnRyeURhdGE+KHsga2V5UHJlZml4OiBQb29sQm94UHJlZml4RW50cmllcyB9KQogICAgYnl0ZWMgOSAvLyAiZSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MzYtNzQyCiAgICAvLyB0aGlzLmVudHJpZXMoZW50cnlJRCkudmFsdWUgPSB7CiAgICAvLyAgIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0OiBlbnRyaWVzW2ldLmFzc2V0LAogICAgLy8gICBxdWFudGl0eTogZW50cmllc1tpXS5xdWFudGl0eSwKICAgIC8vICAgZ2F0ZUFyZ3M6IGNsb25lKGdhdGVBcmdzKSwKICAgIC8vICAgZGlzcXVhbGlmaWVkOiBmYWxzZQogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc0NQogICAgLy8gYWRkcmVzczogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NDQtNzQ3CiAgICAvLyBjb25zdCBhS2V5ID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogZW50cmllc1tpXS5hc3NldCwKICAgIC8vIH0KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzQ5CiAgICAvLyB0aGlzLmVudHJpZXNCeUFkZHJlc3MoYUtleSkudmFsdWUgPSBlbnRyeUlECiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgZXh0cmFjdCAzMiA4CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGVudHJpZXNCeUFkZHJlc3MgPSBCb3hNYXA8RW50cnlLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhFbnRyaWVzQnlBZGRyZXNzIH0pCiAgICBieXRlYyAzMCAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc0OQogICAgLy8gdGhpcy5lbnRyaWVzQnlBZGRyZXNzKGFLZXkpLnZhbHVlID0gZW50cnlJRAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBieXRlYyAyMyAvLyAidSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NTAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gdW5pcXVlcyA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBQb29sR2xvYmFsU3RhdGVLZXlVbmlxdWVzIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3NTAKICAgIC8vIGlmICghdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY3JlYXRlUG9vbEVudHJpZXNfd2hpbGVfdG9wQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHVuaXF1ZXMgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogUG9vbEdsb2JhbFN0YXRlS2V5VW5pcXVlcyB9KQogICAgYnl0ZWMgMjMgLy8gInUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzUxCiAgICAvLyB0aGlzLnVuaXF1ZXMoVHhuLnNlbmRlcikudmFsdWUgPSBlbnRyaWVzLmxlbmd0aCAgLy8gb3IgYW55IG5vbi16ZXJvIHZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY0CiAgICAvLyB1bmlxdWVzID0gQm94TWFwPEFjY291bnQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFBvb2xHbG9iYWxTdGF0ZUtleVVuaXF1ZXMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjc1MQogICAgLy8gdGhpcy51bmlxdWVzKFR4bi5zZW5kZXIpLnZhbHVlID0gZW50cmllcy5sZW5ndGggIC8vIG9yIGFueSBub24temVybyB2YWx1ZQogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIGIgY3JlYXRlUG9vbEVudHJpZXNfd2hpbGVfdG9wQDcKCmNyZWF0ZVBvb2xFbnRyaWVzX2Jvb2xfZmFsc2VAMTk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVQb29sRW50cmllc19ib29sX21lcmdlQDIwCgpjcmVhdGVQb29sRW50cmllc19lbHNlX2JvZHlAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NzEzCiAgICAvLyBvcHRlZEluID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo3MTQKICAgIC8vIGJhbGFuY2UgPSBUeG4uc2VuZGVyLmJhbGFuY2UKICAgIHR4biBTZW5kZXIKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGIgY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfaWZfZWxzZUAxNgoKY3JlYXRlUG9vbEVudHJpZXNfYWZ0ZXJfd2hpbGVAMjc6CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlUG9vbEVudHJpZXNfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmQocGF5bWVudDogdWludDY0LCByZXdhcmQ6IGJ5dGVzKSAtPiBieXRlczoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODY5CiAgICAvLyBhZGRSZXdhcmQocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCByZXdhcmQ6IEFkZFJld2FyZFBhcmFtcyk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCBFUlJfRk9SQklEREVOKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5Q3JlYXRvciB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCBFUlJfRk9SQklEREVOKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcxCiAgICAvLyBpZiAoVHhuLmFwcGxpY2F0aW9uQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5hZGRSZXdhcmQpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgdHhuYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAzMiAvLyBtZXRob2QgImFkZFJld2FyZChwYXksKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODcyCiAgICAvLyBhc3NlcnQocmV3YXJkLmFzc2V0ID09PSAwLCBFUlJfTk9UX0FMR08pCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgIQogICAgYXNzZXJ0IC8vIE11c3QgYmUgYW4gQWxnbyBhc3NldAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjYzNwogICAgLy8gdGhpcy5zdGFrZUtleS52YWx1ZS5hZGRyZXNzICE9PSBHbG9iYWwuemVyb0FkZHJlc3MgfHwgcmV3YXJkLmRpc3RyaWJ1dGlvbiAhPT0gRGlzdHJpYnV0aW9uVHlwZVBlcmNlbnRhZ2UsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gc3Rha2VLZXkgPSBHbG9iYWxTdGF0ZTxSb290S2V5Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5U3Rha2VLZXkgfSkKICAgIGJ5dGVjIDI2IC8vICJzdGFrZV9rZXkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjM3CiAgICAvLyB0aGlzLnN0YWtlS2V5LnZhbHVlLmFkZHJlc3MgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyB8fCByZXdhcmQuZGlzdHJpYnV0aW9uICE9PSBEaXN0cmlidXRpb25UeXBlUGVyY2VudGFnZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJueiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX3RydWVAOQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDggMQogICAgYnl0ZWMgOCAvLyAweDBhCiAgICAhPQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAxMAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF90cnVlQDk6CiAgICBpbnRjXzEgLy8gMQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9tZXJnZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2MzYtNjM5CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuc3Rha2VLZXkudmFsdWUuYWRkcmVzcyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzIHx8IHJld2FyZC5kaXN0cmlidXRpb24gIT09IERpc3RyaWJ1dGlvblR5cGVQZXJjZW50YWdlLAogICAgLy8gICBFUlJfU1RBS0VfS0VZX1JFUVVJUkVECiAgICAvLyApCiAgICBhc3NlcnQgLy8gU3Rha2Uga2V5IHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyBpZiAocmV3YXJkLmRpc3RyaWJ1dGlvbiA9PT0gRGlzdHJpYnV0aW9uVHlwZVNodWZmbGUpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoYnl0ZXMgMHgyOAogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIGFzc2VydChyZXdhcmQucmF0ZSA+IHJld2FyZC53aW5uZXJDb3VudCAmJiByZXdhcmQud2lubmVyQ291bnQgPD0gV2lubmVyQ291bnRDYXAsIEVSUl9SQVRFX01VU1RfQkVfR1JFQVRFUl9USEFOX1dJTk5FUl9DT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMzMgLy8gMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAxNQogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIDw9CiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX2ZhbHNlQDE1CiAgICBpbnRjXzEgLy8gMQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9tZXJnZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIGFzc2VydChyZXdhcmQucmF0ZSA+IHJld2FyZC53aW5uZXJDb3VudCAmJiByZXdhcmQud2lubmVyQ291bnQgPD0gV2lubmVyQ291bnRDYXAsIEVSUl9SQVRFX01VU1RfQkVfR1JFQVRFUl9USEFOX1dJTk5FUl9DT1VOVCkKICAgIGFzc2VydCAvLyBSYXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHdpbm5lciBjb3VudAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDcKICAgIC8vIGlmIChyZXdhcmQuZGlzdHJpYnV0aW9uID09PSBEaXN0cmlidXRpb25UeXBlRXZlbikgewogICAgZnJhbWVfZGlnIDAKICAgIGJ5dGVjIDE0IC8vIDB4MWUKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjQ4CiAgICAvLyBhc3NlcnQodGhpcy5tYXhFbnRyaWVzLnZhbHVlID09PSAwIHx8IHRoaXMubWF4RW50cmllcy52YWx1ZSA8PSByZXdhcmQucmF0ZSwgRVJSX01BWF9FTlRSSUVTX0NBTk5PVF9CRV9HUkVBVEVSX1RIQU5fUkFURSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBtYXhFbnRyaWVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9vbEdsb2JhbFN0YXRlS2V5TWF4RW50cmllcyB9KQogICAgYnl0ZWMgMTggLy8gIm1heF9lbnRyaWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjY0OAogICAgLy8gYXNzZXJ0KHRoaXMubWF4RW50cmllcy52YWx1ZSA9PT0gMCB8fCB0aGlzLm1heEVudHJpZXMudmFsdWUgPD0gcmV3YXJkLnJhdGUsIEVSUl9NQVhfRU5UUklFU19DQU5OT1RfQkVfR1JFQVRFUl9USEFOX1JBVEUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF90cnVlQDIwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gbWF4RW50cmllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleU1heEVudHJpZXMgfSkKICAgIGJ5dGVjIDE4IC8vICJtYXhfZW50cmllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo2NDgKICAgIC8vIGFzc2VydCh0aGlzLm1heEVudHJpZXMudmFsdWUgPT09IDAgfHwgdGhpcy5tYXhFbnRyaWVzLnZhbHVlIDw9IHJld2FyZC5yYXRlLCBFUlJfTUFYX0VOVFJJRVNfQ0FOTk9UX0JFX0dSRUFURVJfVEhBTl9SQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAyMQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2Jvb2xfbWVyZ2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjQ4CiAgICAvLyBhc3NlcnQodGhpcy5tYXhFbnRyaWVzLnZhbHVlID09PSAwIHx8IHRoaXMubWF4RW50cmllcy52YWx1ZSA8PSByZXdhcmQucmF0ZSwgRVJSX01BWF9FTlRSSUVTX0NBTk5PVF9CRV9HUkVBVEVSX1RIQU5fUkFURSkKICAgIGFzc2VydCAvLyBNYXggZW50cmllcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHJhdGUKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6NjUxCiAgICAvLyBhc3NlcnQocmV3YXJkLnJhdGUgPiAwLCBFUlJfUkFURV9NVVNUX0JFX0dSRUFURVJfVEhBTl9aRVJPKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDkgLy8gOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYXNzZXJ0IC8vIFJhdGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg3Ny04ODYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogewogICAgLy8gICAgICAgZ3JlYXRlclRoYW5FcTogdGhpcy5yZXdhcmRzTWJyKHJld2FyZC53aW5uZXJDb3VudCkKICAgIC8vICAgICB9CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4ODAKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODc3LTg4NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB7CiAgICAvLyAgICAgICBncmVhdGVyVGhhbkVxOiB0aGlzLnJld2FyZHNNYnIocmV3YXJkLndpbm5lckNvdW50KQogICAgLy8gICAgIH0KICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODgyCiAgICAvLyBncmVhdGVyVGhhbkVxOiB0aGlzLnJld2FyZHNNYnIocmV3YXJkLndpbm5lckNvdW50KQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzIC8vIDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjkKICAgIC8vIHJldHVybiBNaW5Qb29sUmV3YXJkc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIHdpbm5pbmdUaWNrZXRzKQogICAgaW50YyA2IC8vIDQwMAogICAgZGlnIDEKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4NzctODg2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHsKICAgIC8vICAgICAgIGdyZWF0ZXJUaGFuRXE6IHRoaXMucmV3YXJkc01icihyZXdhcmQud2lubmVyQ291bnQpCiAgICAvLyAgICAgfQogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIDw9CiAgICB1bmNvdmVyIDIKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBjb25zdCBpZCA9IHRoaXMucmV3YXJkSUQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyByZXdhcmRJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUG9vbEdsb2JhbFN0YXRlS2V5UmV3YXJkQ291bnQgfSkKICAgIGJ5dGVjIDI1IC8vICJyZXdhcmRfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBjb25zdCBpZCA9IHRoaXMucmV3YXJkSUQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLnJld2FyZElELnZhbHVlICs9IDEKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJld2FyZElEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMSwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlSZXdhcmRDb3VudCB9KQogICAgYnl0ZWMgMjUgLy8gInJld2FyZF9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMucmV3YXJkSUQudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4OTAKICAgIC8vIC4uLmNsb25lKHJld2FyZCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMTcgOAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDI1IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4OTMKICAgIC8vIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODg5LTkwNQogICAgLy8gdGhpcy5yZXdhcmRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgLi4uY2xvbmUocmV3YXJkKSwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2VyczogMCwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2U6IDAsCiAgICAvLyAgIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIC8vICAgcmFmZmxlQ3Vyc29yOiB7CiAgICAvLyAgICAgdGlja2V0OiAwLAogICAgLy8gICAgIHN0YWtlOiAwLAogICAgLy8gICAgIGRpc2J1cnNlZDogMAogICAgLy8gICB9LAogICAgLy8gICB2cmZGYWlsdXJlQ291bnQ6IDAsCiAgICAvLyAgIHBoYXNlOiBEaXNidXJzZW1lbnRQaGFzZUlkbGUsCiAgICAvLyAgIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIC8vICAgYWN0aXZlRGlzYnVyc2VtZW50SUQ6IDAsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudFJvdW5kU3RhcnQ6IDAsCiAgICAvLyAgIGxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXA6IDAKICAgIC8vIH0KICAgIHVuY292ZXIgMwogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjkwMAogICAgLy8gcGhhc2U6IERpc2J1cnNlbWVudFBoYXNlSWRsZSwKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg4OS05MDUKICAgIC8vIHRoaXMucmV3YXJkcyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIC4uLmNsb25lKHJld2FyZCksCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlcnM6IDAsCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlOiAwLAogICAgLy8gICB3aW5uaW5nVGlja2V0czogW10gYXMgdWludDY0W10sCiAgICAvLyAgIHJhZmZsZUN1cnNvcjogewogICAgLy8gICAgIHRpY2tldDogMCwKICAgIC8vICAgICBzdGFrZTogMCwKICAgIC8vICAgICBkaXNidXJzZWQ6IDAKICAgIC8vICAgfSwKICAgIC8vICAgdnJmRmFpbHVyZUNvdW50OiAwLAogICAgLy8gICBwaGFzZTogRGlzYnVyc2VtZW50UGhhc2VJZGxlLAogICAgLy8gICBkaXNidXJzZW1lbnRDdXJzb3I6IDEsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudElEOiAwLAogICAgLy8gICBhY3RpdmVEaXNidXJzZW1lbnRSb3VuZFN0YXJ0OiAwLAogICAgLy8gICBsYXN0RGlzYnVyc2VtZW50VGltZXN0YW1wOiAwCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo5MDEKICAgIC8vIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODg5LTkwNQogICAgLy8gdGhpcy5yZXdhcmRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgLi4uY2xvbmUocmV3YXJkKSwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2VyczogMCwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2U6IDAsCiAgICAvLyAgIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIC8vICAgcmFmZmxlQ3Vyc29yOiB7CiAgICAvLyAgICAgdGlja2V0OiAwLAogICAgLy8gICAgIHN0YWtlOiAwLAogICAgLy8gICAgIGRpc2J1cnNlZDogMAogICAgLy8gICB9LAogICAgLy8gICB2cmZGYWlsdXJlQ291bnQ6IDAsCiAgICAvLyAgIHBoYXNlOiBEaXNidXJzZW1lbnRQaGFzZUlkbGUsCiAgICAvLyAgIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIC8vICAgYWN0aXZlRGlzYnVyc2VtZW50SUQ6IDAsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudFJvdW5kU3RhcnQ6IDAsCiAgICAvLyAgIGxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXA6IDAKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODkzCiAgICAvLyB3aW5uaW5nVGlja2V0czogW10gYXMgdWludDY0W10sCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjg4OS05MDUKICAgIC8vIHRoaXMucmV3YXJkcyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIC4uLmNsb25lKHJld2FyZCksCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlcnM6IDAsCiAgICAvLyAgIHF1YWxpZmllZFN0YWtlOiAwLAogICAgLy8gICB3aW5uaW5nVGlja2V0czogW10gYXMgdWludDY0W10sCiAgICAvLyAgIHJhZmZsZUN1cnNvcjogewogICAgLy8gICAgIHRpY2tldDogMCwKICAgIC8vICAgICBzdGFrZTogMCwKICAgIC8vICAgICBkaXNidXJzZWQ6IDAKICAgIC8vICAgfSwKICAgIC8vICAgdnJmRmFpbHVyZUNvdW50OiAwLAogICAgLy8gICBwaGFzZTogRGlzYnVyc2VtZW50UGhhc2VJZGxlLAogICAgLy8gICBkaXNidXJzZW1lbnRDdXJzb3I6IDEsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudElEOiAwLAogICAgLy8gICBhY3RpdmVEaXNidXJzZW1lbnRSb3VuZFN0YXJ0OiAwLAogICAgLy8gICBsYXN0RGlzYnVyc2VtZW50VGltZXN0YW1wOiAwCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo4ODkKICAgIC8vIHRoaXMucmV3YXJkcyhpZCkudmFsdWUgPSB7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyByZXdhcmRzID0gQm94TWFwPHVpbnQ2NCwgUmV3YXJkPih7IGtleVByZWZpeDogUG9vbEJveFByZWZpeFJld2FyZHMgfSkKICAgIGJ5dGVjIDIxIC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6ODg5LTkwNQogICAgLy8gdGhpcy5yZXdhcmRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgLi4uY2xvbmUocmV3YXJkKSwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2VyczogMCwKICAgIC8vICAgcXVhbGlmaWVkU3Rha2U6IDAsCiAgICAvLyAgIHdpbm5pbmdUaWNrZXRzOiBbXSBhcyB1aW50NjRbXSwKICAgIC8vICAgcmFmZmxlQ3Vyc29yOiB7CiAgICAvLyAgICAgdGlja2V0OiAwLAogICAgLy8gICAgIHN0YWtlOiAwLAogICAgLy8gICAgIGRpc2J1cnNlZDogMAogICAgLy8gICB9LAogICAgLy8gICB2cmZGYWlsdXJlQ291bnQ6IDAsCiAgICAvLyAgIHBoYXNlOiBEaXNidXJzZW1lbnRQaGFzZUlkbGUsCiAgICAvLyAgIGRpc2J1cnNlbWVudEN1cnNvcjogMSwKICAgIC8vICAgYWN0aXZlRGlzYnVyc2VtZW50SUQ6IDAsCiAgICAvLyAgIGFjdGl2ZURpc2J1cnNlbWVudFJvdW5kU3RhcnQ6IDAsCiAgICAvLyAgIGxhc3REaXNidXJzZW1lbnRUaW1lc3RhbXA6IDAKICAgIC8vIH0KICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX2ZhbHNlQDIxOgogICAgaW50Y18wIC8vIDAKICAgIGIgc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9tZXJnZUAyMgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5hZGRSZXdhcmRfYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2Jvb2xfbWVyZ2VAMTYKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkUmV3YXJkX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFJld2FyZF9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGUocmV3YXJkSUQ6IHVpbnQ2NCkgLT4gdm9pZDoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTk3CiAgICAvLyByYWZmbGUocmV3YXJkSUQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjk5OAogICAgLy8gYXNzZXJ0KHRoaXMucmV3YXJkcyhyZXdhcmRJRCkuZXhpc3RzLCAncmV3YXJkIGRvZXMgbm90IGV4aXN0JykKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gcmV3YXJkcyA9IEJveE1hcDx1aW50NjQsIFJld2FyZD4oeyBrZXlQcmVmaXg6IFBvb2xCb3hQcmVmaXhSZXdhcmRzIH0pCiAgICBieXRlYyAyMSAvLyAiciIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OTk4CiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRzKHJld2FyZElEKS5leGlzdHMsICdyZXdhcmQgZG9lcyBub3QgZXhpc3QnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gcmV3YXJkIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAwNQogICAgLy8gfSA9IGNsb25lKHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUpCiAgICBkdXAKICAgIHB1c2hpbnQgOTEgLy8gOTEKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA4MyAvLyA4MwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgcHVzaGludCA0MSAvLyA0MQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBjb3ZlciA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAwNwogICAgLy8gYXNzZXJ0KHBoYXNlID09PSBEaXNidXJzZW1lbnRQaGFzZUFsbG9jYXRpb24sIEVSUl9JTlZBTElEX0RJU0JVUlNFTUVOVF9QSEFTRSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTMgLy8gMHgxNAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRpc2J1cnNlbWVudCBwaGFzZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMDgKICAgIC8vIGFzc2VydCh3aW5uaW5nVGlja2V0cy5sZW5ndGggPT09IDAsIEVSUl9XSU5OSU5HX1RJQ0tFVFNfQUxSRUFEWV9FWElTVCkKICAgIHVuY292ZXIgMgogICAgcHVzaGludHMgMTI0IDIgLy8gMTI0LCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFdpbm5pbmcgdGlja2V0cyBhbHJlYWR5IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxMAogICAgLy8gY29uc3Qgcm91bmRUb1VzZTogdWludDY0ID0gYWN0aXZlRGlzYnVyc2VtZW50Um91bmRTdGFydCArIDEgKyAoNCAqIHZyZkZhaWx1cmVDb3VudCkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBwdXNoaW50IDQgLy8gNAogICAgdW5jb3ZlciAyCiAgICAqCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxMi0xMDE1CiAgICAvLyBjb25zdCBzZWVkID0gYWJpQ2FsbDx0eXBlb2YgUmFuZG9tbmVzc0JlYWNvbi5wcm90b3R5cGUuZ2V0Pih7CiAgICAvLyAgIGFwcElkOiBnZXRPdGhlckFwcExpc3QoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkKS52cmZCZWFjb24sCiAgICAvLyAgIGFyZ3M6IFtyb3VuZFRvVXNlLCB0aGlzLnNhbHQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDEzCiAgICAvLyBhcHBJZDogZ2V0T3RoZXJBcHBMaXN0KEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCkudnJmQmVhY29uLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5CiAgICAvLyBjb25zdCBbb3RoZXJBcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzT3RoZXJBcHBMaXN0KSkKICAgIGJ5dGVjIDMzIC8vICJvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxMwogICAgLy8gYXBwSWQ6IGdldE90aGVyQXBwTGlzdChHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQpLnZyZkJlYWNvbiwKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMTQKICAgIC8vIGFyZ3M6IFtyb3VuZFRvVXNlLCB0aGlzLnNhbHQudmFsdWVdLAogICAgc3dhcAogICAgaXRvYgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIHNhbHQgPSBHbG9iYWxTdGF0ZTxieXRlczwzMj4+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTYWx0IH0pCiAgICBieXRlYyAzNCAvLyAic2FsdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDE0CiAgICAvLyBhcmdzOiBbcm91bmRUb1VzZSwgdGhpcy5zYWx0LnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMTItMTAxNQogICAgLy8gY29uc3Qgc2VlZCA9IGFiaUNhbGw8dHlwZW9mIFJhbmRvbW5lc3NCZWFjb24ucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZ2V0T3RoZXJBcHBMaXN0KEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCkudnJmQmVhY29uLAogICAgLy8gICBhcmdzOiBbcm91bmRUb1VzZSwgdGhpcy5zYWx0LnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgNiAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDE3CiAgICAvLyBpZiAoc2VlZC5sZW5ndGggPT09IDApIHsKICAgIGxlbgogICAgZHVwCiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxOAogICAgLy8gdGhpcy5yZXdhcmRzKHJld2FyZElEKS52YWx1ZS52cmZGYWlsdXJlQ291bnQgKz0gMQogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIHB1c2hpbnQgODMgLy8gODMKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgODMgLy8gODMKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAxOQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDIzCiAgICAvLyBjb25zdCBybmdTdGF0ZSA9IHBjZzY0SW5pdChzZWVkLnNsaWNlKDAsIDE2KSkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMTUKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCAxNiAvLyAxNgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIDE0CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjE2CiAgICAvLyBhc3NlcnQoc2VlZC5sZW5ndGggPT09IDE2KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MTkKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgMCksIHBjZ0ZpcnN0SW5jcmVtZW50KSwKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjkyCiAgICAvLyBjb25zdCBzdGF0ZSA9IF9fcGNnMzJTdGVwKDAsIGluY3IpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MTkKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgMCksIHBjZ0ZpcnN0SW5jcmVtZW50KSwKICAgIGludGMgNyAvLyAxNDQyNjk1MDQwODg4OTYzNDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICBhZGR3CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6OTMKICAgIC8vIGNvbnN0IFssIGFkZExvd10gPSBvcC5hZGR3KHN0YXRlLCBpbml0aWFsU3RhdGUpCiAgICB1bmNvdmVyIDIKICAgIGFkZHcKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjE5CiAgICAvLyBfX3BjZzMySW5pdChvcC5leHRyYWN0VWludDY0KHNlZWQsIDApLCBwY2dGaXJzdEluY3JlbWVudCksCiAgICBpbnRjIDcgLy8gMTQ0MjY5NTA0MDg4ODk2MzQwNwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxOAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcobXVsTG93LCBpbmNyKQogICAgYWRkdwogICAgY292ZXIgMgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjIwCiAgICAvLyBfX3BjZzMySW5pdChvcC5leHRyYWN0VWludDY0KHNlZWQsIDgpLCBwY2dTZWNvbmRJbmNyZW1lbnQpLAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6MTgKICAgIC8vIGNvbnN0IFssIGFkZExvd10gPSBvcC5hZGR3KG11bExvdywgaW5jcikKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MjAKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgOCksIHBjZ1NlY29uZEluY3JlbWVudCksCiAgICBpbnRjIDggLy8gMTQ0MjY5NTA0MDg4ODk2MzQwOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxOAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcobXVsTG93LCBpbmNyKQogICAgYWRkdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjkzCiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhzdGF0ZSwgaW5pdGlhbFN0YXRlKQogICAgYWRkdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE3CiAgICAvLyBjb25zdCBbLCBtdWxMb3ddID0gb3AubXVsdyhzdGF0ZSwgcGNnTXVsdGlwbGllcikKICAgIGludGMgNSAvLyA2MzY0MTM2MjIzODQ2NzkzMDA1CiAgICBtdWx3CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MjAKICAgIC8vIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgOCksIHBjZ1NlY29uZEluY3JlbWVudCksCiAgICBpbnRjIDggLy8gMTQ0MjY5NTA0MDg4ODk2MzQwOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxOAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcobXVsTG93LCBpbmNyKQogICAgYWRkdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjE4LTIxCiAgICAvLyByZXR1cm4gWwogICAgLy8gICAgIF9fcGNnMzJJbml0KG9wLmV4dHJhY3RVaW50NjQoc2VlZCwgMCksIHBjZ0ZpcnN0SW5jcmVtZW50KSwKICAgIC8vICAgICBfX3BjZzMySW5pdChvcC5leHRyYWN0VWludDY0KHNlZWQsIDgpLCBwY2dTZWNvbmRJbmNyZW1lbnQpLAogICAgLy8gXQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDI3CiAgICAvLyBpZiAodXBwZXJCb3VuZCA8IE1BWF9VSU5UNjQpIHsKICAgIGZyYW1lX2RpZyAxMwogICAgaW50YyAxMiAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgPAogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2lmX2JvZHlANAogICAgZnJhbWVfZGlnIDEzCiAgICBmcmFtZV9idXJ5IDExCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjMwCiAgICAvLyBjb25zdCByZXN1bHQgPSBuZXcgRHluYW1pY0FycmF5PGFyYzQuVWludDY0PigpCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjQyCiAgICAvLyBpZiAodXBwZXJCb3VuZCAhPT0gMCkgewogICAgZnJhbWVfZGlnIDExCiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NDMKICAgIC8vIGFzc2VydCh1cHBlckJvdW5kID4gMSkKICAgIGZyYW1lX2RpZyAxMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjQ0CiAgICAvLyBhc3NlcnQobG93ZXJCb3VuZCA8IHVwcGVyQm91bmQgLSAxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAzMQogICAgLy8gY29uc3Qgcm5nUmVzdWx0ID0gcGNnNjRSYW5kb20ocm5nU3RhdGUsIDEsIHVwcGVyQm91bmQsIE1heEdsb2JhbFN0YXRlVWludDY0QXJyYXkpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo0NAogICAgLy8gYXNzZXJ0KGxvd2VyQm91bmQgPCB1cHBlckJvdW5kIC0gMSkKICAgID4KICAgIGFzc2VydAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzMyLmFsZ28udHM6OAogICAgLy8gY29uc3QgWywgYWRkTG93XSA9IG9wLmFkZHcofnZhbHVlLCAxKQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgfgogICAgaW50Y18xIC8vIDEKICAgIGFkZHcKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo1MwogICAgLy8gY29uc3QgdGhyZXNob2xkOiB1aW50NjQgPSBfX3VpbnQ2NFR3b3MoYWJzb2x1dGVCb3VuZCkgJSBhYnNvbHV0ZUJvdW5kCiAgICBzd2FwCiAgICAlCiAgICBmcmFtZV9idXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjU1CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbGVuZ3RoOyBpID0gaSArIDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3doaWxlX3RvcEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NTUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBsZW5ndGg7IGkgPSBpICsgMSkgewogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMDMxCiAgICAvLyBjb25zdCBybmdSZXN1bHQgPSBwY2c2NFJhbmRvbShybmdTdGF0ZSwgMSwgdXBwZXJCb3VuZCwgTWF4R2xvYmFsU3RhdGVVaW50NjRBcnJheSkKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NTUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBsZW5ndGg7IGkgPSBpICsgMSkgewogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfYWZ0ZXJfd2hpbGVAMjIKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3doaWxlX3RvcEAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6OQogICAgLy8gY29uc3QgbmV3U3RhdGUxID0gX19wY2czMlN0ZXAoc3RhdGVbMF0sIHBjZ0ZpcnN0SW5jcmVtZW50KQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjkKICAgIC8vIGNvbnN0IG5ld1N0YXRlMSA9IF9fcGNnMzJTdGVwKHN0YXRlWzBdLCBwY2dGaXJzdEluY3JlbWVudCkKICAgIGludGMgNyAvLyAxNDQyNjk1MDQwODg4OTYzNDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICBhZGR3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgNQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjEwCiAgICAvLyBjb25zdCBuZXdTdGF0ZTIgPSBfX3BjZzMyU3RlcChzdGF0ZVsxXSwgbmV3U3RhdGUxID09PSAwID8gb3Auc2hsKHBjZ1NlY29uZEluY3JlbWVudCwgMSkgOiBwY2dTZWNvbmRJbmNyZW1lbnQpCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgOAogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3Rlcm5hcnlfZmFsc2VAMjYKICAgIHB1c2hpbnQgMjg4NTM5MDA4MTc3NzkyNjgxOCAvLyAyODg1MzkwMDgxNzc3OTI2ODE4CgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV90ZXJuYXJ5X21lcmdlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnMzIuYWxnby50czoxNwogICAgLy8gY29uc3QgWywgbXVsTG93XSA9IG9wLm11bHcoc3RhdGUsIHBjZ011bHRpcGxpZXIpCiAgICBmcmFtZV9kaWcgOAogICAgZHVwCiAgICBpbnRjIDUgLy8gNjM2NDEzNjIyMzg0Njc5MzAwNQogICAgbXVsdwogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2czMi5hbGdvLnRzOjE4CiAgICAvLyBjb25zdCBbLCBhZGRMb3ddID0gb3AuYWRkdyhtdWxMb3csIGluY3IpCiAgICB1bmNvdmVyIDIKICAgIGFkZHcKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czoxMgogICAgLy8gcmV0dXJuIFtbbmV3U3RhdGUxLCBuZXdTdGF0ZTJdLCBvcC5zaGwoX19wY2czMk91dHB1dChzdGF0ZVswXSksIDMyKSB8IF9fcGNnMzJPdXRwdXQoc3RhdGVbMV0pXQogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDkKICAgIGNhbGxzdWIgX19wY2czMk91dHB1dAogICAgcHVzaGludCAzMiAvLyAzMgogICAgc2hsCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX19wY2czMk91dHB1dAogICAgfAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCBbbmV3U3RhdGUsIGNhbmRpZGF0ZV0gPSBfX3BjZzY0VW5ib3VuZGVkUmFuZG9tKHN0YXRlKQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo1OQogICAgLy8gaWYgKGNhbmRpZGF0ZSA+PSB0aHJlc2hvbGQpIHsKICAgIGZyYW1lX2RpZyAxMAogICAgPj0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NjAKICAgIC8vIHJlc3VsdC5wdXNoKG5ldyBhcmM0LlVpbnQ2NCgoY2FuZGlkYXRlICUgYWJzb2x1dGVCb3VuZCkgKyBsb3dlckJvdW5kKSkKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzEKICAgIC8vIGNvbnN0IHJuZ1Jlc3VsdCA9IHBjZzY0UmFuZG9tKHJuZ1N0YXRlLCAxLCB1cHBlckJvdW5kLCBNYXhHbG9iYWxTdGF0ZVVpbnQ2NEFycmF5KQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NjAKICAgIC8vIHJlc3VsdC5wdXNoKG5ldyBhcmM0LlVpbnQ2NCgoY2FuZGlkYXRlICUgYWJzb2x1dGVCb3VuZCkgKyBsb3dlckJvdW5kKSkKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbGliX3BjZy9wY2c2NC5hbGdvLnRzOjU1CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbGVuZ3RoOyBpID0gaSArIDEpIHsKICAgIGZyYW1lX2RpZyA3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDMKICAgIGIgc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfd2hpbGVfdG9wQDE2CgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfYnVyeSAzCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3doaWxlX3RvcEAxOAoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yYWZmbGVfdGVybmFyeV9mYWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6MTAKICAgIC8vIGNvbnN0IG5ld1N0YXRlMiA9IF9fcGNnMzJTdGVwKHN0YXRlWzFdLCBuZXdTdGF0ZTEgPT09IDAgPyBvcC5zaGwocGNnU2Vjb25kSW5jcmVtZW50LCAxKSA6IHBjZ1NlY29uZEluY3JlbWVudCkKICAgIGludGMgOCAvLyAxNDQyNjk1MDQwODg4OTYzNDA5CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX3Rlcm5hcnlfbWVyZ2VAMjcKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX3doaWxlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2xpYl9wY2cvcGNnNjQuYWxnby50czo2NwogICAgLy8gcmV0dXJuIFtzdGF0ZSwgcmVzdWx0XQogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzMKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUud2lubmluZ1RpY2tldHMgPSBkZWNvZGVBcmM0PHVpbnQ2NFtdPihybmdSZXN1bHRbMV0uYnl0ZXMpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgMTIKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgcHVzaGludCA1NyAvLyA1NwogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEwMzQKICAgIC8vIHRoaXMucmV3YXJkcyhyZXdhcmRJRCkudmFsdWUudnJmRmFpbHVyZUNvdW50ID0gMAogICAgcHVzaGludCA4MyAvLyA4MwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2Vsc2VfYm9keUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9saWJfcGNnL3BjZzY0LmFsZ28udHM6NTAKICAgIC8vIGFic29sdXRlQm91bmQgPSBvcC5idG9pKEJ5dGVzKEJpZ1VpbnQoMiAqKiA2NCkgLSBCaWdVaW50KGxvd2VyQm91bmQpKSkKICAgIGludGMgMTIgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIGZyYW1lX2J1cnkgNAogICAgYiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9hZnRlcl9pZl9lbHNlQDE1CgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLnJhZmZsZV9pZl9ib2R5QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTAyOAogICAgLy8gdXBwZXJCb3VuZCArPSAxCiAgICBmcmFtZV9kaWcgMTMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDExCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wucmFmZmxlX2FmdGVyX2lmX2Vsc2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlKCkgLT4gdWludDY0OgpzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzTGl2ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU3CiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gUG9vbFN0YXR1c0RyYWZ0ICYmCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8U3Rha2luZ1Bvb2xTdGF0dXM+KHsga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGF0dXMgfSkKICAgIGJ5dGVjIDEwIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1NwogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU3LTExNTgKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBQb29sU3RhdHVzRHJhZnQgJiYKICAgIC8vIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wID49IHRoaXMuc3RhcnRUaW1lc3RhbXAudmFsdWUpICYmCiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmdQb29sLmlzTGl2ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU4CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHN0YXJ0VGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlTdGFydFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTYgLy8gInN0YXJ0X3RpbWVzdGFtcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU4CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1Ny0xMTU4CiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gUG9vbFN0YXR1c0RyYWZ0ICYmCiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1OQogICAgLy8gKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPD0gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPT09IDApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gZW5kVGltZXN0YW1wID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb29sR2xvYmFsU3RhdGVLZXlFbmRUaW1lc3RhbXAgfSkKICAgIGJ5dGVjIDE3IC8vICJlbmRfdGltZXN0YW1wIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNTkKICAgIC8vIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDw9IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlIHx8IHRoaXMuZW5kVGltZXN0YW1wLnZhbHVlID09PSAwKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF90cnVlQDQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBlbmRUaW1lc3RhbXAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvb2xHbG9iYWxTdGF0ZUtleUVuZFRpbWVzdGFtcCB9KQogICAgYnl0ZWMgMTcgLy8gImVuZF90aW1lc3RhbXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2NvbnRyYWN0LmFsZ28udHM6MTE1OQogICAgLy8gKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPD0gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPT09IDApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNMaXZlX2Jvb2xfZmFsc2VANQoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjExNTYtMTE2MAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgdGhpcy5zdGF0dXMudmFsdWUgIT09IFBvb2xTdGF0dXNEcmFmdCAmJgogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnN0YXJ0VGltZXN0YW1wLnZhbHVlKSAmJgogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSB8fCB0aGlzLmVuZFRpbWVzdGFtcC52YWx1ZSA9PT0gMCkKICAgIC8vICkKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pc0xpdmVfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvY29udHJhY3QuYWxnby50czoxMTU2LTExNjAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBQb29sU3RhdHVzRHJhZnQgJiYKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPj0gdGhpcy5zdGFydFRpbWVzdGFtcC52YWx1ZSkgJiYKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPD0gdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgfHwgdGhpcy5lbmRUaW1lc3RhbXAudmFsdWUgPT09IDApCiAgICAvLyApCiAgICByZXRzdWIK\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type ObjectC3416591 = {\n valid: boolean,\n balance: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a ObjectC3416591 to the struct representation\n */\nexport function ObjectC3416591FromTuple(abiTuple: [boolean, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.ObjectC3416591, APP_SPEC.structs) as ObjectC3416591\n}\n\nexport type RootKey = {\n address: string,\n name: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RootKey to the struct representation\n */\nexport function RootKeyFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RootKey, APP_SPEC.structs) as RootKey\n}\n\nexport type AddRewardParams = {\n asset: bigint,\n distribution: number,\n rate: bigint,\n expiration: bigint,\n interval: bigint,\n winnerCount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a AddRewardParams to the struct representation\n */\nexport function AddRewardParamsFromTuple(abiTuple: [bigint, number, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AddRewardParams, APP_SPEC.structs) as AddRewardParams\n}\n\nexport type EntryData = {\n address: string,\n asset: bigint,\n quantity: bigint,\n gateArgs: Uint8Array[],\n disqualified: boolean\n}\n\n\n/**\n * Converts the ABI tuple representation of a EntryData to the struct representation\n */\nexport function EntryDataFromTuple(abiTuple: [string, bigint, bigint, Uint8Array[], boolean]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.EntryData, APP_SPEC.structs) as EntryData\n}\n\nexport type EntryKey = {\n address: string,\n asset: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a EntryKey to the struct representation\n */\nexport function EntryKeyFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.EntryKey, APP_SPEC.structs) as EntryKey\n}\n\nexport type RaffleCursor = {\n ticket: bigint,\n stake: bigint,\n disbursed: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a RaffleCursor to the struct representation\n */\nexport function RaffleCursorFromTuple(abiTuple: [bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RaffleCursor, APP_SPEC.structs) as RaffleCursor\n}\n\nexport type Reward = {\n asset: bigint,\n distribution: number,\n rate: bigint,\n expiration: bigint,\n interval: bigint,\n qualifiedStakers: bigint,\n qualifiedStake: bigint,\n winnerCount: bigint,\n winningTickets: bigint[],\n raffleCursor: RaffleCursor,\n vrfFailureCount: bigint,\n phase: number,\n disbursementCursor: bigint,\n activeDisbursementId: bigint,\n activeDisbursementRoundStart: bigint,\n lastDisbursementTimestamp: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Reward to the struct representation\n */\nexport function RewardFromTuple(abiTuple: [bigint, number, bigint, bigint, bigint, bigint, bigint, bigint, bigint[], [bigint, bigint, bigint], bigint, number, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Reward, APP_SPEC.structs) as Reward\n}\n\nexport type StakingPoolMbrData = {\n entries: bigint,\n uniques: bigint,\n entriesByAddress: bigint,\n rewards: bigint,\n disbursements: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakingPoolMBRData to the struct representation\n */\nexport function StakingPoolMbrDataFromTuple(abiTuple: [bigint, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakingPoolMBRData, APP_SPEC.structs) as StakingPoolMbrData\n}\n\nexport type StakingPoolState = {\n status: number,\n title: string,\n type: number,\n signupTimestamp: bigint,\n startTimestamp: bigint,\n allowLateSignups: boolean,\n endTimestamp: bigint,\n maxEntries: bigint,\n entryCount: bigint,\n rewardCount: bigint,\n totalStaked: bigint,\n stakeKey: RootKey,\n minimumStakeAmount: bigint,\n gateId: bigint,\n creator: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakingPoolState to the struct representation\n */\nexport function StakingPoolStateFromTuple(abiTuple: [number, string, number, bigint, bigint, boolean, bigint, bigint, bigint, bigint, bigint, [string, string], bigint, bigint, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakingPoolState, APP_SPEC.structs) as StakingPoolState\n}\n\nexport type FunderInfo = {\n account: string,\n amount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a FunderInfo to the struct representation\n */\nexport function FunderInfoFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.FunderInfo, APP_SPEC.structs) as FunderInfo\n}\n\n/**\n * The argument types for the StakingPool contract\n */\nexport type StakingPoolArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void': {\n title: string\n type: bigint | number\n creator: string\n funder: FunderInfo\n marketplace: string\n stakeKey: RootKey\n minimumStakeAmount: bigint | number\n allowLateSignups: boolean\n gateId: bigint | number\n maxEntries: bigint | number\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'init()void': Record<string, never>\n 'delete(address)void': {\n caller: string\n }\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void': {\n payment: AppMethodCallTransactionArgument\n reward: AddRewardParams\n }\n 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n reward: AddRewardParams\n }\n 'finalize(uint64,uint64,uint64)void': {\n signupTimestamp: bigint | number\n startTimestamp: bigint | number\n endTimestamp: bigint | number\n }\n 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void': {\n payment?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n entries: [bigint | number, bigint | number, Uint8Array[]][]\n }\n 'enter(pay,(uint64,uint64,byte[32][])[])void': {\n payment: AppMethodCallTransactionArgument\n entries: [bigint | number, bigint | number, Uint8Array[]][]\n }\n 'startDisbursement(uint64)void': {\n rewardId: bigint | number\n }\n 'raffle(uint64)void': {\n rewardId: bigint | number\n }\n 'disburseRewards(uint64,uint64)void': {\n rewardId: bigint | number\n iterationAmount: bigint | number\n }\n 'finalizeDistribution(uint64)void': {\n rewardId: bigint | number\n }\n 'check(address,uint64)(bool,uint64)': {\n address: string\n asset: bigint | number\n }\n 'gateCheck(appl,address,uint64)void': {\n gateTxn: AppMethodCallTransactionArgument\n address: string\n asset: bigint | number\n }\n 'enterCost(address,uint64)uint64': {\n /**\n * The address that will be entering\n */\n address: string\n /**\n * The number of entries being added\n */\n entryCount: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'signUpsOpen()bool': Record<string, never>\n 'isLive()bool': Record<string, never>\n 'isEntered(address)bool': {\n address: string\n }\n 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)': Record<string, never>\n 'updateAkitaDAOEscrow(uint64)void': {\n app: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': {\n winningTickets: bigint | number\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void': [title: string, type: bigint | number, creator: string, funder: FunderInfo, marketplace: string, stakeKey: RootKey, minimumStakeAmount: bigint | number, allowLateSignups: boolean, gateId: bigint | number, maxEntries: bigint | number, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'init()void': []\n 'delete(address)void': [caller: string]\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void': [payment: AppMethodCallTransactionArgument, reward: AddRewardParams]\n 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, reward: AddRewardParams]\n 'finalize(uint64,uint64,uint64)void': [signupTimestamp: bigint | number, startTimestamp: bigint | number, endTimestamp: bigint | number]\n 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void': [payment: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, entries: [bigint | number, bigint | number, Uint8Array[]][]]\n 'enter(pay,(uint64,uint64,byte[32][])[])void': [payment: AppMethodCallTransactionArgument, entries: [bigint | number, bigint | number, Uint8Array[]][]]\n 'startDisbursement(uint64)void': [rewardId: bigint | number]\n 'raffle(uint64)void': [rewardId: bigint | number]\n 'disburseRewards(uint64,uint64)void': [rewardId: bigint | number, iterationAmount: bigint | number]\n 'finalizeDistribution(uint64)void': [rewardId: bigint | number]\n 'check(address,uint64)(bool,uint64)': [address: string, asset: bigint | number]\n 'gateCheck(appl,address,uint64)void': [gateTxn: AppMethodCallTransactionArgument, address: string, asset: bigint | number]\n 'enterCost(address,uint64)uint64': [address: string, entryCount: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'signUpsOpen()bool': []\n 'isLive()bool': []\n 'isEntered(address)bool': [address: string]\n 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)': []\n 'updateAkitaDAOEscrow(uint64)void': [app: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': [winningTickets: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type StakingPoolReturns = {\n 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void': void\n 'init()void': void\n 'delete(address)void': void\n 'optIn(pay,uint64)void': void\n 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void': void\n 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void': void\n 'finalize(uint64,uint64,uint64)void': void\n 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void': void\n 'enter(pay,(uint64,uint64,byte[32][])[])void': void\n 'startDisbursement(uint64)void': void\n 'raffle(uint64)void': void\n 'disburseRewards(uint64,uint64)void': void\n 'finalizeDistribution(uint64)void': void\n 'check(address,uint64)(bool,uint64)': ObjectC3416591\n 'gateCheck(appl,address,uint64)void': void\n 'enterCost(address,uint64)uint64': bigint\n 'optInCost(uint64)uint64': bigint\n 'signUpsOpen()bool': boolean\n 'isLive()bool': boolean\n 'isEntered(address)bool': boolean\n 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)': StakingPoolState\n 'updateAkitaDAOEscrow(uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': StakingPoolMbrData\n}\n\n/**\n * Defines the types of available calls and state of the StakingPool smart contract.\n */\nexport type StakingPoolTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void' | 'create', {\n argsObj: StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']\n returns: StakingPoolReturns['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']\n }>\n & Record<'init()void' | 'init', {\n argsObj: StakingPoolArgs['obj']['init()void']\n argsTuple: StakingPoolArgs['tuple']['init()void']\n returns: StakingPoolReturns['init()void']\n }>\n & Record<'delete(address)void' | 'delete', {\n argsObj: StakingPoolArgs['obj']['delete(address)void']\n argsTuple: StakingPoolArgs['tuple']['delete(address)void']\n returns: StakingPoolReturns['delete(address)void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: StakingPoolArgs['obj']['optIn(pay,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['optIn(pay,uint64)void']\n returns: StakingPoolReturns['optIn(pay,uint64)void']\n }>\n & Record<'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void' | 'addReward', {\n argsObj: StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n argsTuple: StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n returns: StakingPoolReturns['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n }>\n & Record<'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void' | 'addRewardAsa', {\n argsObj: StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n argsTuple: StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n returns: StakingPoolReturns['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']\n }>\n & Record<'finalize(uint64,uint64,uint64)void' | 'finalize', {\n argsObj: StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']\n returns: StakingPoolReturns['finalize(uint64,uint64,uint64)void']\n }>\n & Record<'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void' | 'gatedEnter', {\n argsObj: StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']\n argsTuple: StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']\n returns: StakingPoolReturns['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']\n }>\n & Record<'enter(pay,(uint64,uint64,byte[32][])[])void' | 'enter', {\n argsObj: StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void']\n argsTuple: StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']\n returns: StakingPoolReturns['enter(pay,(uint64,uint64,byte[32][])[])void']\n }>\n & Record<'startDisbursement(uint64)void' | 'startDisbursement', {\n argsObj: StakingPoolArgs['obj']['startDisbursement(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['startDisbursement(uint64)void']\n returns: StakingPoolReturns['startDisbursement(uint64)void']\n }>\n & Record<'raffle(uint64)void' | 'raffle', {\n argsObj: StakingPoolArgs['obj']['raffle(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['raffle(uint64)void']\n returns: StakingPoolReturns['raffle(uint64)void']\n }>\n & Record<'disburseRewards(uint64,uint64)void' | 'disburseRewards', {\n argsObj: StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']\n returns: StakingPoolReturns['disburseRewards(uint64,uint64)void']\n }>\n & Record<'finalizeDistribution(uint64)void' | 'finalizeDistribution', {\n argsObj: StakingPoolArgs['obj']['finalizeDistribution(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']\n returns: StakingPoolReturns['finalizeDistribution(uint64)void']\n }>\n & Record<'check(address,uint64)(bool,uint64)' | 'check', {\n argsObj: StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)']\n argsTuple: StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']\n returns: StakingPoolReturns['check(address,uint64)(bool,uint64)']\n }>\n & Record<'gateCheck(appl,address,uint64)void' | 'gateCheck', {\n argsObj: StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void']\n argsTuple: StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']\n returns: StakingPoolReturns['gateCheck(appl,address,uint64)void']\n }>\n & Record<'enterCost(address,uint64)uint64' | 'enterCost', {\n argsObj: StakingPoolArgs['obj']['enterCost(address,uint64)uint64']\n argsTuple: StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']\n /**\n * The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n returns: StakingPoolReturns['enterCost(address,uint64)uint64']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: StakingPoolArgs['obj']['optInCost(uint64)uint64']\n argsTuple: StakingPoolArgs['tuple']['optInCost(uint64)uint64']\n returns: StakingPoolReturns['optInCost(uint64)uint64']\n }>\n & Record<'signUpsOpen()bool' | 'signUpsOpen', {\n argsObj: StakingPoolArgs['obj']['signUpsOpen()bool']\n argsTuple: StakingPoolArgs['tuple']['signUpsOpen()bool']\n /**\n * a boolean of whether sign ups are open\n */\n returns: StakingPoolReturns['signUpsOpen()bool']\n }>\n & Record<'isLive()bool' | 'isLive', {\n argsObj: StakingPoolArgs['obj']['isLive()bool']\n argsTuple: StakingPoolArgs['tuple']['isLive()bool']\n /**\n * a boolean of whether the pool is live\n */\n returns: StakingPoolReturns['isLive()bool']\n }>\n & Record<'isEntered(address)bool' | 'isEntered', {\n argsObj: StakingPoolArgs['obj']['isEntered(address)bool']\n argsTuple: StakingPoolArgs['tuple']['isEntered(address)bool']\n /**\n * a boolean indicating if the address has entered the staking pool\n */\n returns: StakingPoolReturns['isEntered(address)bool']\n }>\n & Record<'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)' | 'getState', {\n argsObj: StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n argsTuple: StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n returns: StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n }>\n & Record<'updateAkitaDAOEscrow(uint64)void' | 'updateAkitaDAOEscrow', {\n argsObj: StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']\n returns: StakingPoolReturns['updateAkitaDAOEscrow(uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: StakingPoolArgs['obj']['update(string)void']\n argsTuple: StakingPoolArgs['tuple']['update(string)void']\n returns: StakingPoolReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: StakingPoolArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: StakingPoolReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: StakingPoolArgs['obj']['opUp()void']\n argsTuple: StakingPoolArgs['tuple']['opUp()void']\n returns: StakingPoolReturns['opUp()void']\n }>\n & Record<'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' | 'mbr', {\n argsObj: StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n argsTuple: StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n /**\n * the mbr created for each boxmap entry\n */\n returns: StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the status the pool is in\n */\n status: number\n /**\n * title of the staking pool\n */\n title: string\n /**\n * the method of staking to be used for the pool\n */\n type: number\n /**\n * the timestamp when sign ups for the pool are allowed\n */\n signupTimestamp: bigint\n /**\n * whether signups are allowed after the staking pool begins\n */\n allowLateSignups: bigint\n /**\n * the timestamp when the pool starts\n */\n startTimestamp: bigint\n /**\n * the timestamp when the pool ends\n */\n endTimestamp: bigint\n /**\n * the maximum entries allowed for the pool\n */\n maxEntries: bigint\n /**\n * the number of entries in a pool\n */\n entryId: bigint\n /**\n * the number of rewards for the pool\n */\n rewardId: bigint\n /**\n * the total amount staked in the pool\n */\n totalStaked: bigint\n /**\n * the name for the meta merkle asset group to validate staking\n stake key can be empty if distribution !== DistributionTypePercentage\n\n */\n stakeKey: RootKey\n /**\n * minimum stake amount\n */\n minimumStakeAmount: bigint\n /**\n * the gate id of the pool\n */\n gateId: bigint\n /**\n * the size of the gate were using\n */\n gateSize: bigint\n /**\n * the address of the creator of the staking pool\n */\n creator: string\n /**\n * marketplace is pool creation side marketplace\n */\n marketplace: string\n /**\n * the amount the marketplaces will get for the sale\n */\n marketplaceRoyalties: bigint\n /**\n * the akita royalty for the pool\n */\n akitaRoyalty: bigint\n /**\n * the amount of royalties that were paid in a disbursement\n */\n akitaRoyaltyAmount: bigint\n /**\n * salt for randomness\n */\n salt: BinaryState\n /**\n * the app ID for the akita DAO escrow to use\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n funder: FunderInfo\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * indexed entries for efficient iteration\n */\n entries: Map<bigint | number, EntryData>\n /**\n * the number of unique asset entries by address\n */\n uniques: Map<string, bigint>\n /**\n * the entries in the pool\n */\n entriesByAddress: Map<EntryKey, bigint>\n /**\n * the rewards for this staking pool\n */\n rewards: Map<bigint | number, Reward>\n /**\n * the disbursements this pool as created & finalized\n */\n disbursements: Map<bigint | number, Uint8Array>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type StakingPoolSignatures = keyof StakingPoolTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type StakingPoolNonVoidMethodSignatures = keyof StakingPoolTypes['methods'] extends infer T ? T extends keyof StakingPoolTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the StakingPool smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends StakingPoolSignatures> = StakingPoolTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the StakingPool smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends StakingPoolSignatures> = StakingPoolTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = StakingPoolTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = StakingPoolTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type StakingPoolCreateCallParams =\n | Expand<CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & {method: 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type StakingPoolUpdateCallParams =\n | Expand<CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines supported delete method params for this smart contract\n */\nexport type StakingPoolDeleteCallParams =\n | Expand<CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']> & {method: 'delete'}>\n | Expand<CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']> & {method: 'delete(address)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type StakingPoolDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * 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)\n */\n createParams?: StakingPoolCreateCallParams\n /**\n * Update 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)\n */\n updateParams?: StakingPoolUpdateCallParams\n /**\n * Delete 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)\n */\n deleteParams?: StakingPoolDeleteCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the StakingPool smart contract\n */\nexport abstract class StakingPoolParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends StakingPoolCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void':\n return StakingPoolParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the StakingPool smart contract using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.title, params.args.type, params.args.creator, params.args.funder, params.args.marketplace, params.args.stakeKey, params.args.minimumStakeAmount, params.args.allowLateSignups, params.args.gateId, params.args.maxEntries, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends StakingPoolUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return StakingPoolParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the StakingPool smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Gets available delete ABI call param factories\n */\n static get delete() {\n return {\n _resolveByMethod<TParams extends StakingPoolDeleteCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'delete':\n case 'delete(address)void':\n return StakingPoolParamsFactory.delete.delete(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs delete ABI call params for the StakingPool smart contract using the delete(address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n delete(params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'delete(address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.caller],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the init()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static init(params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'init()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addReward(params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.reward],\n }\n }\n /**\n * Constructs a no op call for the addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addRewardAsa(params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.reward],\n }\n }\n /**\n * Constructs a no op call for the finalize(uint64,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static finalize(params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'finalize(uint64,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.signupTimestamp, params.args.startTimestamp, params.args.endTimestamp],\n }\n }\n /**\n * Constructs a no op call for the gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedEnter(params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.gateTxn, params.args.entries],\n }\n }\n /**\n * Constructs a no op call for the enter(pay,(uint64,uint64,byte[32][])[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static enter(params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'enter(pay,(uint64,uint64,byte[32][])[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.entries],\n }\n }\n /**\n * Constructs a no op call for the startDisbursement(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static startDisbursement(params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'startDisbursement(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId],\n }\n }\n /**\n * Constructs a no op call for the raffle(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static raffle(params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'raffle(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId],\n }\n }\n /**\n * Constructs a no op call for the disburseRewards(uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static disburseRewards(params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'disburseRewards(uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId, params.args.iterationAmount],\n }\n }\n /**\n * Constructs a no op call for the finalizeDistribution(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static finalizeDistribution(params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'finalizeDistribution(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewardId],\n }\n }\n /**\n * Constructs a no op call for the check(address,uint64)(bool,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static check(params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'check(address,uint64)(bool,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the gateCheck(appl,address,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gateCheck(params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gateCheck(appl,address,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.gateTxn, params.args.address, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the enterCost(address,uint64)uint64 ABI method\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static enterCost(params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'enterCost(address,uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.entryCount],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the signUpsOpen()bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static signUpsOpen(params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'signUpsOpen()bool' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the isLive()bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static isLive(params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'isLive()bool' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the isEntered(address)bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static isEntered(params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'isEntered(address)bool' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address],\n }\n }\n /**\n * Constructs a no op call for the getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getState(params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.app],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.winningTickets],\n }\n }\n}\n\n/**\n * 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\n */\nexport class StakingPoolFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `StakingPoolFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new StakingPoolClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new StakingPoolClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the StakingPool smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: StakingPoolDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? StakingPoolParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (StakingPoolCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? StakingPoolParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (StakingPoolUpdateCallParams & { args: Uint8Array[] }) : undefined,\n deleteParams: params.deleteParams?.method ? StakingPoolParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (StakingPoolDeleteCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new StakingPoolClient(result.appClient) }\n }\n\n /**\n * 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.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPool smart contract using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(StakingPoolParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(StakingPoolParamsFactory.update.update(params))\n },\n },\n\n /**\n * Gets available deployDelete methods\n */\n deployDelete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the delete(address)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n return this.appFactory.params.deployDelete(StakingPoolParamsFactory.delete.delete(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPool smart contract using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(StakingPoolParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPool smart contract using an ABI method call using the create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<StakingPoolArgs['obj']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(StakingPoolParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | StakingPoolReturns['create(string,uint8,address,(address,uint64),address,(address,string),uint64,bool,uint64,uint64,uint64,uint64)void']) }, appClient: new StakingPoolClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the StakingPool smart contract\n */\nexport class StakingPoolClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `StakingPoolClient`\n *\n * @param appClient An `AppClient` instance which has been created with the StakingPool app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `StakingPoolClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends StakingPoolNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `StakingPoolClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<StakingPoolClient> {\n return new StakingPoolClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `StakingPoolClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<StakingPoolClient> {\n return new StakingPoolClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(StakingPoolParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the `delete(address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n return this.appClient.params.delete(StakingPoolParamsFactory.delete.delete(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `init()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n init: (params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addReward: (params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.addReward(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addRewardAsa: (params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.addRewardAsa(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalize(uint64,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n finalize: (params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.finalize(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedEnter: (params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.gatedEnter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enter(pay,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n enter: (params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.enter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `startDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n startDisbursement: (params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.startDisbursement(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `raffle(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n raffle: (params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.raffle(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `disburseRewards(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n disburseRewards: (params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.disburseRewards(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalizeDistribution(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n finalizeDistribution: (params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.finalizeDistribution(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `check(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n check: (params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.check(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gateCheck(appl,address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gateCheck: (params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.gateCheck(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call params: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n enterCost: (params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.enterCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean of whether sign ups are open\n */\n signUpsOpen: (params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.signUpsOpen(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean of whether the pool is live\n */\n isLive: (params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.isLive(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean indicating if the address has entered the staking pool\n */\n isEntered: (params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.isEntered(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n getState: (params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.getState(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(StakingPoolParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the `delete(address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n return this.appClient.createTransaction.delete(StakingPoolParamsFactory.delete.delete(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `init()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n init: (params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addReward: (params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.addReward(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addRewardAsa: (params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.addRewardAsa(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalize(uint64,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n finalize: (params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.finalize(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedEnter: (params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.gatedEnter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enter(pay,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n enter: (params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.enter(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `startDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n startDisbursement: (params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.startDisbursement(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `raffle(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n raffle: (params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.raffle(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `disburseRewards(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n disburseRewards: (params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.disburseRewards(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalizeDistribution(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n finalizeDistribution: (params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.finalizeDistribution(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `check(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n check: (params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.check(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gateCheck(appl,address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gateCheck: (params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.gateCheck(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n enterCost: (params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.enterCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean of whether sign ups are open\n */\n signUpsOpen: (params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.signUpsOpen(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean of whether the pool is live\n */\n isLive: (params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.isLive(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean indicating if the address has entered the staking pool\n */\n isEntered: (params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.isEntered(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n getState: (params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.getState(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(StakingPoolParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the `delete(address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n delete: async (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']> & SendParams) => {\n const result = await this.appClient.send.delete(StakingPoolParamsFactory.delete.delete(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['delete(address)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `init()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n init: async (params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.init(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['init()void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addReward: async (params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.addReward(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addRewardAsa: async (params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.addRewardAsa(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalize(uint64,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n finalize: async (params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.finalize(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['finalize(uint64,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedEnter: async (params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.gatedEnter(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enter(pay,(uint64,uint64,byte[32][])[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n enter: async (params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.enter(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['enter(pay,(uint64,uint64,byte[32][])[])void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `startDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n startDisbursement: async (params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.startDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['startDisbursement(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `raffle(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n raffle: async (params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.raffle(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['raffle(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `disburseRewards(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n disburseRewards: async (params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.disburseRewards(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['disburseRewards(uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `finalizeDistribution(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n finalizeDistribution: async (params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.finalizeDistribution(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['finalizeDistribution(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `check(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n check: async (params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.check(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['check(address,uint64)(bool,uint64)'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `gateCheck(appl,address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gateCheck: async (params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.gateCheck(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['gateCheck(appl,address,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call result: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n enterCost: async (params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.enterCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['enterCost(address,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether sign ups are open\n */\n signUpsOpen: async (params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.signUpsOpen(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['signUpsOpen()bool'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether the pool is live\n */\n isLive: async (params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isLive(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['isLive()bool'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean indicating if the address has entered the staking pool\n */\n isEntered: async (params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isEntered(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['isEntered(address)bool'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n getState: async (params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.getState(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['updateAkitaDAOEscrow(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n mbr: async (params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new StakingPoolClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `enterCost(address,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param params The params for the smart contract call\n * @returns The call result: The total payment amount needed (includes box MBR + any shortfall to meet min balance)\n */\n async enterCost(params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.enterCost(params))\n return result.return as unknown as StakingPoolReturns['enterCost(address,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.optInCost(params))\n return result.return as unknown as StakingPoolReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `signUpsOpen()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether sign ups are open\n */\n async signUpsOpen(params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.signUpsOpen(params))\n return result.return as unknown as StakingPoolReturns['signUpsOpen()bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `isLive()bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean of whether the pool is live\n */\n async isLive(params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isLive(params))\n return result.return as unknown as StakingPoolReturns['isLive()bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `isEntered(address)bool` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean indicating if the address has entered the staking pool\n */\n async isEntered(params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.isEntered(params))\n return result.return as unknown as StakingPoolReturns['isEntered(address)bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async getState(params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.getState(params))\n return result.return as unknown as StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPool smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n async mbr(params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingPoolParamsFactory.mbr(params))\n return result.return as unknown as StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }\n\n /**\n * Methods to access state for the current StakingPool app\n */\n state = {\n /**\n * Methods to access global state for the current StakingPool app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n status: result.status,\n title: result.title,\n type: result.type,\n signupTimestamp: result.signupTimestamp,\n allowLateSignups: result.allowLateSignups,\n startTimestamp: result.startTimestamp,\n endTimestamp: result.endTimestamp,\n maxEntries: result.maxEntries,\n entryId: result.entryID,\n rewardId: result.rewardID,\n totalStaked: result.totalStaked,\n stakeKey: result.stakeKey,\n minimumStakeAmount: result.minimumStakeAmount,\n gateId: result.gateID,\n gateSize: result.gateSize,\n creator: result.creator,\n marketplace: result.marketplace,\n marketplaceRoyalties: result.marketplaceRoyalties,\n akitaRoyalty: result.akitaRoyalty,\n akitaRoyaltyAmount: result.akitaRoyaltyAmount,\n salt: new BinaryStateValue(result.salt),\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n funder: result.funder,\n }\n },\n /**\n * Get the current value of the status key in global state\n */\n status: async (): Promise<number | undefined> => { return (await this.appClient.state.global.getValue(\"status\")) as number | undefined },\n /**\n * Get the current value of the title key in global state\n */\n title: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"title\")) as string | undefined },\n /**\n * Get the current value of the type key in global state\n */\n type: async (): Promise<number | undefined> => { return (await this.appClient.state.global.getValue(\"type\")) as number | undefined },\n /**\n * Get the current value of the signupTimestamp key in global state\n */\n signupTimestamp: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"signupTimestamp\")) as bigint | undefined },\n /**\n * Get the current value of the allowLateSignups key in global state\n */\n allowLateSignups: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"allowLateSignups\")) as bigint | undefined },\n /**\n * Get the current value of the startTimestamp key in global state\n */\n startTimestamp: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"startTimestamp\")) as bigint | undefined },\n /**\n * Get the current value of the endTimestamp key in global state\n */\n endTimestamp: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"endTimestamp\")) as bigint | undefined },\n /**\n * Get the current value of the maxEntries key in global state\n */\n maxEntries: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"maxEntries\")) as bigint | undefined },\n /**\n * Get the current value of the entryID key in global state\n */\n entryId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"entryID\")) as bigint | undefined },\n /**\n * Get the current value of the rewardID key in global state\n */\n rewardId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"rewardID\")) as bigint | undefined },\n /**\n * Get the current value of the totalStaked key in global state\n */\n totalStaked: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"totalStaked\")) as bigint | undefined },\n /**\n * Get the current value of the stakeKey key in global state\n */\n stakeKey: async (): Promise<RootKey | undefined> => { return (await this.appClient.state.global.getValue(\"stakeKey\")) as RootKey | undefined },\n /**\n * Get the current value of the minimumStakeAmount key in global state\n */\n minimumStakeAmount: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"minimumStakeAmount\")) as bigint | undefined },\n /**\n * Get the current value of the gateID key in global state\n */\n gateId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateID\")) as bigint | undefined },\n /**\n * Get the current value of the gateSize key in global state\n */\n gateSize: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateSize\")) as bigint | undefined },\n /**\n * Get the current value of the creator key in global state\n */\n creator: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"creator\")) as string | undefined },\n /**\n * Get the current value of the marketplace key in global state\n */\n marketplace: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"marketplace\")) as string | undefined },\n /**\n * Get the current value of the marketplaceRoyalties key in global state\n */\n marketplaceRoyalties: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"marketplaceRoyalties\")) as bigint | undefined },\n /**\n * Get the current value of the akitaRoyalty key in global state\n */\n akitaRoyalty: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaRoyalty\")) as bigint | undefined },\n /**\n * Get the current value of the akitaRoyaltyAmount key in global state\n */\n akitaRoyaltyAmount: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaRoyaltyAmount\")) as bigint | undefined },\n /**\n * Get the current value of the salt key in global state\n */\n salt: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.global.getValue(\"salt\")) as Uint8Array | undefined) },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n /**\n * Get the current value of the funder key in global state\n */\n funder: async (): Promise<FunderInfo | undefined> => { return (await this.appClient.state.global.getValue(\"funder\")) as FunderInfo | undefined },\n },\n /**\n * Methods to access box state for the current StakingPool app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the entries map in box state\n */\n entries: {\n /**\n * Get all current values of the entries map in box state\n */\n getMap: async (): Promise<Map<bigint, EntryData>> => { return (await this.appClient.state.box.getMap(\"entries\")) as Map<bigint, EntryData> },\n /**\n * Get a current value of the entries map by key from box state\n */\n value: async (key: bigint | number): Promise<EntryData | undefined> => { return await this.appClient.state.box.getMapValue(\"entries\", key) as EntryData | undefined },\n },\n /**\n * Get values from the uniques map in box state\n */\n uniques: {\n /**\n * Get all current values of the uniques map in box state\n */\n getMap: async (): Promise<Map<string, bigint>> => { return (await this.appClient.state.box.getMap(\"uniques\")) as Map<string, bigint> },\n /**\n * Get a current value of the uniques map by key from box state\n */\n value: async (key: string): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"uniques\", key) as bigint | undefined },\n },\n /**\n * Get values from the entriesByAddress map in box state\n */\n entriesByAddress: {\n /**\n * Get all current values of the entriesByAddress map in box state\n */\n getMap: async (): Promise<Map<EntryKey, bigint>> => { return (await this.appClient.state.box.getMap(\"entriesByAddress\")) as Map<EntryKey, bigint> },\n /**\n * Get a current value of the entriesByAddress map by key from box state\n */\n value: async (key: EntryKey): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"entriesByAddress\", key) as bigint | undefined },\n },\n /**\n * Get values from the rewards map in box state\n */\n rewards: {\n /**\n * Get all current values of the rewards map in box state\n */\n getMap: async (): Promise<Map<bigint, Reward>> => { return (await this.appClient.state.box.getMap(\"rewards\")) as Map<bigint, Reward> },\n /**\n * Get a current value of the rewards map by key from box state\n */\n value: async (key: bigint | number): Promise<Reward | undefined> => { return await this.appClient.state.box.getMapValue(\"rewards\", key) as Reward | undefined },\n },\n /**\n * Get values from the disbursements map in box state\n */\n disbursements: {\n /**\n * Get all current values of the disbursements map in box state\n */\n getMap: async (): Promise<Map<bigint, Uint8Array>> => { return (await this.appClient.state.box.getMap(\"disbursements\")) as Map<bigint, Uint8Array> },\n /**\n * Get a current value of the disbursements map by key from box state\n */\n value: async (key: bigint | number): Promise<Uint8Array | undefined> => { return await this.appClient.state.box.getMapValue(\"disbursements\", key) as Uint8Array | undefined },\n },\n },\n }\n\n public newGroup(): StakingPoolComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a init()void method call against the StakingPool contract\n */\n init(params: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.init(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the StakingPool contract\n */\n optIn(params: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void method call against the StakingPool contract\n */\n addReward(params: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addReward(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void method call against the StakingPool contract\n */\n addRewardAsa(params: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addRewardAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a finalize(uint64,uint64,uint64)void method call against the StakingPool contract\n */\n finalize(params: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalize(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void method call against the StakingPool contract\n */\n gatedEnter(params: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedEnter(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a enter(pay,(uint64,uint64,byte[32][])[])void method call against the StakingPool contract\n */\n enter(params: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.enter(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a startDisbursement(uint64)void method call against the StakingPool contract\n */\n startDisbursement(params: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.startDisbursement(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a raffle(uint64)void method call against the StakingPool contract\n */\n raffle(params: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.raffle(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a disburseRewards(uint64,uint64)void method call against the StakingPool contract\n */\n disburseRewards(params: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.disburseRewards(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a finalizeDistribution(uint64)void method call against the StakingPool contract\n */\n finalizeDistribution(params: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalizeDistribution(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a check(address,uint64)(bool,uint64) method call against the StakingPool contract\n */\n check(params: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.check(params)))\n resultMappers.push((v) => client.decodeReturnValue('check(address,uint64)(bool,uint64)', v))\n return this\n },\n /**\n * Add a gateCheck(appl,address,uint64)void method call against the StakingPool contract\n */\n gateCheck(params: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gateCheck(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a enterCost(address,uint64)uint64 method call against the StakingPool contract\n */\n enterCost(params: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.enterCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('enterCost(address,uint64)uint64', v))\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the StakingPool contract\n */\n optInCost(params: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost(uint64)uint64', v))\n return this\n },\n /**\n * Add a signUpsOpen()bool method call against the StakingPool contract\n */\n signUpsOpen(params: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.signUpsOpen(params)))\n resultMappers.push((v) => client.decodeReturnValue('signUpsOpen()bool', v))\n return this\n },\n /**\n * Add a isLive()bool method call against the StakingPool contract\n */\n isLive(params: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.isLive(params)))\n resultMappers.push((v) => client.decodeReturnValue('isLive()bool', v))\n return this\n },\n /**\n * Add a isEntered(address)bool method call against the StakingPool contract\n */\n isEntered(params: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.isEntered(params)))\n resultMappers.push((v) => client.decodeReturnValue('isEntered(address)bool', v))\n return this\n },\n /**\n * Add a getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address) method call against the StakingPool contract\n */\n getState(params: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getState(params)))\n resultMappers.push((v) => client.decodeReturnValue('getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)', v))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow(uint64)void method call against the StakingPool contract\n */\n updateAkitaDaoEscrow(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the StakingPool contract\n */\n updateAkitaDao(params: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a opUp()void method call against the StakingPool contract\n */\n opUp(params: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a mbr(uint64)(uint64,uint64,uint64,uint64,uint64) method call against the StakingPool contract\n */\n mbr(params: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n resultMappers.push((v) => client.decodeReturnValue('mbr(uint64)(uint64,uint64,uint64,uint64,uint64)', v))\n return this\n },\n get update() {\n return {\n update: (params: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n get delete() {\n return {\n delete: (params: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delete(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the StakingPool contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as StakingPoolComposer\n }\n}\nexport type StakingPoolComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the init()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n init(params?: CallParams<StakingPoolArgs['obj']['init()void'] | StakingPoolArgs['tuple']['init()void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['init()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa, it may also require the akita dao escrow to opt in\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<StakingPoolArgs['obj']['optIn(pay,uint64)void'] | StakingPoolArgs['tuple']['optIn(pay,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addReward(params?: CallParams<StakingPoolArgs['obj']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | undefined]>\n\n /**\n * Calls the addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addRewardAsa(params?: CallParams<StakingPoolArgs['obj']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | StakingPoolArgs['tuple']['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'] | undefined]>\n\n /**\n * Calls the finalize(uint64,uint64,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n finalize(params?: CallParams<StakingPoolArgs['obj']['finalize(uint64,uint64,uint64)void'] | StakingPoolArgs['tuple']['finalize(uint64,uint64,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['finalize(uint64,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gatedEnter(params?: CallParams<StakingPoolArgs['obj']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['gatedEnter(pay,appl,(uint64,uint64,byte[32][])[])void'] | undefined]>\n\n /**\n * Calls the enter(pay,(uint64,uint64,byte[32][])[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n enter(params?: CallParams<StakingPoolArgs['obj']['enter(pay,(uint64,uint64,byte[32][])[])void'] | StakingPoolArgs['tuple']['enter(pay,(uint64,uint64,byte[32][])[])void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['enter(pay,(uint64,uint64,byte[32][])[])void'] | undefined]>\n\n /**\n * Calls the startDisbursement(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n startDisbursement(params?: CallParams<StakingPoolArgs['obj']['startDisbursement(uint64)void'] | StakingPoolArgs['tuple']['startDisbursement(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['startDisbursement(uint64)void'] | undefined]>\n\n /**\n * Calls the raffle(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n raffle(params?: CallParams<StakingPoolArgs['obj']['raffle(uint64)void'] | StakingPoolArgs['tuple']['raffle(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['raffle(uint64)void'] | undefined]>\n\n /**\n * Calls the disburseRewards(uint64,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n disburseRewards(params?: CallParams<StakingPoolArgs['obj']['disburseRewards(uint64,uint64)void'] | StakingPoolArgs['tuple']['disburseRewards(uint64,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['disburseRewards(uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the finalizeDistribution(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n finalizeDistribution(params?: CallParams<StakingPoolArgs['obj']['finalizeDistribution(uint64)void'] | StakingPoolArgs['tuple']['finalizeDistribution(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['finalizeDistribution(uint64)void'] | undefined]>\n\n /**\n * Calls the check(address,uint64)(bool,uint64) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n check(params?: CallParams<StakingPoolArgs['obj']['check(address,uint64)(bool,uint64)'] | StakingPoolArgs['tuple']['check(address,uint64)(bool,uint64)']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['check(address,uint64)(bool,uint64)'] | undefined]>\n\n /**\n * Calls the gateCheck(appl,address,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gateCheck(params?: CallParams<StakingPoolArgs['obj']['gateCheck(appl,address,uint64)void'] | StakingPoolArgs['tuple']['gateCheck(appl,address,uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['gateCheck(appl,address,uint64)void'] | undefined]>\n\n /**\n * Calls the enterCost(address,uint64)uint64 ABI method.\n *\n * Calculates the total cost required to enter the pool\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n enterCost(params?: CallParams<StakingPoolArgs['obj']['enterCost(address,uint64)uint64'] | StakingPoolArgs['tuple']['enterCost(address,uint64)uint64']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['enterCost(address,uint64)uint64'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<StakingPoolArgs['obj']['optInCost(uint64)uint64'] | StakingPoolArgs['tuple']['optInCost(uint64)uint64']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the signUpsOpen()bool ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n signUpsOpen(params?: CallParams<StakingPoolArgs['obj']['signUpsOpen()bool'] | StakingPoolArgs['tuple']['signUpsOpen()bool']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['signUpsOpen()bool'] | undefined]>\n\n /**\n * Calls the isLive()bool ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n isLive(params?: CallParams<StakingPoolArgs['obj']['isLive()bool'] | StakingPoolArgs['tuple']['isLive()bool']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['isLive()bool'] | undefined]>\n\n /**\n * Calls the isEntered(address)bool ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n isEntered(params?: CallParams<StakingPoolArgs['obj']['isEntered(address)bool'] | StakingPoolArgs['tuple']['isEntered(address)bool']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['isEntered(address)bool'] | undefined]>\n\n /**\n * Calls the getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n getState(params?: CallParams<StakingPoolArgs['obj']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | StakingPoolArgs['tuple']['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['getState()(uint8,string,uint8,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64,(address,string),uint64,uint64,address)'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<StakingPoolArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAOEscrow(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['updateAkitaDAOEscrow(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<StakingPoolArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolArgs['tuple']['updateAkitaDAO(uint64)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<StakingPoolArgs['obj']['opUp()void'] | StakingPoolArgs['tuple']['opUp()void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<StakingPoolArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the StakingPool smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<StakingPoolArgs['obj']['update(string)void'] | StakingPoolArgs['tuple']['update(string)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Gets available delete methods\n */\n readonly delete: {\n /**\n * Deletes an existing instance of the StakingPool smart contract using the delete(address)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delete(params?: CallParams<StakingPoolArgs['obj']['delete(address)void'] | StakingPoolArgs['tuple']['delete(address)void']>): StakingPoolComposer<[...TReturns, StakingPoolReturns['delete(address)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPool smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): StakingPoolComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): StakingPoolComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<StakingPoolComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<StakingPoolComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<StakingPoolComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<StakingPoolComposerResults<TReturns>>\n}\nexport type StakingPoolComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"StakingPoolFactory\",\"structs\":{\"RootKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"name\",\"type\":\"string\"}],\"StakingPoolMBRData\":[{\"name\":\"entries\",\"type\":\"uint64\"},{\"name\":\"uniques\",\"type\":\"uint64\"},{\"name\":\"entriesByAddress\",\"type\":\"uint64\"},{\"name\":\"rewards\",\"type\":\"uint64\"},{\"name\":\"disbursements\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"string\",\"name\":\"childVersion\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"newPool\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"(address,string)\",\"struct\":\"RootKey\",\"name\":\"stakeKey\"},{\"type\":\"uint64\",\"name\":\"minimumStakeAmount\"},{\"type\":\"bool\",\"name\":\"allowLateSignups\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"uint64\",\"name\":\"maxEntries\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deletePool\",\"args\":[{\"type\":\"uint64\",\"name\":\"appId\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"newPoolCost\",\"args\":[],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[{\"type\":\"uint64\",\"name\":\"winningTickets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64,uint64)\",\"struct\":\"StakingPoolMBRData\",\"desc\":\"the mbr created for each boxmap entry\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"initBoxedContract\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"size\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"loadBoxedContract\",\"args\":[{\"type\":\"uint64\",\"name\":\"offset\"},{\"type\":\"byte[]\",\"name\":\"data\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deleteBoxedContract\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"uint64\",\"name\":\"app\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":2},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"childContractVersion\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==\",\"desc\":\"the current version of the child contract\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow to use\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{\"boxedContract\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"YmM=\"}}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[636],\"errorMessage\":\"Box must have value\"},{\"pc\":[327,986],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[560,1389],\"errorMessage\":\"Contract not set\"},{\"pc\":[1614],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[1384],\"errorMessage\":\"Invalid call order\"},{\"pc\":[1477],\"errorMessage\":\"Invalid payment\"},{\"pc\":[849],\"errorMessage\":\"Invalid percentage\"},{\"pc\":[1044],\"errorMessage\":\"Not creator of the pool\"},{\"pc\":[120],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[241],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[1266,1287,1416,1561,1600,1644],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[620,922,1040,1285,1414,1451,1518,1559,1596,1642],\"errorMessage\":\"application exists\"},{\"pc\":[611],\"errorMessage\":\"assert target is match for conditions\"},{\"pc\":[569,616,666,802,1116,1130,1278,1407,1444,1448,1511,1515,1552,1588,1635],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[336,1316],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[420,436,503,1236,1579],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[539],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[447,456,531,547,555,991,1035,1178,1247,1301,1439,1506,1545,1628],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[511],\"errorMessage\":\"invalid number of bytes for uint8\"},{\"pc\":[520],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[490,1431],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiA0MDk2IDExNzA1MDAgMTAwMDAwCiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJiYyIgMHgxNTFmN2M3NSAiYWtpdGFfZXNjcm93IiAid2FsbGV0IiAweGM1M2IzMmNjICJ2ZXJzaW9uIiAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIgInN0YWtpbmdfZmVlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE4CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2xGYWN0b3J5IGV4dGVuZHMgY2xhc3NlcyhCYXNlU3Rha2luZ1Bvb2wsIEZhY3RvcnlDb250cmFjdCkgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE4CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2xGYWN0b3J5IGV4dGVuZHMgY2xhc3NlcyhCYXNlU3Rha2luZ1Bvb2wsIEZhY3RvcnlDb250cmFjdCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIwCiAgICBwdXNoYnl0ZXNzIDB4MmIyNWFjODkgMHhjNzQ3OGY5ZCAweDQ3MGM2ZWQ3IDB4YTRiM2U3ODkgLy8gbWV0aG9kICJuZXdQb29sKHBheSxzdHJpbmcsdWludDgsYWRkcmVzcywoYWRkcmVzcyxzdHJpbmcpLHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJkZWxldGVQb29sKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJuZXdQb29sQ29zdCgpdWludDY0IiwgbWV0aG9kICJtYnIodWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4ZGNhMmQ4NjIgMHhkMzQ2YjFhNCAweDM5NGVhZWIyIDB4MzNmNzg4MDggMHgxZWFkMjBhOSAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJsb2FkQm94ZWRDb250cmFjdCh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZUJveGVkQ29udHJhY3QoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPRXNjcm93KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBa2l0YURBTyh1aW50NjQpdm9pZCIsIG1ldGhvZCAib3BVcCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG5ld1Bvb2wgZGVsZXRlUG9vbCBuZXdQb29sQ29zdCBtYnIgaW5pdEJveGVkQ29udHJhY3QgbG9hZEJveGVkQ29udHJhY3QgZGVsZXRlQm94ZWRDb250cmFjdCBvcHRJbiBvcHRJbkNvc3QgdXBkYXRlQWtpdGFEQU9Fc2Nyb3cgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE4CiAgICBlcnIKCm1haW5fb3BVcF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQzCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbEZhY3RvcnkgZXh0ZW5kcyBjbGFzc2VzKEJhc2VTdGFraW5nUG9vbCwgRmFjdG9yeUNvbnRyYWN0KSB7CiAgICBwdXNoYnl0ZXMgMHhjNDI2ZjRiYSAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsc3RyaW5nLHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWZlcnJlck9yWmVyb0FkZHJlc3Mod2FsbGV0SUQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnJlZmVycmVyT3JaZXJvQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTYwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gcmVmZXJyZXJPclplcm9BZGRyZXNzKHdhbGxldElEOiBBcHBsaWNhdGlvbik6IEFjY291bnQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2MQogICAgLy8gcmV0dXJuIHJlZmVycmVyT3Iod2FsbGV0SUQsIEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTQKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogcmVmZXJyZXJPclplcm9BZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKCnJlZmVycmVyT3JaZXJvQWRkcmVzc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJlZmVycmVyT3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTYxCiAgICAvLyByZXR1cm4gcmVmZXJyZXJPcih3YWxsZXRJRCwgR2xvYmFsLnplcm9BZGRyZXNzKQogICAgc3dhcAogICAgcmV0c3ViCgpyZWZlcnJlck9yWmVyb0FkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3NQogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICBwdXNoYnl0ZXMgInJlZmVycmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjEKICAgIC8vIHJldHVybiByZWZlcnJlck9yKHdhbGxldElELCBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBiIHJlZmVycmVyT3JaZXJvQWRkcmVzc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJlZmVycmVyT3JANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogdWludDY0LCBhZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24sIGFkZHJlc3M6IEFjY291bnQpOiBBcHBsaWNhdGlvbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4M2MxYTZmMzMgLy8gbWV0aG9kICJnZXQoYWRkcmVzcylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1aW50OFtdKQogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICAhPQogICAgYnogZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lmX2Vsc2VANwoKZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2lmX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkyCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5NQogICAgLy8gcmV0dXJuIGJ0b2koZGF0YSkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgYiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREA4CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKc3BsaXRPcHRJbkNvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBzcGxpdE9wdEluQ291bnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBlc2Nyb3c6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIyCiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyNAogICAgLy8gaWYgKCFlc2Nyb3cuaXNPcHRlZEluKGFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDMKICAgIC8vIGNvbnN0IFtzcGxpdHNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNSZXZlbnVlU3BsaXRzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJyZXZlbnVlX3NwbGl0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI4CiAgICAvLyBjb3VudCArPSBzcGxpdHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo6U3Rha2luZ1Bvb2xGYWN0b3J5LmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjI0CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoyNgogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzQKICAgIC8vIGNoaWxkQ29udHJhY3RWZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogQmFzZUZhY3RvcnlHbG9iYWxTdGF0ZUtleUNoaWxkQ29udHJhY3RWZXJzaW9uIH0pCiAgICBieXRlYyA3IC8vICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MjcKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUgPSBjaGlsZFZlcnNpb24KICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MjgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18zIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoyOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFraXRhREFPRXNjcm93CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MjQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OlN0YWtpbmdQb29sRmFjdG9yeS5uZXdQb29sW3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3UG9vbDoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MzQtNDQKICAgIC8vIG5ld1Bvb2woCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdHlwZTogU3Rha2luZ1R5cGUsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gICBzdGFrZUtleTogUm9vdEtleSwKICAgIC8vICAgbWluaW11bVN0YWtlQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGFsbG93TGF0ZVNpZ251cHM6IGJvb2xlYW4sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXhFbnRyaWVzOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NDYKICAgIC8vIGFzc2VydCh0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzLCBFUlJfQ09OVFJBQ1RfTk9UX1NFVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENvbnRyYWN0IG5vdCBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjUxLTUzCiAgICAvLyBNQVhfUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVVaW50Q291bnQpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVCeXRlc0NvdW50KSArCiAgICBpbnRjIDUgLy8gMTE3MDUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NTQKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NTEtNTQKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZVVpbnRDb3VudCkgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZUJ5dGVzQ291bnQpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo1NwogICAgLy8gY29uc3QgeyBjcmVhdGlvbkZlZSB9ID0gZ2V0U3Rha2luZ0ZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCB7IGNyZWF0aW9uRmVlIH0gPSBnZXRTdGFraW5nRmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NzgKICAgIC8vIGNvbnN0IFtzdGFraW5nRmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1N0YWtpbmdGZWVzKSkKICAgIGJ5dGVjIDggLy8gInN0YWtpbmdfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCB7IGNyZWF0aW9uRmVlIH0gPSBnZXRTdGFraW5nRmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjU5CiAgICAvLyBsZXQgcmVmZXJyYWxNYnI6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MAogICAgLy8gaWYgKGNyZWF0aW9uRmVlID4gMCkgewogICAgYm56IG5ld1Bvb2xfaWZfYm9keUAyCiAgICBkaWcgMQoKbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2NS02NgogICAgLy8gY3JlYXRpb25GZWUgKwogICAgLy8gY2hpbGRNQlIgKwogICAgZGlnIDIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjY1LTY3CiAgICAvLyBjcmVhdGlvbkZlZSArCiAgICAvLyBjaGlsZE1CUiArCiAgICAvLyByZWZlcnJhbE1icgogICAgZGlnIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjcwLTc2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRvdGFsTUJSLAogICAgLy8gICB9CiAgICAvLyApCiAgICBkaWcgMTQKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjczCiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6NzAtNzYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdG90YWxNQlIsCiAgICAvLyAgIH0KICAgIC8vICkKICAgID09CiAgICBkaWcgMQogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDMKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODAKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18zIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo4MAogICAgLy8gcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjc4LTgyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo3OC04MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IGFwcHJvdmFsU2l6ZSA9IHRoaXMuYm94ZWRDb250cmFjdC5sZW5ndGgKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODcKICAgIC8vIGNvbnN0IGNodW5rMSA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDAsIDQwOTYpCiAgICBpbnRjXzAgLy8gMAogICAgaW50YyA0IC8vIDQwOTYKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo4OAogICAgLy8gY29uc3QgY2h1bmsyID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoNDA5NiwgYXBwcm92YWxTaXplIC0gNDA5NikKICAgIHN3YXAKICAgIGludGMgNCAvLyA0MDk2CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6ODgKICAgIC8vIGNvbnN0IGNodW5rMiA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDQwOTYsIGFwcHJvdmFsU2l6ZSAtIDQwOTYpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo5NQogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjk2CiAgICAvLyB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIFNlbmRlcgogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMDQKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBwdXNoYnl0ZXMgMHhhMmYzYzU0NCAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDgsYWRkcmVzcywoYWRkcmVzcyx1aW50NjQpLGFkZHJlc3MsKGFkZHJlc3Msc3RyaW5nKSx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjQ4CiAgICAvLyBjb25zdCBwb29sID0gY29tcGlsZUFyYzQoU3Rha2luZ1Bvb2wpCiAgICBwdXNoaW50IDkgLy8gOQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEwOAogICAgLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo0OAogICAgLy8gY29uc3QgcG9vbCA9IGNvbXBpbGVBcmM0KFN0YWtpbmdQb29sKQogICAgcHVzaGJ5dGVzIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTA5CiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6OTAtMTExCiAgICAvLyBjb25zdCBuZXdQb29sQXBwID0gcG9vbC5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHRpdGxlLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IGNoaWxkTUJSIH0sCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHN0YWtlS2V5LAogICAgLy8gICAgICAgbWluaW11bVN0YWtlQW1vdW50LAogICAgLy8gICAgICAgYWxsb3dMYXRlU2lnbnVwcywKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1heEVudHJpZXMsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZQogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbY2h1bmsxLCBjaHVuazJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBwb29sLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMTMKICAgIC8vIHBvb2wuY2FsbC5pbml0KHsgYXBwSWQ6IG5ld1Bvb2xBcHAuaWQgfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDgzZjE0NzQ4IC8vIG1ldGhvZCAiaW5pdCgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MzQtNDQKICAgIC8vIG5ld1Bvb2woCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdHlwZTogU3Rha2luZ1R5cGUsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gICBzdGFrZUtleTogUm9vdEtleSwKICAgIC8vICAgbWluaW11bVN0YWtlQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGFsbG93TGF0ZVNpZ251cHM6IGJvb2xlYW4sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXhFbnRyaWVzOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbmV3UG9vbF9pZl9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gKHsgbGVmdG92ZXIsIHJlZmVycmFsTWJyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGNyZWF0aW9uRmVlKSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjYxCiAgICAvLyAoeyBsZWZ0b3ZlciwgcmVmZXJyYWxNYnIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgMCwgY3JlYXRpb25GZWUpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTIKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTywgVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5MwogICAgLy8gY29uc3QgcmVmZXJyZXIgPSByZWZlcnJlck9yWmVyb0FkZHJlc3Mod2FsbGV0KQogICAgY2FsbHN1YiByZWZlcnJlck9yWmVyb0FkZHJlc3MKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTk2CiAgICAvLyBpZiAoYW1vdW50ID4gMCAmJiByZWZlcnJlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBkaWcgMQogICAgYnogbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDE2CiAgICBkaWcgMTQKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IG5ld1Bvb2xfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2OAogICAgLy8gY29uc3QgW3dhbGxldEZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXRGZWVzKSkKICAgIGRpZyAxMwogICAgcHVzaGJ5dGVzICJ3YWxsZXRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTk4CiAgICAvLyBjb25zdCB7IHJlZmVycmVyUGVyY2VudGFnZSB9ID0gZ2V0V2FsbGV0RmVlcyhha2l0YURBTykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDgKICAgIC8vIGFzc2VydChwIDw9IERJVklTT1IsIEVSUl9JTlZBTElEX1BFUkNFTlRBR0UpCiAgICBkdXAKICAgIGludGMgNiAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwZXJjZW50YWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGRpZyAyCiAgICBtdWx3CiAgICBpbnRjIDYgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjAxCiAgICAvLyBpZiAocmVmZXJyYWxGZWUgPT09IDAgJiYgYW1vdW50ID4gMCkgewogICAgYm56IG5ld1Bvb2xfYWZ0ZXJfaWZfZWxzZUA5CiAgICBkaWcgMQogICAgYnogbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjAyCiAgICAvLyByZWZlcnJhbEZlZSA9IDEKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDEzCgpuZXdQb29sX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA4CiAgICAvLyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDkKICAgIC8vIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgT05FX1dFRUspLAogICAgZHVwCiAgICBwdXNoaW50IDYwNDgwMCAvLyA2MDQ4MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjEwCiAgICAvLyBbeyBhZGRyZXNzOiByZWZlcnJlciwgYW1vdW50OiByZWZlcnJhbEZlZSB9XSwKICAgIGRpZyAxNAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBkaWcgMTcKICAgIHB1c2hieXRlcyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjMKICAgIC8vIGxldCBjb3N0OiB1aW50NjQgPSBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyNTMwMCAvLyAyNTMwMAogICAgKgogICAgcHVzaGludCAzNTMwMCAvLyAzNTMwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI5CiAgICAvLyByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIGRpZyAxCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMAogICAgLy8gYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgZGlnIDEKICAgIGRpZyA1CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjgtNTMxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyNS01MzYKICAgIC8vIGlkID0gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICBhbGxvY2F0aW9ucwogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMgogICAgLy8gdGltZVRvVW5sb2NrLAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMwogICAgLy8gZXhwaXJhdGlvbiwKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDdiN2RjNWZjIC8vIG1ldGhvZCAiY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChwYXksdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU3NwogICAgLy8gcmV0dXJuIHsgaWQsIGNvc3QgfQogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwNS02MTMKICAgIC8vIGNvbnN0IHsgY29zdDogcmVmZXJyYWxNYnIgfSA9IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIGFraXRhREFPLAogICAgLy8gICBhc3NldCwKICAgIC8vICAgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfV0VFSyksCiAgICAvLyAgIFt7IGFkZHJlc3M6IHJlZmVycmVyLCBhbW91bnQ6IHJlZmVycmFsRmVlIH1dLAogICAgLy8gICByZWZlcnJhbEZlZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxNQogICAgLy8gcmV0dXJuIHsgbGVmdG92ZXI6IChhbW91bnQgLSByZWZlcnJhbEZlZSksIHJlZmVycmFsTWJyIH0KICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAoKbmV3UG9vbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNlbmRSZWZlcnJhbFBheW1lbnRAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gKHsgbGVmdG92ZXIsIHJlZmVycmFsTWJyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGNyZWF0aW9uRmVlKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMgogICAgYiBuZXdQb29sX2FmdGVyX2lmX2Vsc2VAMwoKbmV3UG9vbF9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MTgKICAgIC8vIHJldHVybiB7IGxlZnRvdmVyOiBhbW91bnQsIHJlZmVycmFsTWJyOiAwIH0KICAgIGRpZyAxCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gKHsgbGVmdG92ZXIsIHJlZmVycmFsTWJyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGNyZWF0aW9uRmVlKSkKICAgIGIgbmV3UG9vbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNlbmRSZWZlcnJhbFBheW1lbnRAMTcKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo6U3Rha2luZ1Bvb2xGYWN0b3J5LmRlbGV0ZVBvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVQb29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTE4CiAgICAvLyBkZWxldGVQb29sKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjExOQogICAgLy8gYXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0NSRUFUT1IpCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBjcmVhdG9yIG9mIHRoZSBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkdXAKICAgIHB1c2hieXRlcyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTIxCiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTIzLTEyNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZ1Bvb2wucHJvdG90eXBlLmRlbGV0ZT4oewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMjUKICAgIC8vIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEyMy0xMjcKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5kZWxldGU+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4YWI4YjIxM2EgLy8gbWV0aG9kICJkZWxldGUoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxMjYKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbgogICAgcHVzaGludCA1IC8vIDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTIzLTEyNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Rha2luZ1Bvb2wucHJvdG90eXBlLmRlbGV0ZT4oewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24KICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTI5LTEzMQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IHJlY2VpdmVyLCBhbW91bnQgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTI5LTEzMAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IHJlY2VpdmVyLCBhbW91bnQgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEyOS0xMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyByZWNlaXZlciwgYW1vdW50IH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjExOAogICAgLy8gZGVsZXRlUG9vbChhcHBJZDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czo6U3Rha2luZ1Bvb2xGYWN0b3J5Lm5ld1Bvb2xDb3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3UG9vbENvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDAtMTQyCiAgICAvLyBNQVhfUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVVaW50Q291bnQpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBQb29sR2xvYmFsU3RhdGVCeXRlc0NvdW50KSArCiAgICBpbnRjIDUgLy8gMTE3MDUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTQzCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0MC0xNDMKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZVVpbnRDb3VudCkgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIFBvb2xHbG9iYWxTdGF0ZUJ5dGVzQ291bnQpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDYKICAgIC8vIGxldCByZWZlcnJhbE1icjogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgeyBjcmVhdGlvbkZlZSB9ID0gZ2V0U3Rha2luZ0ZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IHsgY3JlYXRpb25GZWUgfSA9IGdldFN0YWtpbmdGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo3OAogICAgLy8gY29uc3QgW3N0YWtpbmdGZWVzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzU3Rha2luZ0ZlZXMpKQogICAgYnl0ZWMgOCAvLyAic3Rha2luZ19mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCB7IGNyZWF0aW9uRmVlIH0gPSBnZXRTdGFraW5nRmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0OAogICAgLy8gaWYgKGNyZWF0aW9uRmVlID4gMCkgewogICAgYnogbmV3UG9vbENvc3RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNDkKICAgIC8vIHJlZmVycmFsTWJyID0gcmVmZXJyYWxGZWUodGhpcy5ha2l0YURBTy52YWx1ZSwgMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjE0OQogICAgLy8gcmVmZXJyYWxNYnIgPSByZWZlcnJhbEZlZSh0aGlzLmFraXRhREFPLnZhbHVlLCAwKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTgxCiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8oYWtpdGFEQU8sIFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1ODIKICAgIC8vIGNvbnN0IHJlZmVycmVyID0gcmVmZXJyZXJPclplcm9BZGRyZXNzKHdhbGxldCkKICAgIGNhbGxzdWIgcmVmZXJyZXJPclplcm9BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU4NAogICAgLy8gaWYgKHJlZmVycmVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IG5ld1Bvb2xDb3N0X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1ODUKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCgpuZXdQb29sQ29zdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNTMtMTU0CiAgICAvLyBjcmVhdGlvbkZlZSArCiAgICAvLyBjaGlsZE1CUiArCiAgICBkdXAKICAgIGRpZyAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2ZhY3RvcnkuYWxnby50czoxNTMtMTU1CiAgICAvLyBjcmVhdGlvbkZlZSArCiAgICAvLyBjaGlsZE1CUiArCiAgICAvLyByZWZlcnJhbE1icgogICAgZGlnIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvZmFjdG9yeS5hbGdvLnRzOjEzNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpuZXdQb29sQ29zdF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ4NwogICAgLy8gbGV0IGNvc3Q6IHVpbnQ2NCA9IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9uc0xlbmd0aCkKICAgIHB1c2hpbnQgNjA2MDAgLy8gNjA2MDAKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9mYWN0b3J5LmFsZ28udHM6MTQ5CiAgICAvLyByZWZlcnJhbE1iciA9IHJlZmVycmFsRmVlKHRoaXMuYWtpdGFEQU8udmFsdWUsIDApCiAgICBiIG5ld1Bvb2xDb3N0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czo6QmFzZVN0YWtpbmdQb29sLm1icltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czoxMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjkKICAgIC8vIHJldHVybiBNaW5Qb29sUmV3YXJkc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIHdpbm5pbmdUaWNrZXRzKQogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy1wb29sL2Jhc2UudHM6MTUtMjEKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGVudHJpZXM6IFBvb2xFbnRyaWVzTUJSLAogICAgLy8gICB1bmlxdWVzOiBQb29sVW5pcXVlc01CUiwKICAgIC8vICAgZW50cmllc0J5QWRkcmVzczogUG9vbEVudHJpZXNCeUFkZHJlc3NNQlIsCiAgICAvLyAgIHJld2FyZHM6IHRoaXMucmV3YXJkc01icih3aW5uaW5nVGlja2V0cyksCiAgICAvLyAgIGRpc2J1cnNlbWVudHM6IFBvb2xEaXNidXJzZW1lbnRTTUJSCiAgICAvLyB9CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDA2MmQ0MDAwMDAwMDAwMDAwNDlkNDAwMDAwMDAwMDAwMDYyZDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjIwCiAgICAvLyBkaXNidXJzZW1lbnRzOiBQb29sRGlzYnVyc2VtZW50U01CUgogICAgcHVzaGludCA2MTAwIC8vIDYxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nLXBvb2wvYmFzZS50czoxNS0yMQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZW50cmllczogUG9vbEVudHJpZXNNQlIsCiAgICAvLyAgIHVuaXF1ZXM6IFBvb2xVbmlxdWVzTUJSLAogICAgLy8gICBlbnRyaWVzQnlBZGRyZXNzOiBQb29sRW50cmllc0J5QWRkcmVzc01CUiwKICAgIC8vICAgcmV3YXJkczogdGhpcy5yZXdhcmRzTWJyKHdpbm5pbmdUaWNrZXRzKSwKICAgIC8vICAgZGlzYnVyc2VtZW50czogUG9vbERpc2J1cnNlbWVudFNNQlIKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmctcG9vbC9iYXNlLnRzOjEzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmluaXRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgNyAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQzCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0NAogICAgLy8gaWYgKCF0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKCmluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQyCiAgICAvLyBpbml0Qm94ZWRDb250cmFjdCh2ZXJzaW9uOiBzdHJpbmcsIHNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgc3dhcAogICAgYm94X3Jlc2l6ZQogICAgYiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmxvYWRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKbG9hZEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1MwogICAgLy8gbG9hZEJveGVkQ29udHJhY3Qob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1NAogICAgLy8gY29uc3QgZXhwZWN0ZWRQcmV2aW91c0NhbGxzOiB1aW50NjQgPSBvZmZzZXQgLyAyMDMyCiAgICBwdXNoaW50IDIwMzIgLy8gMjAzMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTUKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSBleHBlY3RlZFByZXZpb3VzQ2FsbHMgLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny01OQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MAogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkdXAKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjAKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjEKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjEKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICBieiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjYyCiAgICAvLyAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYyCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgLy8gJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTYtNjMKICAgIC8vIGFzc2VydCgoCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAgICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAgICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAgICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gICAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIC8vICAgJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgLy8gKSwgRVJSX0lOVkFMSURfQ0FMTF9PUkRFUikKICAgIGFzc2VydCAvLyBJbnZhbGlkIGNhbGwgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NAogICAgLy8gYXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ29udHJhY3Qgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY1CiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QucmVwbGFjZShvZmZzZXQsIGRhdGEpCiAgICBkaWcgMwogICAgZGlnIDMKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1MwogICAgLy8gbG9hZEJveGVkQ29udHJhY3Qob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBsb2FkQm94ZWRDb250cmFjdF9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmRlbGV0ZUJveGVkQ29udHJhY3Rbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NzAKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2OAogICAgLy8gZGVsZXRlQm94ZWRDb250cmFjdCgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdEluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUwCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUyCiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIGFzc2V0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUyCiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NC0xNjEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU3CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU0LTE2MQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAoMSArIGNvdW50KSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgMwogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTgKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDQKICAgICsKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NC0xNjEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTYzLTE2OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2NQogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2NgogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjMtMTY4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjMtMTY5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3NAogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3NAogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18zIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzQKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCkKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgKwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTcyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlRmVlR2VuZXJhdG9yQ29udHJhY3QudXBkYXRlQWtpdGFEQU9Fc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBT0VzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coYXBwOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzOAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFwcAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coYXBwOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIHB1c2hieXRlcyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTIKICAgIC8vIGFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhcHAgdXBncmFkZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MwogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gbmV3VmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type RootKey = {\n address: string,\n name: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RootKey to the struct representation\n */\nexport function RootKeyFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RootKey, APP_SPEC.structs) as RootKey\n}\n\nexport type StakingPoolMbrData = {\n entries: bigint,\n uniques: bigint,\n entriesByAddress: bigint,\n rewards: bigint,\n disbursements: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakingPoolMBRData to the struct representation\n */\nexport function StakingPoolMbrDataFromTuple(abiTuple: [bigint, bigint, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakingPoolMBRData, APP_SPEC.structs) as StakingPoolMbrData\n}\n\n/**\n * The argument types for the StakingPoolFactory contract\n */\nexport type StakingPoolFactoryArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,string,uint64,uint64)void': {\n version: string\n childVersion: string\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64': {\n payment: AppMethodCallTransactionArgument\n title: string\n type: bigint | number\n marketplace: string\n stakeKey: RootKey\n minimumStakeAmount: bigint | number\n allowLateSignups: boolean\n gateId: bigint | number\n maxEntries: bigint | number\n }\n 'deletePool(uint64)void': {\n appId: bigint | number\n }\n 'newPoolCost()uint64': Record<string, never>\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': {\n winningTickets: bigint | number\n }\n 'initBoxedContract(string,uint64)void': {\n version: string\n size: bigint | number\n }\n 'loadBoxedContract(uint64,byte[])void': {\n offset: bigint | number\n data: Uint8Array\n }\n 'deleteBoxedContract()void': Record<string, never>\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'updateAkitaDAOEscrow(uint64)void': {\n app: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,string,uint64,uint64)void': [version: string, childVersion: string, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64': [payment: AppMethodCallTransactionArgument, title: string, type: bigint | number, marketplace: string, stakeKey: RootKey, minimumStakeAmount: bigint | number, allowLateSignups: boolean, gateId: bigint | number, maxEntries: bigint | number]\n 'deletePool(uint64)void': [appId: bigint | number]\n 'newPoolCost()uint64': []\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': [winningTickets: bigint | number]\n 'initBoxedContract(string,uint64)void': [version: string, size: bigint | number]\n 'loadBoxedContract(uint64,byte[])void': [offset: bigint | number, data: Uint8Array]\n 'deleteBoxedContract()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'updateAkitaDAOEscrow(uint64)void': [app: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type StakingPoolFactoryReturns = {\n 'create(string,string,uint64,uint64)void': void\n 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64': bigint\n 'deletePool(uint64)void': void\n 'newPoolCost()uint64': bigint\n 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)': StakingPoolMbrData\n 'initBoxedContract(string,uint64)void': void\n 'loadBoxedContract(uint64,byte[])void': void\n 'deleteBoxedContract()void': void\n 'optIn(pay,uint64)void': void\n 'optInCost(uint64)uint64': bigint\n 'updateAkitaDAOEscrow(uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the StakingPoolFactory smart contract.\n */\nexport type StakingPoolFactoryTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,string,uint64,uint64)void' | 'create', {\n argsObj: StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']\n returns: StakingPoolFactoryReturns['create(string,string,uint64,uint64)void']\n }>\n & Record<'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64' | 'newPool', {\n argsObj: StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']\n argsTuple: StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']\n returns: StakingPoolFactoryReturns['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']\n }>\n & Record<'deletePool(uint64)void' | 'deletePool', {\n argsObj: StakingPoolFactoryArgs['obj']['deletePool(uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']\n returns: StakingPoolFactoryReturns['deletePool(uint64)void']\n }>\n & Record<'newPoolCost()uint64' | 'newPoolCost', {\n argsObj: StakingPoolFactoryArgs['obj']['newPoolCost()uint64']\n argsTuple: StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']\n returns: StakingPoolFactoryReturns['newPoolCost()uint64']\n }>\n & Record<'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' | 'mbr', {\n argsObj: StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n argsTuple: StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n /**\n * the mbr created for each boxmap entry\n */\n returns: StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }>\n & Record<'initBoxedContract(string,uint64)void' | 'initBoxedContract', {\n argsObj: StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']\n returns: StakingPoolFactoryReturns['initBoxedContract(string,uint64)void']\n }>\n & Record<'loadBoxedContract(uint64,byte[])void' | 'loadBoxedContract', {\n argsObj: StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void']\n argsTuple: StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']\n returns: StakingPoolFactoryReturns['loadBoxedContract(uint64,byte[])void']\n }>\n & Record<'deleteBoxedContract()void' | 'deleteBoxedContract', {\n argsObj: StakingPoolFactoryArgs['obj']['deleteBoxedContract()void']\n argsTuple: StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']\n returns: StakingPoolFactoryReturns['deleteBoxedContract()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']\n returns: StakingPoolFactoryReturns['optIn(pay,uint64)void']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64']\n argsTuple: StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']\n returns: StakingPoolFactoryReturns['optInCost(uint64)uint64']\n }>\n & Record<'updateAkitaDAOEscrow(uint64)void' | 'updateAkitaDAOEscrow', {\n argsObj: StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']\n returns: StakingPoolFactoryReturns['updateAkitaDAOEscrow(uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: StakingPoolFactoryArgs['obj']['update(string)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['update(string)void']\n returns: StakingPoolFactoryReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: StakingPoolFactoryReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: StakingPoolFactoryArgs['obj']['opUp()void']\n argsTuple: StakingPoolFactoryArgs['tuple']['opUp()void']\n returns: StakingPoolFactoryReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the current version of the child contract\n */\n childContractVersion: string\n /**\n * the app ID for the akita DAO escrow to use\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {\n boxedContract: BinaryState\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type StakingPoolFactorySignatures = keyof StakingPoolFactoryTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type StakingPoolFactoryNonVoidMethodSignatures = keyof StakingPoolFactoryTypes['methods'] extends infer T ? T extends keyof StakingPoolFactoryTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the StakingPoolFactory smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends StakingPoolFactorySignatures> = StakingPoolFactoryTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the StakingPoolFactory smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends StakingPoolFactorySignatures> = StakingPoolFactoryTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = StakingPoolFactoryTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = StakingPoolFactoryTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type StakingPoolFactoryCreateCallParams =\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create(string,string,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type StakingPoolFactoryUpdateCallParams =\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type StakingPoolFactoryDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * 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)\n */\n createParams?: StakingPoolFactoryCreateCallParams\n /**\n * Update 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)\n */\n updateParams?: StakingPoolFactoryUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the StakingPoolFactory smart contract\n */\nexport abstract class StakingPoolFactoryParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends StakingPoolFactoryCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,string,uint64,uint64)void':\n return StakingPoolFactoryParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the StakingPoolFactory smart contract using the create(string,string,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,string,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends StakingPoolFactoryUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return StakingPoolFactoryParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the StakingPoolFactory smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static newPool(params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.title, params.args.type, params.args.marketplace, params.args.stakeKey, params.args.minimumStakeAmount, params.args.allowLateSignups, params.args.gateId, params.args.maxEntries],\n }\n }\n /**\n * Constructs a no op call for the deletePool(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deletePool(params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deletePool(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.appId],\n }\n }\n /**\n * Constructs a no op call for the newPoolCost()uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static newPoolCost(params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'newPoolCost()uint64' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr(uint64)(uint64,uint64,uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.winningTickets],\n }\n }\n /**\n * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static initBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'initBoxedContract(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size],\n }\n }\n /**\n * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static loadBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'loadBoxedContract(uint64,byte[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data],\n }\n }\n /**\n * Constructs a no op call for the deleteBoxedContract()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteBoxedContract()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.app],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the StakingPoolFactory smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class StakingPoolFactoryFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `StakingPoolFactoryFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new StakingPoolFactoryClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new StakingPoolFactoryClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the StakingPoolFactory smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: StakingPoolFactoryDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? StakingPoolFactoryParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (StakingPoolFactoryCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? StakingPoolFactoryParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (StakingPoolFactoryUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new StakingPoolFactoryClient(result.appClient) }\n }\n\n /**\n * 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.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPoolFactory smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(StakingPoolFactoryParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(StakingPoolFactoryParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPoolFactory smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(StakingPoolFactoryParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the StakingPoolFactory smart contract using an ABI method call using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<StakingPoolFactoryArgs['obj']['create(string,string,uint64,uint64)void'] | StakingPoolFactoryArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(StakingPoolFactoryParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | StakingPoolFactoryReturns['create(string,string,uint64,uint64)void']) }, appClient: new StakingPoolFactoryClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the StakingPoolFactory smart contract\n */\nexport class StakingPoolFactoryClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `StakingPoolFactoryClient`\n *\n * @param appClient An `AppClient` instance which has been created with the StakingPoolFactory app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `StakingPoolFactoryClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends StakingPoolFactoryNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `StakingPoolFactoryClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<StakingPoolFactoryClient> {\n return new StakingPoolFactoryClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `StakingPoolFactoryClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<StakingPoolFactoryClient> {\n return new StakingPoolFactoryClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(StakingPoolFactoryParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n newPool: (params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.newPool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deletePool(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deletePool: (params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.deletePool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n newPoolCost: (params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n initBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n loadBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingPoolFactoryParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(StakingPoolFactoryParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n newPool: (params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.newPool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deletePool(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deletePool: (params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.deletePool(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n newPoolCost: (params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: the mbr created for each boxmap entry\n */\n mbr: (params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n initBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n loadBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteBoxedContract: (params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingPoolFactoryParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(StakingPoolFactoryParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n newPool: async (params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.newPool(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deletePool(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deletePool: async (params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.deletePool(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['deletePool(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n newPoolCost: async (params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['newPoolCost()uint64'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n mbr: async (params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n initBoxedContract: async (params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.initBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['initBoxedContract(string,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n loadBoxedContract: async (params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.loadBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['loadBoxedContract(uint64,byte[])void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteBoxedContract: async (params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.deleteBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['deleteBoxedContract()void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['updateAkitaDAOEscrow(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the StakingPoolFactory smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | StakingPoolFactoryReturns['opUp()void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new StakingPoolFactoryClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPoolFactory smart contract using the `newPoolCost()uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async newPoolCost(params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> = {args: []}) {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.newPoolCost(params))\n return result.return as unknown as StakingPoolFactoryReturns['newPoolCost()uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPoolFactory smart contract using the `mbr(uint64)(uint64,uint64,uint64,uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result: the mbr created for each boxmap entry\n */\n async mbr(params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.mbr(params))\n return result.return as unknown as StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the StakingPoolFactory smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingPoolFactoryParamsFactory.optInCost(params))\n return result.return as unknown as StakingPoolFactoryReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Methods to access state for the current StakingPoolFactory app\n */\n state = {\n /**\n * Methods to access global state for the current StakingPoolFactory app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n childContractVersion: result.childContractVersion,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the childContractVersion key in global state\n */\n childContractVersion: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"childContractVersion\")) as string | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current StakingPoolFactory app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n boxedContract: new BinaryStateValue(result.boxedContract),\n }\n },\n /**\n * Get the current value of the boxedContract key in box state\n */\n boxedContract: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.box.getValue(\"boxedContract\")) as Uint8Array | undefined) },\n },\n }\n\n public newGroup(): StakingPoolFactoryComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64 method call against the StakingPoolFactory contract\n */\n newPool(params: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.newPool(params)))\n resultMappers.push((v) => client.decodeReturnValue('newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64', v))\n return this\n },\n /**\n * Add a deletePool(uint64)void method call against the StakingPoolFactory contract\n */\n deletePool(params: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deletePool(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a newPoolCost()uint64 method call against the StakingPoolFactory contract\n */\n newPoolCost(params: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.newPoolCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('newPoolCost()uint64', v))\n return this\n },\n /**\n * Add a mbr(uint64)(uint64,uint64,uint64,uint64,uint64) method call against the StakingPoolFactory contract\n */\n mbr(params: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n resultMappers.push((v) => client.decodeReturnValue('mbr(uint64)(uint64,uint64,uint64,uint64,uint64)', v))\n return this\n },\n /**\n * Add a initBoxedContract(string,uint64)void method call against the StakingPoolFactory contract\n */\n initBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a loadBoxedContract(uint64,byte[])void method call against the StakingPoolFactory contract\n */\n loadBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteBoxedContract()void method call against the StakingPoolFactory contract\n */\n deleteBoxedContract(params: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the StakingPoolFactory contract\n */\n optIn(params: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the StakingPoolFactory contract\n */\n optInCost(params: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost(uint64)uint64', v))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow(uint64)void method call against the StakingPoolFactory contract\n */\n updateAkitaDaoEscrow(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the StakingPoolFactory contract\n */\n updateAkitaDao(params: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a opUp()void method call against the StakingPoolFactory contract\n */\n opUp(params: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n get update() {\n return {\n update: (params: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the StakingPoolFactory contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as StakingPoolFactoryComposer\n }\n}\nexport type StakingPoolFactoryComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n newPool(params?: CallParams<StakingPoolFactoryArgs['obj']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | StakingPoolFactoryArgs['tuple']['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'] | undefined]>\n\n /**\n * Calls the deletePool(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deletePool(params?: CallParams<StakingPoolFactoryArgs['obj']['deletePool(uint64)void'] | StakingPoolFactoryArgs['tuple']['deletePool(uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['deletePool(uint64)void'] | undefined]>\n\n /**\n * Calls the newPoolCost()uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n newPoolCost(params?: CallParams<StakingPoolFactoryArgs['obj']['newPoolCost()uint64'] | StakingPoolFactoryArgs['tuple']['newPoolCost()uint64']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['newPoolCost()uint64'] | undefined]>\n\n /**\n * Calls the mbr(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<StakingPoolFactoryArgs['obj']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | StakingPoolFactoryArgs['tuple']['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Calls the initBoxedContract(string,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n initBoxedContract(params?: CallParams<StakingPoolFactoryArgs['obj']['initBoxedContract(string,uint64)void'] | StakingPoolFactoryArgs['tuple']['initBoxedContract(string,uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['initBoxedContract(string,uint64)void'] | undefined]>\n\n /**\n * Calls the loadBoxedContract(uint64,byte[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n loadBoxedContract(params?: CallParams<StakingPoolFactoryArgs['obj']['loadBoxedContract(uint64,byte[])void'] | StakingPoolFactoryArgs['tuple']['loadBoxedContract(uint64,byte[])void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['loadBoxedContract(uint64,byte[])void'] | undefined]>\n\n /**\n * Calls the deleteBoxedContract()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteBoxedContract(params?: CallParams<StakingPoolFactoryArgs['obj']['deleteBoxedContract()void'] | StakingPoolFactoryArgs['tuple']['deleteBoxedContract()void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['deleteBoxedContract()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<StakingPoolFactoryArgs['obj']['optIn(pay,uint64)void'] | StakingPoolFactoryArgs['tuple']['optIn(pay,uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<StakingPoolFactoryArgs['obj']['optInCost(uint64)uint64'] | StakingPoolFactoryArgs['tuple']['optInCost(uint64)uint64']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAOEscrow(uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['updateAkitaDAOEscrow(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<StakingPoolFactoryArgs['obj']['updateAkitaDAO(uint64)void'] | StakingPoolFactoryArgs['tuple']['updateAkitaDAO(uint64)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<StakingPoolFactoryArgs['obj']['opUp()void'] | StakingPoolFactoryArgs['tuple']['opUp()void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['opUp()void'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the StakingPoolFactory smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<StakingPoolFactoryArgs['obj']['update(string)void'] | StakingPoolFactoryArgs['tuple']['update(string)void']>): StakingPoolFactoryComposer<[...TReturns, StakingPoolFactoryReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the StakingPoolFactory smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): StakingPoolFactoryComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): StakingPoolFactoryComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<StakingPoolFactoryComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<StakingPoolFactoryComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<StakingPoolFactoryComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<StakingPoolFactoryComposerResults<TReturns>>\n}\nexport type StakingPoolFactoryComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { StakingPoolFactoryArgs, StakingPoolFactoryClient, StakingPoolFactoryFactory } from '../generated/StakingPoolFactoryClient'\nimport { MaybeSigner, NewContractSDKParams } from '../types';\nimport { StakingPoolSDK } from './index';\nimport { BaseSDK } from '../base';\nimport { ENV_VAR_NAMES } from '../config';\nimport { emptySigner } from '../constants';\nimport { microAlgo, microAlgos } from '@algorandfoundation/algokit-utils';\nimport { NewPoolParams, DeletePoolParams, StakingPoolMbrParams } from './types';\nimport { StakingPoolMbrData } from '../generated/StakingPoolClient';\n\nexport type StakingPoolFactoryContractArgs = StakingPoolFactoryArgs[\"obj\"];\n\n/**\n * SDK for interacting with the Staking Pool Factory contract.\n * Used to create new staking pools and manage pool templates.\n */\nexport class StakingPoolFactorySDK extends BaseSDK<StakingPoolFactoryClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: StakingPoolFactoryFactory, ...params }, ENV_VAR_NAMES.STAKING_POOL_FACTORY_APP_ID);\n }\n\n /**\n * Creates a new staking pool via the factory and returns a StakingPoolSDK instance.\n * @returns StakingPoolSDK for the newly created pool\n */\n async new({\n sender,\n signer,\n title,\n type,\n marketplace,\n stakeKey,\n minimumStakeAmount,\n allowLateSignups = false,\n gateId = 0n,\n maxEntries = 0n\n }: NewPoolParams): Promise<StakingPoolSDK> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const poolCost = await this.cost();\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(poolCost),\n receiver: this.client.appAddress,\n });\n\n const group = this.client.newGroup();\n\n group.newPool({\n ...sendParams,\n args: {\n payment,\n title,\n type,\n marketplace,\n stakeKey,\n minimumStakeAmount,\n allowLateSignups,\n gateId,\n maxEntries\n }\n });\n\n // Add opUp calls to get more reference slots for impact/social contract calls\n group.opUp({\n ...sendParams,\n args: {},\n maxFee: microAlgos(1_000),\n });\n group.opUp({\n ...sendParams,\n args: {},\n maxFee: microAlgos(1_000),\n note: '1'\n });\n\n const result = await group.send({ populateAppCallResources: true, coverAppCallInnerTransactionFees: true });\n \n // Extract appId from the newPool call result\n const appId = result.returns[0] as bigint | undefined;\n\n if (appId === undefined) {\n throw new Error('Failed to create new staking pool');\n }\n\n return new StakingPoolSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: sendParams.sender,\n defaultSigner: sendParams.signer\n }\n });\n }\n\n /**\n * Gets a StakingPoolSDK instance for an existing pool.\n * Note: Cannot be static as it requires instance properties (algorand, sendParams).\n * @param appId - The app ID of the pool\n * @returns StakingPoolSDK for the specified pool\n */\n get({ appId }: { appId: bigint }): StakingPoolSDK {\n return new StakingPoolSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: this.sendParams.sender,\n defaultSigner: this.sendParams.signer\n }\n });\n }\n\n /**\n * Gets the cost to create a new staking pool.\n */\n async cost(params?: MaybeSigner): Promise<bigint> {\n\n const sendParams = this.getSendParams({\n sender: this.readerAccount,\n signer: emptySigner,\n ...params\n });\n\n const cost = await this.client.newPoolCost({\n ...sendParams,\n args: {}\n });\n\n return cost;\n }\n\n /**\n * Deletes a pool created by this factory.\n */\n async deletePool({ sender, signer, appId }: DeletePoolParams): Promise<void> {\n\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.deletePool({\n ...sendParams,\n args: { appId }\n });\n }\n\n /**\n * Gets MBR (Minimum Balance Requirement) data for pool operations.\n */\n async getMbr({ winningTickets }: StakingPoolMbrParams): Promise<StakingPoolMbrData> {\n return await this.client.mbr({ args: { winningTickets } });\n }\n}\n\n/**\n * Convenience function to create a new staking pool and return the SDK.\n * Creates a factory SDK, creates the pool, and returns the pool SDK.\n */\nexport async function newStakingPool({\n factoryParams,\n algorand,\n readerAccount,\n sendParams,\n ...poolParams\n}: NewContractSDKParams & NewPoolParams): Promise<StakingPoolSDK> {\n const factory = new StakingPoolFactorySDK({ factoryParams, algorand, readerAccount, sendParams });\n return await factory.new(poolParams);\n}","import { MaybeSigner } from \"../types\";\nimport {\n StakingPoolArgs,\n StakingPoolState,\n Reward,\n RootKey,\n FunderInfo,\n StakingPoolMbrData,\n EntryData\n} from '../generated/StakingPoolClient';\nimport { StakingPoolFactoryArgs } from '../generated/StakingPoolFactoryClient';\nimport { AppCallMethodCall } from \"@algorandfoundation/algokit-utils/types/composer\";\n\n// Re-export types from generated clients for convenience\nexport { StakingPoolState, Reward, RootKey, FunderInfo, StakingPoolMbrData, EntryData };\n\n// Pool Factory Types\ntype FactoryContractArgs = StakingPoolFactoryArgs[\"obj\"];\n\nexport type NewPoolParams = MaybeSigner & Omit<FactoryContractArgs['newPool(pay,string,uint8,address,(address,string),uint64,bool,uint64,uint64)uint64'], 'payment'>;\n\nexport type DeletePoolParams = MaybeSigner & FactoryContractArgs['deletePool(uint64)void'];\n\n// Individual Pool Types \ntype PoolContractArgs = StakingPoolArgs[\"obj\"];\n\nexport type AddRewardParams = MaybeSigner & Omit<PoolContractArgs['addReward(pay,(uint64,uint8,uint64,uint64,uint64,uint64))void'], 'payment'>;\n\nexport type AddRewardAsaParams = MaybeSigner & Omit<PoolContractArgs['addRewardAsa(pay,axfer,(uint64,uint8,uint64,uint64,uint64,uint64))void'], 'payment' | 'assetXfer'> & {\n /** the asset ID of the reward */\n asset: bigint;\n /** The amount of the asset to transfer for the reward */\n amount: bigint;\n};\n\nexport type FinalizePoolParams = MaybeSigner & PoolContractArgs['finalize(uint64,uint64,uint64)void'];\n\nexport type Entry = {\n /** The asset ID being staked */\n asset: bigint | number;\n /** The amount being entered */\n amount: bigint | number;\n /** Optional merkle proofs for gated entry */\n proofs?: Uint8Array[];\n};\n\nexport type EnterPoolParams = MaybeSigner & {\n /** Array of entries (asset, amount, optional proofs) */\n entries: Entry[];\n /** Optional additional arguments for gated entry */\n gateTxn?: AppCallMethodCall\n};\n\nexport type StartDisbursementParams = MaybeSigner & PoolContractArgs['startDisbursement(uint64)void'];\n\nexport type RaffleParams = MaybeSigner & PoolContractArgs['raffle(uint64)void'];\n\nexport type DisburseRewardsParams = MaybeSigner & PoolContractArgs['disburseRewards(uint64,uint64)void'];\n\nexport type FinalizeDistributionParams = MaybeSigner & PoolContractArgs['finalizeDistribution(uint64)void'];\n\nexport type OptinAssetParams = MaybeSigner & Omit<PoolContractArgs['optIn(pay,uint64)void'], 'payment'>;\n\nexport type CheckParams = PoolContractArgs['check(address,uint64)(bool,uint64)'];\n\nexport type GateCheckParams = PoolContractArgs['gateCheck(appl,address,uint64)void'];\n\nexport type CheckResult = {\n isEligible: boolean;\n stake: bigint;\n};\n\nexport type IsEnteredParams = PoolContractArgs['isEntered(address)bool'];\n\nexport type StakingPoolMbrParams = PoolContractArgs['mbr(uint64)(uint64,uint64,uint64,uint64,uint64)'];\n\n\nexport enum PoolStatus {\n Draft = 0,\n Final = 10\n}\n\nexport enum StakingPoolStakingType {\n NONE = 0,\n HEARTBEAT = 10,\n SOFT = 20,\n HARD = 30,\n LOCK = 40\n}\n\nexport enum DistributionType {\n Percentage = 10,\n Flat = 20,\n Even = 30,\n Shuffle = 40,\n}\n\nexport enum DisbursementPhase {\n Idle = 0,\n Preparation = 10,\n Allocation = 20,\n Finalization = 30\n}"]}