@akta/sdk 1.2.0 → 1.2.1

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-2AR3LS5J.mjs → chunk-2IK5OE34.mjs} +46 -46
  4. package/dist/{chunk-2AR3LS5J.mjs.map → chunk-2IK5OE34.mjs.map} +1 -1
  5. package/dist/{chunk-JMZYQMSW.mjs → chunk-3HDKN6SU.mjs} +3 -3
  6. package/dist/{chunk-MDSBD67B.js → chunk-5DOZLI4E.js} +6 -6
  7. package/dist/{chunk-MDSBD67B.js.map → chunk-5DOZLI4E.js.map} +1 -1
  8. package/dist/{chunk-GRR6MUNV.mjs → chunk-7B56R4BA.mjs} +3 -3
  9. package/dist/{chunk-JPV3DVL6.js → chunk-7WAUQIOJ.js} +10 -10
  10. package/dist/{chunk-JPV3DVL6.js.map → chunk-7WAUQIOJ.js.map} +1 -1
  11. package/dist/{chunk-IERRX2GS.mjs → chunk-BHROMBMA.mjs} +3 -3
  12. package/dist/{chunk-NANBUL67.mjs → chunk-CQJ6LHOR.mjs} +2 -2
  13. package/dist/{chunk-AXS7YUII.js → chunk-CXAUWVM5.js} +10 -10
  14. package/dist/{chunk-AXS7YUII.js.map → chunk-CXAUWVM5.js.map} +1 -1
  15. package/dist/{chunk-CPU7YHCB.mjs → chunk-CYOHVDRG.mjs} +2 -2
  16. package/dist/{chunk-HIDVSX3C.js → chunk-D4XTMODR.js} +7 -7
  17. package/dist/{chunk-HIDVSX3C.js.map → chunk-D4XTMODR.js.map} +1 -1
  18. package/dist/{chunk-76JFN4TN.js → chunk-DHVNQVI2.js} +6 -6
  19. package/dist/{chunk-76JFN4TN.js.map → chunk-DHVNQVI2.js.map} +1 -1
  20. package/dist/{chunk-YHMGRIY5.js → chunk-DQDDJ4ZC.js} +8 -8
  21. package/dist/{chunk-YHMGRIY5.js.map → chunk-DQDDJ4ZC.js.map} +1 -1
  22. package/dist/{chunk-FZXOT7SC.mjs → chunk-DZ2XEIUD.mjs} +3 -3
  23. package/dist/{chunk-VL2UI54Z.js → chunk-EKVXWEKM.js} +5 -5
  24. package/dist/{chunk-VL2UI54Z.js.map → chunk-EKVXWEKM.js.map} +1 -1
  25. package/dist/{chunk-HT2LVEDG.js → chunk-EN3NMZTZ.js} +5 -5
  26. package/dist/{chunk-HT2LVEDG.js.map → chunk-EN3NMZTZ.js.map} +1 -1
  27. package/dist/{chunk-KPXE4SEJ.mjs → chunk-FN4KP7BF.mjs} +2 -2
  28. package/dist/{chunk-5M6DY6Q7.js → chunk-HL5RPBTV.js} +7 -7
  29. package/dist/{chunk-5M6DY6Q7.js.map → chunk-HL5RPBTV.js.map} +1 -1
  30. package/dist/{chunk-GVPFBZMF.js → chunk-IQNHMEBU.js} +5 -5
  31. package/dist/{chunk-GVPFBZMF.js.map → chunk-IQNHMEBU.js.map} +1 -1
  32. package/dist/{chunk-2WOYNNPV.js → chunk-JVDYFC2I.js} +10 -10
  33. package/dist/chunk-JVDYFC2I.js.map +1 -0
  34. package/dist/{chunk-FQEKBA3B.js → chunk-KOIJBMJ4.js} +5 -5
  35. package/dist/{chunk-FQEKBA3B.js.map → chunk-KOIJBMJ4.js.map} +1 -1
  36. package/dist/{chunk-SQH64QTI.js → chunk-KYS36RDW.js} +4 -4
  37. package/dist/{chunk-SQH64QTI.js.map → chunk-KYS36RDW.js.map} +1 -1
  38. package/dist/{chunk-4ANINCSI.mjs → chunk-MUB6HBXP.mjs} +3 -3
  39. package/dist/{chunk-LYG4MDFV.js → chunk-N6N2BC4G.js} +6 -6
  40. package/dist/{chunk-LYG4MDFV.js.map → chunk-N6N2BC4G.js.map} +1 -1
  41. package/dist/{chunk-SGXO2K4C.mjs → chunk-NAP3G7WD.mjs} +3 -3
  42. package/dist/{chunk-VVRQI5IY.mjs → chunk-NCQEI6CL.mjs} +4 -4
  43. package/dist/{chunk-6MGMITC7.mjs → chunk-OUMHZXXI.mjs} +3 -3
  44. package/dist/{chunk-6PHYDWAI.mjs → chunk-PG2Z5IIV.mjs} +3 -3
  45. package/dist/{chunk-IWPVSICN.mjs → chunk-QUYFRKB4.mjs} +3 -3
  46. package/dist/{chunk-OYSHMZRR.mjs → chunk-QYWJHQ4Z.mjs} +4 -4
  47. package/dist/{chunk-MOHS2K45.mjs → chunk-TTL5K6WT.mjs} +3 -3
  48. package/dist/{chunk-V2TNS6B5.js → chunk-UPERFS3H.js} +8 -8
  49. package/dist/{chunk-V2TNS6B5.js.map → chunk-UPERFS3H.js.map} +1 -1
  50. package/dist/{chunk-UWAIIBII.js → chunk-UQLL4RRM.js} +46 -46
  51. package/dist/{chunk-UWAIIBII.js.map → chunk-UQLL4RRM.js.map} +1 -1
  52. package/dist/{chunk-TQADXRCE.mjs → chunk-V42UWD75.mjs} +4 -4
  53. package/dist/{chunk-B3ANVNAW.js → chunk-XUS7H5EP.js} +31 -31
  54. package/dist/{chunk-B3ANVNAW.js.map → chunk-XUS7H5EP.js.map} +1 -1
  55. package/dist/{chunk-HHXP4XDJ.js → chunk-ZNI6TQWD.js} +5 -5
  56. package/dist/{chunk-HHXP4XDJ.js.map → chunk-ZNI6TQWD.js.map} +1 -1
  57. package/dist/{chunk-XNWIPDFE.mjs → chunk-ZRQA3AH7.mjs} +6 -6
  58. package/dist/chunk-ZRQA3AH7.mjs.map +1 -0
  59. package/dist/dao/index.js +5 -5
  60. package/dist/dao/index.mjs +4 -4
  61. package/dist/dao-deployable/index.js +7 -7
  62. package/dist/dao-deployable/index.mjs +4 -4
  63. package/dist/escrow/index.js +4 -4
  64. package/dist/escrow/index.mjs +3 -3
  65. package/dist/gates/index.js +4 -4
  66. package/dist/gates/index.mjs +3 -3
  67. package/dist/hyper-swap/index.js +4 -4
  68. package/dist/hyper-swap/index.mjs +3 -3
  69. package/dist/index.js +19 -19
  70. package/dist/index.mjs +18 -18
  71. package/dist/marketplace/index.js +5 -5
  72. package/dist/marketplace/index.mjs +4 -4
  73. package/dist/meta-merkles/index.js +4 -4
  74. package/dist/meta-merkles/index.mjs +3 -3
  75. package/dist/networks.d.ts +1 -1
  76. package/dist/poll/index.js +4 -4
  77. package/dist/poll/index.mjs +3 -3
  78. package/dist/prize-box/index.js +4 -4
  79. package/dist/prize-box/index.mjs +3 -3
  80. package/dist/raffle/index.js +5 -5
  81. package/dist/raffle/index.mjs +4 -4
  82. package/dist/rewards/index.js +4 -4
  83. package/dist/rewards/index.mjs +3 -3
  84. package/dist/social/index.js +3 -3
  85. package/dist/social/index.mjs +2 -2
  86. package/dist/staking/index.js +4 -4
  87. package/dist/staking/index.mjs +3 -3
  88. package/dist/staking-pool/index.js +4 -4
  89. package/dist/staking-pool/index.mjs +3 -3
  90. package/dist/subscriptions/index.js +4 -4
  91. package/dist/subscriptions/index.mjs +3 -3
  92. package/dist/wallet/index.js +4 -4
  93. package/dist/wallet/index.mjs +3 -3
  94. package/package.json +1 -1
  95. package/dist/chunk-2WOYNNPV.js.map +0 -1
  96. package/dist/chunk-XNWIPDFE.mjs.map +0 -1
  97. /package/dist/{chunk-JMZYQMSW.mjs.map → chunk-3HDKN6SU.mjs.map} +0 -0
  98. /package/dist/{chunk-GRR6MUNV.mjs.map → chunk-7B56R4BA.mjs.map} +0 -0
  99. /package/dist/{chunk-IERRX2GS.mjs.map → chunk-BHROMBMA.mjs.map} +0 -0
  100. /package/dist/{chunk-NANBUL67.mjs.map → chunk-CQJ6LHOR.mjs.map} +0 -0
  101. /package/dist/{chunk-CPU7YHCB.mjs.map → chunk-CYOHVDRG.mjs.map} +0 -0
  102. /package/dist/{chunk-FZXOT7SC.mjs.map → chunk-DZ2XEIUD.mjs.map} +0 -0
  103. /package/dist/{chunk-KPXE4SEJ.mjs.map → chunk-FN4KP7BF.mjs.map} +0 -0
  104. /package/dist/{chunk-4ANINCSI.mjs.map → chunk-MUB6HBXP.mjs.map} +0 -0
  105. /package/dist/{chunk-SGXO2K4C.mjs.map → chunk-NAP3G7WD.mjs.map} +0 -0
  106. /package/dist/{chunk-VVRQI5IY.mjs.map → chunk-NCQEI6CL.mjs.map} +0 -0
  107. /package/dist/{chunk-6MGMITC7.mjs.map → chunk-OUMHZXXI.mjs.map} +0 -0
  108. /package/dist/{chunk-6PHYDWAI.mjs.map → chunk-PG2Z5IIV.mjs.map} +0 -0
  109. /package/dist/{chunk-IWPVSICN.mjs.map → chunk-QUYFRKB4.mjs.map} +0 -0
  110. /package/dist/{chunk-OYSHMZRR.mjs.map → chunk-QYWJHQ4Z.mjs.map} +0 -0
  111. /package/dist/{chunk-MOHS2K45.mjs.map → chunk-TTL5K6WT.mjs.map} +0 -0
  112. /package/dist/{chunk-TQADXRCE.mjs.map → chunk-V42UWD75.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-FQEKBA3B.js","../src/staking/index.ts","../src/generated/StakingClient.ts","../src/staking/types.ts"],"names":["StakingType"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-FQEKBA3B.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n StakingClient, \n StakingFactory,\n Stake,\n Escrow,\n StakeCheck,\n TotalsInfo\n} from '../generated/StakingClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n StakeArgs,\n WithdrawArgs,\n CreateHeartbeatArgs,\n UpdateSettingsArgs,\n SoftCheckArgs,\n GetTimeLeftArgs,\n GetInfoArgs,\n GetEscrowInfoArgs,\n GetHeartbeatArgs,\n GetHeartbeatAverageArgs,\n GetInfoListArgs,\n StakeCheckArgs,\n HeartbeatEntry,\n StakingType,\n StakeInfo,\n AssetCheck,\n OptInArgs\n} from \"./types\";\nimport { AlgoAmount } from \"@algorandfoundation/algokit-utils/types/amount\";\nimport { AppReturn } from \"@algorandfoundation/algokit-utils/types/app\";\n\nexport * from './types';\n\n/**\n * SDK for interacting with the global Staking contract.\n * Handles all staking operations including soft, hard, lock, and heartbeat staking.\n */\nexport class StakingSDK extends BaseSDK<StakingClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: StakingFactory, ...params }, ENV_VAR_NAMES.STAKING_APP_ID);\n }\n\n async softCheck({ address, asset }: SoftCheckArgs): Promise<StakeCheck> {\n const { return: result } = await this.client.send.softCheck({ \n args: { address, asset } \n });\n\n if (result === undefined) {\n throw new Error('Failed to perform soft check');\n }\n\n return result\n }\n\n async getTimeLeft({ address, asset }: GetTimeLeftArgs): Promise<bigint> {\n const { return: timeLeft } = await this.client.send.getTimeLeft({ \n args: { address, asset } \n });\n return timeLeft ?? 0n;\n }\n\n async mustGetTimeLeft({ address, asset }: GetTimeLeftArgs): Promise<bigint> {\n const { return: timeLeft } = await this.client.send.mustGetTimeLeft({ \n args: { address, asset } \n });\n\n if (timeLeft === undefined) {\n throw new Error('No active stake found');\n }\n\n return timeLeft;\n }\n\n /**\n * Gets stake info for an address and stake type.\n * Returns undefined if no stake exists.\n */\n async getInfo({ address, stake }: GetInfoArgs): Promise<Stake> {\n return await this.client.getInfo({ \n args: { address, stake } \n });\n }\n\n /**\n * Gets stake info for an address and stake type.\n * Throws if no stake exists.\n */\n async mustGetInfo({ address, stake }: GetInfoArgs): Promise<Stake> {\n const { return: info } = await this.client.send.mustGetInfo({ \n args: { address, stake } \n });\n\n if (info === undefined) {\n throw new Error('No stake info found');\n }\n\n return info;\n }\n\n /**\n * Gets escrow info for an address and asset.\n */\n async getEscrowInfo({ address, asset }: GetEscrowInfoArgs): Promise<Escrow | undefined> {\n const { return: info } = await this.client.send.getEscrowInfo({ \n args: { address, asset } \n });\n return info;\n }\n\n /**\n * Gets heartbeat data for an address and asset.\n * Returns an array of heartbeat entries.\n */\n async getHeartbeat({ address, asset }: GetHeartbeatArgs): Promise<HeartbeatEntry[]> {\n const { return: heartbeats } = await this.client.send.getHeartbeat({ \n args: { address, asset } \n });\n\n if (!heartbeats) {\n return [];\n }\n\n return heartbeats.map(([timestamp, balance, escrowed, average]) => ({\n timestamp,\n balance,\n escrowed,\n average\n }));\n }\n\n /**\n * Gets heartbeat data for an address and asset.\n * Throws if no heartbeat exists.\n */\n async mustGetHeartbeat({ address, asset }: GetHeartbeatArgs): Promise<HeartbeatEntry[]> {\n const { return: heartbeats } = await this.client.send.mustGetHeartbeat({ \n args: { address, asset } \n });\n\n if (heartbeats === undefined) {\n throw new Error('No heartbeat found');\n }\n\n return heartbeats.map(([timestamp, balance, escrowed, average]) => ({\n timestamp,\n balance,\n escrowed,\n average\n }));\n }\n\n /**\n * Gets the average heartbeat value for an address and asset.\n */\n async getHeartbeatAverage({ address, asset, includeEscrowed }: GetHeartbeatAverageArgs): Promise<bigint> {\n const { return: average } = await this.client.send.getHeartbeatAverage({ \n args: { address, asset, includeEscrowed } \n });\n return average ?? 0n;\n }\n\n /**\n * Gets the average heartbeat value for an address and asset.\n * Throws if no heartbeat exists.\n */\n async mustGetHeartbeatAverage({ address, asset, includeEscrowed }: GetHeartbeatAverageArgs): Promise<bigint> {\n const { return: average } = await this.client.send.mustGetHeartbeatAverage({ \n args: { address, asset, includeEscrowed } \n });\n\n if (average === undefined) {\n throw new Error('No heartbeat average found');\n }\n\n return average;\n }\n\n /**\n * Gets stake info for multiple assets at once.\n */\n async getInfoList({ address, type, assets }: GetInfoListArgs): Promise<Stake[]> {\n const { return: infoList } = await this.client.send.getInfoList({ \n args: { address, type, assets } \n });\n\n if (!infoList) {\n return [];\n }\n\n return infoList.map(([amount, lastUpdate, expiration]) => ({\n amount,\n lastUpdate,\n expiration\n }));\n }\n\n /**\n * Gets stake info for multiple assets at once.\n * Throws if any stake doesn't exist.\n */\n async mustGetInfoList({ address, type, assets }: GetInfoListArgs): Promise<Stake[]> {\n const { return: infoList } = await this.client.send.mustGetInfoList({ \n args: { address, type, assets } \n });\n\n if (infoList === undefined) {\n throw new Error('Failed to get info list');\n }\n\n return infoList.map(([amount, lastUpdate, expiration]) => ({\n amount,\n lastUpdate,\n expiration\n }));\n }\n\n async stakeCheck({ \n address, \n checks,\n type, \n includeEscrowed \n }: { \n address: string; \n checks: AssetCheck[];\n type: StakingType;\n includeEscrowed: boolean;\n }): Promise<boolean> {\n\n const formattedChecks: [bigint | number, bigint | number][] = checks.map(r => [\n r.asset,\n r.amount\n ]);\n\n return await this.client.stakeCheck({ \n args: { \n address,\n checks: formattedChecks,\n type,\n includeEscrowed\n } \n });\n }\n\n /**\n * Stakes an asset in the staking contract.\n * @param type - The staking type (Heartbeat, Soft, Hard, Lock)\n * @param asset - The asset ID to stake\n * @param amount - The amount to stake\n * @param expiration - The expiration timestamp (for Hard/Lock staking)\n */\n async stake(args: StakeArgs): Promise<void> {\n\n const { sender, signer, type, asset = 0n, amount } = args;\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // For escrowed staking (Hard/Lock), the payment includes the amount being staked\n // For non-escrowed staking (Soft/Heartbeat), only the MBR cost is required\n const isEscrowed = type === StakingType.Hard || type === StakingType.Lock;\n\n let expiration: bigint;\n if (isEscrowed) {\n // ensure args.expiration is in the future\n if (args.expiration < BigInt(Date.now() / 1000)) { // AVM uses unix timestamp in seconds\n throw new Error('Expiration must be in the future');\n }\n expiration = args.expiration;\n } else {\n expiration = 0n;\n }\n\n const cost = await this.stakeCost(asset, type);\n\n if (asset === 0n) {\n\n const total = microAlgo(isEscrowed ? cost + amount : cost);\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: total,\n receiver: this.client.appAddress,\n });\n\n await this.client.send.stake({\n ...sendParams,\n args: {\n payment,\n type,\n amount,\n expiration\n }\n });\n } else {\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n const assetXfer = this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount,\n assetId: asset,\n receiver: this.client.appAddress,\n });\n\n await this.client.send.stakeAsa({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n type,\n amount,\n expiration\n }\n });\n }\n }\n\n /**\n * Withdraws a stake from the contract.\n * @param asset - The asset ID (0 for ALGO)\n * @param type - The staking type\n */\n async withdraw({ sender, signer, asset, type }: WithdrawArgs): Promise<AppReturn<void>> {\n return await this.client.send.withdraw({\n ...this.getSendParams({ sender, signer }),\n args: { asset, type }\n });\n }\n\n /**\n * Creates a heartbeat entry for tracking stake history.\n * @param address - The address to create heartbeat for\n * @param asset - The asset ID (0 for ALGO)\n */\n async createHeartbeat({ sender, signer, address, asset }: CreateHeartbeatArgs): Promise<AppReturn<void>> {\n return await this.client.send.createHeartbeat({\n ...this.getSendParams({ sender, signer }),\n args: { address, asset }\n });\n }\n\n /**\n * Updates settings for a stake (e.g., extending expiration).\n * @param asset - The asset ID\n * @param value - The new value/setting\n */\n async updateSettings({ sender, signer, asset, value }: UpdateSettingsArgs): Promise<void> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(0), // May need adjustment based on operation\n receiver: this.client.appAddress,\n });\n\n await this.client.send.updateSettings({\n ...sendParams,\n args: {\n payment,\n asset,\n value\n }\n });\n }\n\n async optIn({ sender, signer, asset }: OptInArgs): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.optInCost();\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.optIn({ \n ...sendParams,\n args: { payment, asset },\n });\n }\n\n async optInCost(): Promise<bigint> {\n return await this.client.optInCost();\n }\n\n async stakeCost(asset: bigint | number, type: StakingType): Promise<bigint> {\n return await this.client.stakeCost({ \n args: { asset, type } \n });\n }\n\n async getTotals(assets: bigint[]): Promise<TotalsInfo[]> {\n return await this.client.getTotals({ \n args: { assets } \n }) as unknown as TotalsInfo[];\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\":\"Staking\",\"structs\":{\"Escrow\":[{\"name\":\"hard\",\"type\":\"uint64\"},{\"name\":\"lock\",\"type\":\"uint64\"}],\"HeartbeatKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"}],\"Stake\":[{\"name\":\"amount\",\"type\":\"uint64\"},{\"name\":\"lastUpdate\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"}],\"StakeCheck\":[{\"name\":\"valid\",\"type\":\"bool\"},{\"name\":\"balance\",\"type\":\"uint64\"}],\"StakeInfo\":[{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"type\",\"type\":\"uint8\"}],\"StakeKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"type\",\"type\":\"uint8\"}],\"TotalsInfo\":[{\"name\":\"locked\",\"type\":\"uint64\"},{\"name\":\"escrowed\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"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\":\"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\":\"stake\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"expiration\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"stakeAsa\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"expiration\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"withdraw\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"uint8\",\"name\":\"type\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createHeartbeat\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"softCheck\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(bool,uint64)\",\"struct\":\"StakeCheck\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateSettings\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"uint64\",\"name\":\"value\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"stakeCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"uint8\",\"name\":\"type\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getTimeLeft\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetTimeLeft\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getInfo\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"(uint64,uint8)\",\"struct\":\"StakeInfo\",\"name\":\"stake\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)\",\"struct\":\"Stake\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetInfo\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"(uint64,uint8)\",\"struct\":\"StakeInfo\",\"name\":\"stake\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)\",\"struct\":\"Stake\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getEscrowInfo\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(uint64,uint64)\",\"struct\":\"Escrow\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getHeartbeat\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64)[4]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetHeartbeat\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64)[4]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getHeartbeatAverage\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"bool\",\"name\":\"includeEscrowed\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetHeartbeatAverage\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"bool\",\"name\":\"includeEscrowed\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getInfoList\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64[]\",\"name\":\"assets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)[]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetInfoList\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64[]\",\"name\":\"assets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)[]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"stakeCheck\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"(uint64,uint64)[]\",\"name\":\"checks\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"bool\",\"name\":\"includeEscrowed\"}],\"returns\":{\"type\":\"bool\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getTotals\",\"args\":[{\"type\":\"uint64[]\",\"name\":\"assets\"}],\"returns\":{\"type\":\"(uint64,uint64)[]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"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\":1,\"bytes\":2},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"heartbeatManagerAddress\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"aGVhcnRiZWF0X21hbmFnZXJfYWRkcmVzcw==\",\"desc\":\"The address that is allowed to call the 'beat' method to create heartbeat records\"},\"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\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"stakes\":{\"keyType\":\"StakeKey\",\"valueType\":\"Stake\",\"prefix\":\"cw==\"},\"heartbeats\":{\"keyType\":\"HeartbeatKey\",\"valueType\":\"(uint64,uint64,uint64,uint64)[4]\",\"prefix\":\"aA==\"},\"totals\":{\"keyType\":\"uint64\",\"valueType\":\"TotalsInfo\",\"prefix\":\"dA==\"},\"settings\":{\"keyType\":\"uint64\",\"valueType\":\"uint64\",\"prefix\":\"ZQ==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[758,785,880,1080,1261,1291,1398,1833,1879,2383,2401,2549,2678,2722,2918,3280,3572,3670,3766,3786,3818,3838,3894],\"errorMessage\":\"Box must have value\"},{\"pc\":[901,1420],\"errorMessage\":\"Expiration must be greater than or equal to the current unlock time or hardlock disabled\"},{\"pc\":[636,1129],\"errorMessage\":\"Expiration must be in the future or hardlock disabled\"},{\"pc\":[1780,2958,3053],\"errorMessage\":\"Heartbeat not found\"},{\"pc\":[876,1394],\"errorMessage\":\"Heartbeat stakes cannot be updated\"},{\"pc\":[851,966,1364,1501],\"errorMessage\":\"Insufficient balance\"},{\"pc\":[1178,1187,1231,1316,1385,1447,1456,1507],\"errorMessage\":\"Invalid asset amount\"},{\"pc\":[509,686,805,867,2233],\"errorMessage\":\"Invalid payment\"},{\"pc\":[924,1169,1310,1379,1433],\"errorMessage\":\"Invalid payment amount\"},{\"pc\":[915,1163,1304,1373,1429],\"errorMessage\":\"Invalid payment receiver\"},{\"pc\":[1601,2458,2607],\"errorMessage\":\"Lock not found\"},{\"pc\":[1229,1360,1494,2126],\"errorMessage\":\"Not opted in\"},{\"pc\":[194],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[3734],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2199],\"errorMessage\":\"Only the asset creator can call this method\"},{\"pc\":[1749],\"errorMessage\":\"Only the heartbeat manager can call this method\"},{\"pc\":[2052],\"errorMessage\":\"Stake does not exist\"},{\"pc\":[3402],\"errorMessage\":\"Stake not found\"},{\"pc\":[1628,2471],\"errorMessage\":\"This asset is still locked\"},{\"pc\":[1559],\"errorMessage\":\"Withdraw is only for hard or lock\"},{\"pc\":[725,847,959,2069,2081,2098],\"errorMessage\":\"account funded\"},{\"pc\":[487],\"errorMessage\":\"already opted into asset\"},{\"pc\":[3732],\"errorMessage\":\"application exists\"},{\"pc\":[2197],\"errorMessage\":\"asset exists\"},{\"pc\":[1747,3719],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[1918,1934,3073,3211,3368,3508,3664,3920],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[3469],\"errorMessage\":\"invalid number of bytes for (len+(uint64,uint64)[])\"},{\"pc\":[3190,3344,3640],\"errorMessage\":\"invalid number of bytes for (len+uint64[])\"},{\"pc\":[428],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[2498,2569],\"errorMessage\":\"invalid number of bytes for (uint64,uint8)\"},{\"pc\":[2991,3029,3485],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[439,476,572,582,1030,1040,1535,1714,2008,2178,2187,2269,2343,2426,2633,2755,2937,2982,3020,3711],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[564,1022,1545,2281,3171,3325,3477],\"errorMessage\":\"invalid number of bytes for uint8\"},{\"pc\":[1706,2000,2335,2418,2489,2560,2625,2747,2929,2974,3012,3163,3317,3449],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[3255,3286,3410,3676],\"errorMessage\":\"max array length exceeded\"},{\"pc\":[1012],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[468,555,1000,2170],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgMjg5MDAgOTkwMDAgMzE1MzYwMDAKICAgIGJ5dGVjYmxvY2sgInMiIDB4MTUxZjdjNzUgMHgyOCAiIiAweDFlICJoIiAidCIgMHgwYSAiYWtpdGFfZGFvIiAweDAwIDB4MDAwMCAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIGNsYXNzZXMoQmFzZVN0YWtpbmcsIEFraXRhQmFzZUNvbnRyYWN0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzEKICAgIHB1c2hieXRlc3MgMHg4M2YxNDc0OCAweDM5NGVhZWIyIDB4ODI1NmNmMTkgMHgyMDQ2N2I5MyAweDgzMDQ4MGYzIDB4YzgxNzNjYTEgMHg0ODcxNmYxYSAweDVkOWQxNDI4IDB4MjIzNWE2ODMgMHg2Y2IwMGU3ZCAweDlmNGY1Njc0IDB4NzVkMTM4ZmIgMHhjOTA2ODgwOSAweGY1MjMyYmYzIDB4NGM4OGVhY2UgMHhlYWU2NWYxMiAweGRkNDRhODQzIDB4YzZmZDBjYTUgMHg4YWUyNjZiOSAweGU5N2E1NjU1IDB4MTEyNWQ3M2IgMHg5ZGZmNDA2MCAweDZiZThjZWU2IDB4MzNlOTJjOTQgMHg4NTRkZWRlMCAvLyBtZXRob2QgImluaXQoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3Rha2UocGF5LHVpbnQ4LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3Rha2VBc2EocGF5LGF4ZmVyLHVpbnQ4LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXcodWludDY0LHVpbnQ4KXZvaWQiLCBtZXRob2QgImNyZWF0ZUhlYXJ0YmVhdChhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzb2Z0Q2hlY2soYWRkcmVzcyx1aW50NjQpKGJvb2wsdWludDY0KSIsIG1ldGhvZCAidXBkYXRlU2V0dGluZ3MocGF5LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KCl1aW50NjQiLCBtZXRob2QgInN0YWtlQ29zdCh1aW50NjQsdWludDgpdWludDY0IiwgbWV0aG9kICJnZXRUaW1lTGVmdChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgIm11c3RHZXRUaW1lTGVmdChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldEluZm8oYWRkcmVzcywodWludDY0LHVpbnQ4KSkodWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJtdXN0R2V0SW5mbyhhZGRyZXNzLCh1aW50NjQsdWludDgpKSh1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldEVzY3Jvd0luZm8oYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRIZWFydGJlYXQoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbNF0iLCBtZXRob2QgIm11c3RHZXRIZWFydGJlYXQoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbNF0iLCBtZXRob2QgImdldEhlYXJ0YmVhdEF2ZXJhZ2UoYWRkcmVzcyx1aW50NjQsYm9vbCl1aW50NjQiLCBtZXRob2QgIm11c3RHZXRIZWFydGJlYXRBdmVyYWdlKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IiwgbWV0aG9kICJnZXRJbmZvTGlzdChhZGRyZXNzLHVpbnQ4LHVpbnQ2NFtdKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAibXVzdEdldEluZm9MaXN0KGFkZHJlc3MsdWludDgsdWludDY0W10pKHVpbnQ2NCx1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJzdGFrZUNoZWNrKGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpW10sdWludDgsYm9vbClib29sIiwgbWV0aG9kICJnZXRUb3RhbHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9pbml0X3JvdXRlQDUgb3B0SW4gc3Rha2Ugc3Rha2VBc2Egd2l0aGRyYXcgY3JlYXRlSGVhcnRiZWF0IHNvZnRDaGVjayB1cGRhdGVTZXR0aW5ncyBvcHRJbkNvc3Qgc3Rha2VDb3N0IGdldFRpbWVMZWZ0IG11c3RHZXRUaW1lTGVmdCBnZXRJbmZvIG11c3RHZXRJbmZvIGdldEVzY3Jvd0luZm8gZ2V0SGVhcnRiZWF0IG11c3RHZXRIZWFydGJlYXQgZ2V0SGVhcnRiZWF0QXZlcmFnZSBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZSBnZXRJbmZvTGlzdCBtdXN0R2V0SW5mb0xpc3Qgc3Rha2VDaGVjayBnZXRUb3RhbHMgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDI5CiAgICBlcnIKCm1haW5fb3BVcF9yb3V0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQzCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2luaXRfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHRvdGFscyA9IEJveE1hcDx1aW50NjQsIFRvdGFsc0luZm8+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4VG90YWxzIH0pCiAgICBwdXNoYnl0ZXMgMHg3NDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyB0aGlzLnRvdGFscygwKS52YWx1ZSA9IHsgbG9ja2VkOiAwLCBlc2Nyb3dlZDogMCB9CiAgICBieXRlYyAxMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gaW5pdCgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIGNsYXNzZXMoQmFzZVN0YWtpbmcsIEFraXRhQmFzZUNvbnRyYWN0KSB7CiAgICBwdXNoYnl0ZXMgMHhjZDlhZDY3ZSAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogR2xvYmFsU3RhdGVLZXlWZXJzaW9uIH0pCiAgICBwdXNoYnl0ZXMgInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDggLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBhc3NlcnQoIUdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmlzT3B0ZWRJbihBc3NldChhc3NldCkpLCBFUlJfQUxSRUFEWV9PUFRFRF9JTikKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyB0b3RhbHNNQlIgKwogICAgcHVzaGludCAxMjUwMCAvLyAxMjUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMzgKICAgIC8vIEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEzNy0xMzgKICAgIC8vIHRvdGFsc01CUiArCiAgICAvLyBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTQxLTE0OAogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBtYnIsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNDQKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE0MS0xNDgKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbWJyLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgdW5jb3ZlciAzCiAgICBndHhucyBBbW91bnQKICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE1MC0xNTQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTUxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTUwLTE1NAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyB9KS5zdWJtaXQoKQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUgPSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNTYtMTU5CiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUgPSB7CiAgICAvLyAgIGxvY2tlZDogMCwKICAgIC8vICAgZXNjcm93ZWQ6IDAsCiAgICAvLyB9CiAgICBieXRlYyAxMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0YWtlOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gc3Rha2UocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB0eXBlOiBTdGFraW5nVHlwZSwgYW1vdW50OiB1aW50NjQsIGV4cGlyYXRpb246IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIGNvbnN0IGluVGhlRnV0dXJlID0gZXhwaXJhdGlvbiA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGxlc3NUaGFuT25lWWVhckluVGhlRnV0dXJlID0gZXhwaXJhdGlvbiA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgT05FX1lFQVIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGMgNiAvLyAzMTUzNjAwMAogICAgKwogICAgPD0KICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyBjb25zdCBsb2NrZWQgPSB0eXBlID09PSBTVEFLSU5HX1RZUEVfTE9DSwogICAgZHVwCiAgICBieXRlY18yIC8vIDB4MjgKICAgID09CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gY29uc3QgaXNFc2Nyb3cgPSB0eXBlID09PSBTVEFLSU5HX1RZUEVfSEFSRCB8fCB0eXBlID09PSBTVEFLSU5HX1RZUEVfTE9DSwogICAgYnl0ZWMgNCAvLyAweDFlCiAgICA9PQogICAgYm56IHN0YWtlX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIGJ6IHN0YWtlX2Jvb2xfZmFsc2VANAoKc3Rha2VfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxMAoKc3Rha2VfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIGNvbnN0IHRpbWVzdGFtcCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCgoaW5UaGVGdXR1cmUgJiYgbGVzc1RoYW5PbmVZZWFySW5UaGVGdXR1cmUpIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTikKICAgIGRpZyAyCiAgICBieiBzdGFrZV9vcl9jb250ZEA3CiAgICBkaWcgMQogICAgYm56IHN0YWtlX2Jvb2xfdHJ1ZUA4CgpzdGFrZV9vcl9jb250ZEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCgoaW5UaGVGdXR1cmUgJiYgbGVzc1RoYW5PbmVZZWFySW5UaGVGdXR1cmUpIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTikKICAgIGR1cAogICAgYm56IHN0YWtlX2Jvb2xfZmFsc2VAOQoKc3Rha2VfYm9vbF90cnVlQDg6CiAgICBpbnRjXzEgLy8gMQoKc3Rha2VfYm9vbF9tZXJnZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBhc3NlcnQoKGluVGhlRnV0dXJlICYmIGxlc3NUaGFuT25lWWVhckluVGhlRnV0dXJlKSB8fCAhbG9ja2VkLCBFUlJfQkFEX0VYUElSQVRJT04pCiAgICBhc3NlcnQgLy8gRXhwaXJhdGlvbiBtdXN0IGJlIGluIHRoZSBmdXR1cmUgb3IgaGFyZGxvY2sgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNzMKICAgIC8vIGFzc2V0OiAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTcxLTE3NQogICAgLy8gY29uc3Qgc2s6IFN0YWtlS2V5ID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogMCwKICAgIC8vICAgdHlwZSwKICAgIC8vIH0KICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxOQogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE3NwogICAgLy8gY29uc3QgaXNVcGRhdGUgPSB0aGlzLnN0YWtlcyhzaykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTc5CiAgICAvLyBpZiAoIWlzVXBkYXRlKSB7CiAgICBibnogc3Rha2VfZWxzZV9ib2R5QDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgOQogICAgYnogc3Rha2VfZWxzZV9ib2R5QDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4NS0xOTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogYW1vdW50ICsgY29zdHMuc3Rha2VzLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgNgogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4NS0xOTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogYW1vdW50ICsgY29zdHMuc3Rha2VzLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4OQogICAgLy8gYW1vdW50OiBhbW91bnQgKyBjb3N0cy5zdGFrZXMsCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjIDQgLy8gMjg5MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTg1LTE5MgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5zdGFrZXMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMudXBkYXRlVG90YWxzKDAsIHR5cGUsIGFtb3VudCwgdHJ1ZSkKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiB1cGRhdGVUb3RhbHMKCnN0YWtlX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI3Mi0yNzYKICAgIC8vIHRoaXMuc3Rha2VzKHNrKS52YWx1ZSA9IHsKICAgIC8vICAgYW1vdW50LAogICAgLy8gICBsYXN0VXBkYXRlOiB0aW1lc3RhbXAsCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyB9CiAgICBkaWcgNAogICAgaXRvYgogICAgZGlnIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDE2CiAgICBzd2FwCiAgICBib3hfcHV0CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIHN0YWtlKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgdHlwZTogU3Rha2luZ1R5cGUsIGFtb3VudDogdWludDY0LCBleHBpcmF0aW9uOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlX2Vsc2VfYm9keUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyB9IGVsc2UgaWYgKHR5cGUgPT09IFNUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGRpZyA1CiAgICBieXRlYyA3IC8vIDB4MGEKICAgID09CiAgICBieiBzdGFrZV9lbHNlX2JvZHlAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyBjb25zdCBoZWxkID0gbmV3IFVpbnQ2NChUeG4uc2VuZGVyLmJhbGFuY2UpCiAgICB0eG4gU2VuZGVyCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgaXRvYgogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGxldCBoYXJkOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMDEKICAgIC8vIGxldCBsb2NrOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gYWRkcmVzczogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjAzLTIwNwogICAgLy8gY29uc3QgaGFyZFN0YWtlS2V5OiBTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzczogVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXQ6IDAsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9IQVJELAogICAgLy8gfQogICAgZGlnIDE3CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0eXBlOiBTVEFLSU5HX1RZUEVfSEFSRCwKICAgIGJ5dGVjIDQgLy8gMHgxZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMDMtMjA3CiAgICAvLyBjb25zdCBoYXJkU3Rha2VLZXk6IFN0YWtlS2V5ID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogMCwKICAgIC8vICAgdHlwZTogU1RBS0lOR19UWVBFX0hBUkQsCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjA5CiAgICAvLyBpZiAodGhpcy5zdGFrZXMoaGFyZFN0YWtlS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogc3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMTAKICAgIC8vIGhhcmQgPSB0aGlzLnN0YWtlcyhoYXJkU3Rha2VLZXkpLnZhbHVlLmFtb3VudAogICAgZGlnIDE0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDExCgpzdGFrZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIxMy0yMTcKICAgIC8vIGNvbnN0IGxvY2tTdGFrZUtleTogU3Rha2VLZXkgPSB7CiAgICAvLyAgIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0OiAwLAogICAgLy8gICB0eXBlOiBTVEFLSU5HX1RZUEVfTE9DSywKICAgIC8vIH0KICAgIGRpZyAxNwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gdHlwZTogU1RBS0lOR19UWVBFX0xPQ0ssCiAgICBieXRlY18yIC8vIDB4MjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gY29uc3QgbG9ja1N0YWtlS2V5OiBTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzczogVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXQ6IDAsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLLAogICAgLy8gfQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gaWYgKHRoaXMuc3Rha2VzKGxvY2tTdGFrZUtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN0YWtlX2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBsb2NrID0gdGhpcy5zdGFrZXMobG9ja1N0YWtlS2V5KS52YWx1ZS5hbW91bnQKICAgIGRpZyAxMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA5CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMjMtMjMwCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLnN0YWtlcyArIGNvc3RzLmhlYXJ0YmVhdHMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA2CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjIzLTIzMAogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5zdGFrZXMgKyBjb3N0cy5oZWFydGJlYXRzLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gYW1vdW50OiBjb3N0cy5zdGFrZXMgKyBjb3N0cy5oZWFydGJlYXRzLAogICAgaW50YyA1IC8vIDk5MDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIyMy0yMzAKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuc3Rha2VzICsgY29zdHMuaGVhcnRiZWF0cywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gYWRkcmVzczogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjMyLTIzNQogICAgLy8gY29uc3QgaGVhcnRiZWF0S2V5OiBIZWFydGJlYXRLZXkgPSB7CiAgICAvLyAgIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0OiAwLAogICAgLy8gfQogICAgZGlnIDE3CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyBoYXJkOiBuZXcgVWludDY0KGhhcmQpLAogICAgZGlnIDExCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIGRpZyAxMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIHRpbWVzdGFtcDogbmV3IFVpbnQ2NCh0aW1lc3RhbXApLAogICAgZGlnIDEwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDIKICAgIC8vIGNvbnN0IGhidiA9IG5ldyBhcmM0SGVhcnRiZWF0KHsKICAgIC8vICAgaGVsZCwKICAgIC8vICAgaGFyZDogbmV3IFVpbnQ2NChoYXJkKSwKICAgIC8vICAgbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIC8vICAgdGltZXN0YW1wOiBuZXcgVWludDY0KHRpbWVzdGFtcCksCiAgICAvLyB9KQogICAgZGlnIDE2CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNTEtMjU2CiAgICAvLyBjb25zdCBoZWFydGJlYXRzID0gbmV3IFN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+KAogICAgLy8gICBjbG9uZShoYnYpLAogICAgLy8gICBjbG9uZShlaGJ2KSwKICAgIC8vICAgY2xvbmUoZWhidiksCiAgICAvLyAgIGNsb25lKGVoYnYpCiAgICAvLyApCiAgICBieXRlYyAxMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNTgKICAgIC8vIHRoaXMuaGVhcnRiZWF0cyhoZWFydGJlYXRLZXkpLnZhbHVlID0gY2xvbmUoaGVhcnRiZWF0cykKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgc3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMQoKc3Rha2VfZWxzZV9ib2R5QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNjEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJhbGFuY2UgPj0gYW1vdW50LCBFUlJfSU5TVUZGSUNJRU5UX0JBTEFOQ0UpCiAgICB0eG4gU2VuZGVyCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDUKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IGJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjYyLTI2OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5zdGFrZXMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA2CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI2NQogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjYyLTI2OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5zdGFrZXMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBhbW91bnQ6IGNvc3RzLnN0YWtlcywKICAgIGludGMgNCAvLyAyODkwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNjItMjY5CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLnN0YWtlcywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICBiIHN0YWtlX2FmdGVyX2lmX2Vsc2VAMjEKCnN0YWtlX2Vsc2VfYm9keUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyBhc3NlcnQodHlwZSAhPT0gU1RBS0lOR19UWVBFX0hFQVJUQkVBVCwgRVJSX0hFQVJUQkVBVF9DQU5OT1RfVVBEQVRFKQogICAgZGlnIDUKICAgIGJ5dGVjIDcgLy8gMHgwYQogICAgIT0KICAgIGFzc2VydCAvLyBIZWFydGJlYXQgc3Rha2VzIGNhbm5vdCBiZSB1cGRhdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gY29uc3QgeyBleHBpcmF0aW9uOiBjdXJyZW50U3Rha2VFeHBpcmF0aW9uLCBhbW91bnQ6IGN1cnJlbnRTdGFrZUFtb3VudCB9ID0gdGhpcy5zdGFrZXMoc2spLnZhbHVlCiAgICBkaWcgMTUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjgxCiAgICAvLyBhc3NlcnQoZXhwaXJhdGlvbiA+PSBjdXJyZW50U3Rha2VFeHBpcmF0aW9uIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTl9VUERBVEUpCiAgICBkaWcgNAogICAgPD0KICAgIGJueiBzdGFrZV9ib29sX3RydWVAMjQKICAgIGR1cAogICAgYm56IHN0YWtlX2Jvb2xfZmFsc2VAMjUKCnN0YWtlX2Jvb2xfdHJ1ZUAyNDoKICAgIGludGNfMSAvLyAxCgpzdGFrZV9ib29sX21lcmdlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID49IGN1cnJlbnRTdGFrZUV4cGlyYXRpb24gfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OX1VQREFURSkKICAgIGFzc2VydCAvLyBFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHVubG9jayB0aW1lIG9yIGhhcmRsb2NrIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgOQogICAgYnogc3Rha2VfZWxzZV9ib2R5QDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gYXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZGlnIDYKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCByZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyODUKICAgIC8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gYW1vdW50LCBFUlJfSU5WQUxJRF9QQVlNRU5UX0FNT1VOVCkKICAgIGd0eG5zIEFtb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gdGhpcy51cGRhdGVUb3RhbHMoMCwgdHlwZSwgYW1vdW50LCB0cnVlKQogICAgaW50Y18wIC8vIDAKICAgIGRpZyA3CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIHVwZGF0ZVRvdGFscwoKc3Rha2VfYWZ0ZXJfaWZfZWxzZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjkyCiAgICAvLyBjb25zdCBuZXdBbW91bnQ6IHVpbnQ2NCA9IGN1cnJlbnRTdGFrZUFtb3VudCArIGFtb3VudAogICAgZGlnIDExCiAgICBkaWcgNQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyOTQtMjk4CiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogbmV3QW1vdW50LAogICAgLy8gICBsYXN0VXBkYXRlOiB0aW1lc3RhbXAsCiAgICAvLyAgIGV4cGlyYXRpb24KICAgIC8vIH0KICAgIGl0b2IKICAgIGRpZyA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxNgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBzdGFrZV9hZnRlcl9pZl9lbHNlQDMwCgpzdGFrZV9lbHNlX2JvZHlAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYmFsYW5jZSA+PSBjdXJyZW50U3Rha2VBbW91bnQgKyBhbW91bnQsIEVSUl9JTlNVRkZJQ0lFTlRfQkFMQU5DRSkKICAgIHR4biBTZW5kZXIKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMTIKICAgIGRpZyA2CiAgICArCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBiYWxhbmNlCiAgICBiIHN0YWtlX2FmdGVyX2lmX2Vsc2VAMjkKCnN0YWtlX2Jvb2xfZmFsc2VAMjU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZV9ib29sX21lcmdlQDI2CgpzdGFrZV9ib29sX2ZhbHNlQDk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZV9ib29sX21lcmdlQDEwCgpzdGFrZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgYiBzdGFrZV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnN0YWtlQXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKc3Rha2VBc2E6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzAyLTMwOAogICAgLy8gc3Rha2VBc2EoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHR5cGU6IFN0YWtpbmdUeXBlLAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBjb25zdCBpblRoZUZ1dHVyZSA9IGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBsZXQgbGVzc1RoYW5NYXhMb2NrdXAgPSBleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfWUVBUgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50YyA2IC8vIDMxNTM2MDAwCiAgICArCiAgICA8PQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTEKICAgIC8vIGlmICh0aGlzLnNldHRpbmdzKGFzc2V0WGZlci54ZmVyQXNzZXQuaWQpLmV4aXN0cykgewogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkdXAKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5MwogICAgLy8gc2V0dGluZ3MgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U2V0dGluZ3MgfSkKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxMQogICAgLy8gaWYgKHRoaXMuc2V0dGluZ3MoYXNzZXRYZmVyLnhmZXJBc3NldC5pZCkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIGxlc3NUaGFuTWF4TG9ja3VwID0gZXhwaXJhdGlvbiA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgdGhpcy5zZXR0aW5ncyhhc3NldFhmZXIueGZlckFzc2V0LmlkKS52YWx1ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICArCiAgICBkaWcgNgogICAgPj0KICAgIGJ1cnkgNAoKc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIGNvbnN0IGxvY2tlZCA9IHR5cGUgPT09IFNUQUtJTkdfVFlQRV9MT0NLCiAgICBkaWcgNwogICAgZHVwCiAgICBieXRlY18yIC8vIDB4MjgKICAgID09CiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gY29uc3QgaXNFc2Nyb3cgPSB0eXBlID09PSBTVEFLSU5HX1RZUEVfSEFSRCB8fCB0eXBlID09PSBTVEFLSU5HX1RZUEVfTE9DSwogICAgYnl0ZWMgNCAvLyAweDFlCiAgICA9PQogICAgYm56IHN0YWtlQXNhX2Jvb2xfdHJ1ZUA1CiAgICBkaWcgMTEKICAgIGJ6IHN0YWtlQXNhX2Jvb2xfZmFsc2VANgoKc3Rha2VBc2FfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxNAoKc3Rha2VBc2FfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTYKICAgIC8vIGNvbnN0IHRpbWVzdGFtcCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBhc3NlcnQoKGluVGhlRnV0dXJlICYmIGxlc3NUaGFuTWF4TG9ja3VwKSB8fCAhbG9ja2VkLCBFUlJfQkFEX0VYUElSQVRJT04pCiAgICBkaWcgNAogICAgYnogc3Rha2VBc2Ffb3JfY29udGRAOQogICAgZGlnIDMKICAgIGJueiBzdGFrZUFzYV9ib29sX3RydWVAMTAKCnN0YWtlQXNhX29yX2NvbnRkQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gYXNzZXJ0KChpblRoZUZ1dHVyZSAmJiBsZXNzVGhhbk1heExvY2t1cCkgfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OKQogICAgZGlnIDExCiAgICBibnogc3Rha2VBc2FfYm9vbF9mYWxzZUAxMQoKc3Rha2VBc2FfYm9vbF90cnVlQDEwOgogICAgaW50Y18xIC8vIDEKCnN0YWtlQXNhX2Jvb2xfbWVyZ2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gYXNzZXJ0KChpblRoZUZ1dHVyZSAmJiBsZXNzVGhhbk1heExvY2t1cCkgfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OKQogICAgYXNzZXJ0IC8vIEV4cGlyYXRpb24gbXVzdCBiZSBpbiB0aGUgZnV0dXJlIG9yIGhhcmRsb2NrIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gY29uc3Qgc2s6IFN0YWtlS2V5ID0geyBhZGRyZXNzOiBUeG4uc2VuZGVyLCBhc3NldCwgdHlwZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMyNAogICAgLy8gY29uc3QgaXNVcGRhdGUgPSB0aGlzLnN0YWtlcyhzaykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBpZiAoIWlzVXBkYXRlKSB7CiAgICBibnogc3Rha2VBc2FfZWxzZV9ib2R5QDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgMTMKICAgIGJ6IHN0YWtlQXNhX2Vsc2VfYm9keUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVF9SRUNFSVZFUikKICAgIGRpZyA5CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgcmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzMyCiAgICAvLyBhc3NlcnQocGF5bWVudC5hbW91bnQgPT09IGNvc3RzLnN0YWtlcywgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBndHhucyBBbW91bnQKICAgIGludGMgNCAvLyAyODkwMAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gYXNzZXJ0KGFzc2V0WGZlci5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfQVNTRVRfQU1PVU5UKQogICAgZGlnIDgKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhc3NldCBhbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBhc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID09PSBhbW91bnQsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gdGhpcy51cGRhdGVUb3RhbHMoYXNzZXQsIHR5cGUsIGFtb3VudCwgdHJ1ZSkKICAgIGRpZyAzCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiB1cGRhdGVUb3RhbHMKCnN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQwMS00MDUKICAgIC8vIHRoaXMuc3Rha2VzKHNrKS52YWx1ZSA9IHsKICAgIC8vICAgYW1vdW50LAogICAgLy8gICBsYXN0VXBkYXRlOiB0aW1lc3RhbXAsCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyB9CiAgICBkaWcgNgogICAgaXRvYgogICAgZGlnIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyMAogICAgc3dhcAogICAgYm94X3B1dAoKc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzAyLTMwOAogICAgLy8gc3Rha2VBc2EoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHR5cGU6IFN0YWtpbmdUeXBlLAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlQXNhX2Vsc2VfYm9keUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyB9IGVsc2UgaWYgKHR5cGUgPT09IFNUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGRpZyA3CiAgICBieXRlYyA3IC8vIDB4MGEKICAgID09CiAgICBieiBzdGFrZUFzYV9lbHNlX2JvZHlAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBbaG9sZGluZ0Ftb3VudCwgb3B0ZWRJbl0gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKFR4bi5zZW5kZXIsIGFzc2V0KQogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIGFzc2VydChvcHRlZEluLCBFUlJfTk9UX09QVEVEX0lOKQogICAgYXNzZXJ0IC8vIE5vdCBvcHRlZCBpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGFzc2VydChob2xkaW5nQW1vdW50ID4gMCwgRVJSX0lOVkFMSURfQVNTRVRfQU1PVU5UKQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhc3NldCBhbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBjb25zdCBoZWxkID0gbmV3IFVpbnQ2NChob2xkaW5nQW1vdW50KQogICAgaXRvYgogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIGNvbnN0IGhhcmRTdGFrZUtleTogU3Rha2VLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIGFzc2V0LCB0eXBlOiBTVEFLSU5HX1RZUEVfSEFSRCB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MWUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGxldCBoYXJkOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhoYXJkU3Rha2VLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBzdGFrZUFzYV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gaGFyZCA9IHRoaXMuc3Rha2VzKGhhcmRTdGFrZUtleSkudmFsdWUuYW1vdW50CiAgICBkaWcgMTgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTUKCnN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gY29uc3QgbG9ja1N0YWtlS2V5OiBTdGFrZUtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgYXNzZXQsIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLIH0KICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gMHgyOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gbGV0IGxvY2s6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gaWYgKHRoaXMuc3Rha2VzKGxvY2tTdGFrZUtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBsb2NrID0gdGhpcy5zdGFrZXMobG9ja1N0YWtlS2V5KS52YWx1ZS5hbW91bnQKICAgIGRpZyAxNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMwoKc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgOQogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IHJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSAoY29zdHMuc3Rha2VzICsgY29zdHMuaGVhcnRiZWF0cyksIEVSUl9JTlZBTElEX1BBWU1FTlRfQU1PVU5UKQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDUgLy8gOTkwMDAKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIGFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IDAsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGRpZyA4CiAgICBndHhucyBBc3NldEFtb3VudAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gY29uc3QgaGVhcnRiZWF0S2V5OiBIZWFydGJlYXRLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIGFzc2V0IH0KICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBoYXJkOiBuZXcgVWludDY0KGhhcmQpLAogICAgZGlnIDE1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIGRpZyAxNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIHRpbWVzdGFtcDogbmV3IFVpbnQ2NCh0aW1lc3RhbXApLAogICAgZGlnIDEzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM2OS0zNzQKICAgIC8vIGNvbnN0IGhidiA9IG5ldyBhcmM0SGVhcnRiZWF0KHsKICAgIC8vICAgaGVsZCwKICAgIC8vICAgaGFyZDogbmV3IFVpbnQ2NChoYXJkKSwKICAgIC8vICAgbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIC8vICAgdGltZXN0YW1wOiBuZXcgVWludDY0KHRpbWVzdGFtcCksCiAgICAvLyB9KQogICAgZGlnIDIwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozODMtMzg4CiAgICAvLyB0aGlzLmhlYXJ0YmVhdHMoaGVhcnRiZWF0S2V5KS52YWx1ZSA9IG5ldyBhcmM0LlN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+KAogICAgLy8gICBjbG9uZShoYnYpLAogICAgLy8gICBjbG9uZShlaGJ2KSwKICAgIC8vICAgY2xvbmUoZWhidiksCiAgICAvLyAgIGNsb25lKGVoYnYpCiAgICAvLyApCiAgICBieXRlYyAxMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozODMtMzg4CiAgICAvLyB0aGlzLmhlYXJ0YmVhdHMoaGVhcnRiZWF0S2V5KS52YWx1ZSA9IG5ldyBhcmM0LlN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+KAogICAgLy8gICBjbG9uZShoYnYpLAogICAgLy8gICBjbG9uZShlaGJ2KSwKICAgIC8vICAgY2xvbmUoZWhidiksCiAgICAvLyAgIGNsb25lKGVoYnYpCiAgICAvLyApCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjMKCnN0YWtlQXNhX2Vsc2VfYm9keUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzkwCiAgICAvLyBjb25zdCBbaG9sZGluZ0Ftb3VudCwgb3B0ZWRJbl0gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKFR4bi5zZW5kZXIsIGFzc2V0KQogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozOTEKICAgIC8vIGFzc2VydChvcHRlZEluLCBFUlJfTk9UX09QVEVEX0lOKQogICAgYXNzZXJ0IC8vIE5vdCBvcHRlZCBpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozOTIKICAgIC8vIGFzc2VydChob2xkaW5nQW1vdW50ID49IGFtb3VudCwgRVJSX0lOU1VGRklDSUVOVF9CQUxBTkNFKQogICAgZGlnIDcKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IGJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgOQogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IHJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM5NQogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSBjb3N0cy5zdGFrZXMsIEVSUl9JTlZBTElEX1BBWU1FTlRfQU1PVU5UKQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDQgLy8gMjg5MDAKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIGFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IDAsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGRpZyA4CiAgICBndHhucyBBc3NldEFtb3VudAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICBiIHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjMKCnN0YWtlQXNhX2Vsc2VfYm9keUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBhc3NlcnQodHlwZSAhPT0gU1RBS0lOR19UWVBFX0hFQVJUQkVBVCwgRVJSX0hFQVJUQkVBVF9DQU5OT1RfVVBEQVRFKQogICAgZGlnIDcKICAgIGJ5dGVjIDcgLy8gMHgwYQogICAgIT0KICAgIGFzc2VydCAvLyBIZWFydGJlYXQgc3Rha2VzIGNhbm5vdCBiZSB1cGRhdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gY29uc3QgeyBleHBpcmF0aW9uOiBjdXJyZW50U3Rha2VFeHBpcmF0aW9uLCBhbW91bnQ6IGN1cnJlbnRTdGFrZUFtb3VudCB9ID0gdGhpcy5zdGFrZXMoc2spLnZhbHVlCiAgICBkaWcgMTkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyBhc3NlcnQoZXhwaXJhdGlvbiA+PSBjdXJyZW50U3Rha2VFeHBpcmF0aW9uIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTl9VUERBVEUpCiAgICBkaWcgNgogICAgPD0KICAgIGJueiBzdGFrZUFzYV9ib29sX3RydWVAMjYKICAgIGRpZyAxMQogICAgYm56IHN0YWtlQXNhX2Jvb2xfZmFsc2VAMjcKCnN0YWtlQXNhX2Jvb2xfdHJ1ZUAyNjoKICAgIGludGNfMSAvLyAxCgpzdGFrZUFzYV9ib29sX21lcmdlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID49IGN1cnJlbnRTdGFrZUV4cGlyYXRpb24gfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OX1VQREFURSkKICAgIGFzc2VydCAvLyBFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHVubG9jayB0aW1lIG9yIGhhcmRsb2NrIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gYXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZGlnIDkKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCByZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gMCwgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBndHhucyBBbW91bnQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgMTMKICAgIGJ6IHN0YWtlQXNhX2Vsc2VfYm9keUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MTYKICAgIC8vIGFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGRpZyA4CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gYXNzZXJ0KGFzc2V0WGZlci5hc3NldEFtb3VudCA9PT0gYW1vdW50LCBFUlJfSU5WQUxJRF9BU1NFVF9BTU9VTlQpCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFzc2V0IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHRoaXMudXBkYXRlVG90YWxzKGFzc2V0LCB0eXBlLCBhbW91bnQsIHRydWUpCiAgICBkaWcgMwogICAgZGlnIDkKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgdXBkYXRlVG90YWxzCgpzdGFrZUFzYV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIGNvbnN0IG5ld0Ftb3VudDogdWludDY0ID0gY3VycmVudFN0YWtlQW1vdW50ICsgYW1vdW50CiAgICBkaWcgMTUKICAgIGRpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQzMC00MzQKICAgIC8vIHRoaXMuc3Rha2VzKHNrKS52YWx1ZSA9IHsKICAgIC8vICAgYW1vdW50OiBuZXdBbW91bnQsCiAgICAvLyAgIGxhc3RVcGRhdGU6IHRpbWVzdGFtcCwKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vIH0KICAgIGl0b2IKICAgIGRpZyAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMjAKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMgoKc3Rha2VBc2FfZWxzZV9ib2R5QDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MjEKICAgIC8vIGNvbnN0IFtob2xkaW5nQW1vdW50LCBvcHRlZEluXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoVHhuLnNlbmRlciwgYXNzZXQpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQyMgogICAgLy8gYXNzZXJ0KG9wdGVkSW4sIEVSUl9OT1RfT1BURURfSU4pCiAgICBhc3NlcnQgLy8gTm90IG9wdGVkIGluCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gYXNzZXJ0KGhvbGRpbmdBbW91bnQgPj0gY3VycmVudFN0YWtlQW1vdW50ICsgYW1vdW50LCBFUlJfSU5TVUZGSUNJRU5UX0JBTEFOQ0UpCiAgICBkaWcgMTYKICAgIGRpZyA4CiAgICArCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBiYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYXNzZXJ0KGFzc2V0WGZlci5hc3NldEFtb3VudCA9PT0gMCwgRVJSX0lOVkFMSURfQVNTRVRfQU1PVU5UKQogICAgZGlnIDgKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhc3NldCBhbW91bnQKICAgIGIgc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMQoKc3Rha2VBc2FfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHN0YWtlQXNhX2Jvb2xfbWVyZ2VAMjgKCnN0YWtlQXNhX2Jvb2xfZmFsc2VAMTE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZUFzYV9ib29sX21lcmdlQDEyCgpzdGFrZUFzYV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxNAogICAgYiBzdGFrZUFzYV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLndpdGhkcmF3W3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXc6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gd2l0aGRyYXcoYXNzZXQ6IHVpbnQ2NCwgdHlwZTogU3Rha2luZ1R5cGUpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gdHlwZSA9PT0gU1RBS0lOR19UWVBFX0hBUkQgfHwgdHlwZSA9PT0gU1RBS0lOR19UWVBFX0xPQ0ssCiAgICBieXRlYyA0IC8vIDB4MWUKICAgID09CiAgICBibnogd2l0aGRyYXdfYm9vbF90cnVlQDMKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAweDI4CiAgICA9PQogICAgYnogd2l0aGRyYXdfYm9vbF9mYWxzZUA0Cgp3aXRoZHJhd19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgp3aXRoZHJhd19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQzOS00NDIKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdHlwZSA9PT0gU1RBS0lOR19UWVBFX0hBUkQgfHwgdHlwZSA9PT0gU1RBS0lOR19UWVBFX0xPQ0ssCiAgICAvLyAgIEVSUl9XSVRIRFJBV19JU19PTkxZX0ZPUl9IQVJEX09SX0xPQ0sKICAgIC8vICkKICAgIGFzc2VydCAvLyBXaXRoZHJhdyBpcyBvbmx5IGZvciBoYXJkIG9yIGxvY2sKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDQ0CiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgYXNzZXQsIHR5cGUgfQogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ0NQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9OT19MT0NLKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ0NQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9OT19MT0NLKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBMb2NrIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIGNvbnN0IHsgZXhwaXJhdGlvbiwgYW1vdW50IH0gPSB0aGlzLnN0YWtlcyhzaykudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIGFzc2VydCh0eXBlICE9PSBTVEFLSU5HX1RZUEVfTE9DSyB8fCBleHBpcmF0aW9uIDwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xPQ0tFRCkKICAgIGJ5dGVjXzIgLy8gMHgyOAogICAgIT0KICAgIGJueiB3aXRoZHJhd19ib29sX3RydWVANwogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDwKICAgIGJ6IHdpdGhkcmF3X2Jvb2xfZmFsc2VAOAoKd2l0aGRyYXdfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKd2l0aGRyYXdfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIGFzc2VydCh0eXBlICE9PSBTVEFLSU5HX1RZUEVfTE9DSyB8fCBleHBpcmF0aW9uIDwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xPQ0tFRCkKICAgIGFzc2VydCAvLyBUaGlzIGFzc2V0IGlzIHN0aWxsIGxvY2tlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgZGlnIDEKICAgIGJueiB3aXRoZHJhd19lbHNlX2JvZHlAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDUxLTQ1NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ1MwogICAgLy8gcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDUxLTQ1NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDUxLTQ1NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDY3CiAgICAvLyB0aGlzLnVwZGF0ZVRvdGFscyhhc3NldCwgdHlwZSwgYW1vdW50LCBmYWxzZSkKICAgIGR1cDIKICAgIGRpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1cGRhdGVUb3RhbHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDY5CiAgICAvLyB0aGlzLnN0YWtlcyhzaykuZGVsZXRlKCkKICAgIGRpZyA0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyB3aXRoZHJhdyhhc3NldDogdWludDY0LCB0eXBlOiBTdGFraW5nVHlwZSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKd2l0aGRyYXdfZWxzZV9ib2R5QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NTgtNDY0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ1OC00NjMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ1OC00NjQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAxNAoKd2l0aGRyYXdfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgd2l0aGRyYXdfYm9vbF9tZXJnZUA5Cgp3aXRoZHJhd19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiB3aXRoZHJhd19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmNyZWF0ZUhlYXJ0YmVhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUhlYXJ0YmVhdDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBjcmVhdGVIZWFydGJlYXQoYWRkcmVzczogQWNjb3VudCwgYXNzZXQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmhlYXJ0YmVhdE1hbmFnZXJBZGRyZXNzLnZhbHVlLCBFUlJfTk9UX0hFQVJUQkVBVF9NQU5BR0VSKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIGhlYXJ0YmVhdE1hbmFnZXJBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IFN0YWtpbmdHbG9iYWxTdGF0ZUtleUhlYXJ0YmVhdE1hbmFnZXJBZGRyZXNzIH0pCiAgICBwdXNoYnl0ZXMgImhlYXJ0YmVhdF9tYW5hZ2VyX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuaGVhcnRiZWF0TWFuYWdlckFkZHJlc3MudmFsdWUsIEVSUl9OT1RfSEVBUlRCRUFUX01BTkFHRVIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBoZWFydGJlYXQgbWFuYWdlciBjYW4gY2FsbCB0aGlzIG1ldGhvZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIGNvbnN0IGhiayA9IHsgYWRkcmVzcywgYXNzZXQgfQogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDc2CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4Ny04OQogICAgLy8gaGVhcnRiZWF0cyA9IEJveE1hcDxIZWFydGJlYXRLZXksIGFyYzQuU3RhdGljQXJyYXk8YXJjNEhlYXJ0YmVhdCwgND4+KHsKICAgIC8vICAga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4SGVhcnRiZWF0cywKICAgIC8vIH0pCiAgICBieXRlYyA1IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDc2CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBIZWFydGJlYXQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gY29uc3QgdGltZXN0YW1wID0gbmV3IFVpbnQ2NChHbG9iYWwubGF0ZXN0VGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIGNvbnN0IGhlYXJ0YmVhdHMgPSBjbG9uZSh0aGlzLmhlYXJ0YmVhdHMoaGJrKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHBvcAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IFtob2xkaW5nc10gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKGFkZHJlc3MsIGFzc2V0KQogICAgY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBjb25zdCBoZWxkID0gbmV3IFVpbnQ2NChob2xkaW5ncykKICAgIGl0b2IKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDg3CiAgICAvLyB0eXBlOiBTVEFLSU5HX1RZUEVfSEFSRAogICAgYnl0ZWMgNCAvLyAweDFlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ4NC00ODgKICAgIC8vIGNvbnN0IGhhcmRTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzcywKICAgIC8vICAgYXNzZXQsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9IQVJECiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyBsZXQgaGFyZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBpZiAodGhpcy5zdGFrZXMoaGFyZFN0YWtlS2V5KS5leGlzdHMpIHsKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiA4CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgNDAgMQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBpZiAodGhpcy5zdGFrZXMoaGFyZFN0YWtlS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY3JlYXRlSGVhcnRiZWF0X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGhhcmQgPSB0aGlzLnN0YWtlcyhoYXJkU3Rha2VLZXkpLnZhbHVlLmFtb3VudAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDIKCmNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ5NS00OTkKICAgIC8vIGNvbnN0IGxvY2tTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzcywKICAgIC8vICAgYXNzZXQsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLCiAgICAvLyB9CiAgICBkaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0OTgKICAgIC8vIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLCiAgICBieXRlY18yIC8vIDB4MjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDk1LTQ5OQogICAgLy8gY29uc3QgbG9ja1N0YWtlS2V5ID0gewogICAgLy8gICBhZGRyZXNzLAogICAgLy8gICBhc3NldCwKICAgIC8vICAgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sKICAgIC8vIH0KICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGxldCBsb2NrOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhsb2NrU3Rha2VLZXkpLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhsb2NrU3Rha2VLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBjcmVhdGVIZWFydGJlYXRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUwMwogICAgLy8gbG9jayA9IHRoaXMuc3Rha2VzKGxvY2tTdGFrZUtleSkudmFsdWUuYW1vdW50CiAgICBkaWcgMTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOQoKY3JlYXRlSGVhcnRiZWF0X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTEyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgNDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKY3JlYXRlSGVhcnRiZWF0X3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgIGRpZyAxMAogICAgcHVzaGludCA0IC8vIDQKICAgIDwKICAgIGJ6IGNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuY3JlYXRlSGVhcnRiZWF0QDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gaSA9PT0gMyB8fAogICAgZGlnIDEwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUxNC01MTUKICAgIC8vIGkgPT09IDMgfHwKICAgIC8vIGhlYXJ0YmVhdHNbaV0udGltZXN0YW1wLmFzVWludDY0KCkgPiBoZWFydGJlYXRzW2kgKyAxXS50aW1lc3RhbXAuYXNVaW50NjQoKQogICAgYm56IGNyZWF0ZUhlYXJ0YmVhdF9pZl9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTE1CiAgICAvLyBoZWFydGJlYXRzW2ldLnRpbWVzdGFtcC5hc1VpbnQ2NCgpID4gaGVhcnRiZWF0c1tpICsgMV0udGltZXN0YW1wLmFzVWludDY0KCkKICAgIGRpZyAxMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMwogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTQtNTE1CiAgICAvLyBpID09PSAzIHx8CiAgICAvLyBoZWFydGJlYXRzW2ldLnRpbWVzdGFtcC5hc1VpbnQ2NCgpID4gaGVhcnRiZWF0c1tpICsgMV0udGltZXN0YW1wLmFzVWludDY0KCkKICAgIGJ6IGNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pZl9lbHNlQDEzCgpjcmVhdGVIZWFydGJlYXRfaWZfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTcKICAgIC8vIGNvbnN0IGluZGV4VG9Nb2RpZnk6IHVpbnQ2NCA9IGkgPT09IDMgPyAwIDogaSArIDEKICAgIGRpZyA3CiAgICBieiBjcmVhdGVIZWFydGJlYXRfdGVybmFyeV9mYWxzZUAxMQogICAgaW50Y18wIC8vIDAKCmNyZWF0ZUhlYXJ0YmVhdF90ZXJuYXJ5X21lcmdlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjAKICAgIC8vIGhhcmQ6IG5ldyBVaW50NjQoaGFyZCksCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjEKICAgIC8vIGxvY2s6IG5ldyBVaW50NjQobG9jayksCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUyMwogICAgLy8gdGhpcy5oZWFydGJlYXRzKGhiaykudmFsdWVbaW5kZXhUb01vZGlmeV0gPSBuZXcgYXJjNEhlYXJ0YmVhdCh7CiAgICAvLyAgIGhlbGQsCiAgICAvLyAgIGhhcmQ6IG5ldyBVaW50NjQoaGFyZCksCiAgICAvLyAgIGxvY2s6IG5ldyBVaW50NjQobG9jayksCiAgICAvLyAgIHRpbWVzdGFtcCwKICAgIC8vIH0pCiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBkaWcgNwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQoKY3JlYXRlSGVhcnRiZWF0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5jcmVhdGVIZWFydGJlYXRAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ3MgogICAgLy8gY3JlYXRlSGVhcnRiZWF0KGFkZHJlc3M6IEFjY291bnQsIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZUhlYXJ0YmVhdF90ZXJuYXJ5X2ZhbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTcKICAgIC8vIGNvbnN0IGluZGV4VG9Nb2RpZnk6IHVpbnQ2NCA9IGkgPT09IDMgPyAwIDogaSArIDEKICAgIGRpZyAxMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGIgY3JlYXRlSGVhcnRiZWF0X3Rlcm5hcnlfbWVyZ2VAMTIKCmNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pZl9lbHNlQDEzOgogICAgZGlnIDkKICAgIGJ1cnkgMTEKICAgIGIgY3JlYXRlSGVhcnRiZWF0X3doaWxlX3RvcEA2CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zb2Z0Q2hlY2tbcm91dGluZ10oKSAtPiB2b2lkOgpzb2Z0Q2hlY2s6CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTI5CiAgICAvLyBzb2Z0Q2hlY2soYWRkcmVzczogQWNjb3VudCwgYXNzZXQ6IHVpbnQ2NCk6IFN0YWtlQ2hlY2sgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMAogICAgLy8gY29uc3Qgc2sgPSB7IGFkZHJlc3MsIGFzc2V0LCB0eXBlOiBTVEFLSU5HX1RZUEVfU09GVCB9CiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9TVEFLRV9ET0VTTlRfRVhJU1QpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDQwIDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9TVEFLRV9ET0VTTlRfRVhJU1QpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFN0YWtlIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMwogICAgLy8gY29uc3QgeyBhbW91bnQgfSA9IHRoaXMuc3Rha2VzKHNrKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTM0CiAgICAvLyBjb25zdCBsYXN0VXBkYXRlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MzYKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgYm56IHNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTM3CiAgICAvLyBjb25zdCB2YWxpZCA9IGFkZHJlc3MuYmFsYW5jZSA+PSBhbW91bnQKICAgIGRpZyA0CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgPD0KICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzOAogICAgLy8gaWYgKCF2YWxpZCkgewogICAgYm56IHNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTQwCiAgICAvLyBhbW91bnQ6IGFkZHJlc3MuYmFsYW5jZSwKICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MzktNTQzCiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogYWRkcmVzcy5iYWxhbmNlLAogICAgLy8gICBsYXN0VXBkYXRlLAogICAgLy8gICBleHBpcmF0aW9uOiAwLAogICAgLy8gfQogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NDIKICAgIC8vIGV4cGlyYXRpb246IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MzktNTQzCiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogYWRkcmVzcy5iYWxhbmNlLAogICAgLy8gICBsYXN0VXBkYXRlLAogICAgLy8gICBleHBpcmF0aW9uOiAwLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgc3dhcAogICAgYm94X3B1dAoKc29mdENoZWNrX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyByZXR1cm4geyB2YWxpZCwgYmFsYW5jZTogYWRkcmVzcy5iYWxhbmNlIH0KICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgYnl0ZWMgOSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDgKICAgIHNldGJpdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0Cgpzb2Z0Q2hlY2tfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnNvZnRDaGVja0A4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjkKICAgIC8vIHNvZnRDaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogU3Rha2VDaGVjayB7CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzb2Z0Q2hlY2tfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NDgKICAgIC8vIGNvbnN0IFtob2xkaW5nQW1vdW50LCBvcHRlZEluXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoYWRkcmVzcywgYXNzZXQpCiAgICBkaWcgNAogICAgZGlnIDQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gYXNzZXJ0KG9wdGVkSW4sIEVSUl9OT1RfT1BURURfSU4pCiAgICBhc3NlcnQgLy8gTm90IG9wdGVkIGluCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU1MAogICAgLy8gY29uc3QgdmFsaWQgPSBob2xkaW5nQW1vdW50ID49IGFtb3VudAogICAgPD0KICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU1MQogICAgLy8gaWYgKCF2YWxpZCkgewogICAgYm56IHNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTUyLTU1NgogICAgLy8gdGhpcy5zdGFrZXMoc2spLnZhbHVlID0gewogICAgLy8gICBhbW91bnQ6IGhvbGRpbmdBbW91bnQsCiAgICAvLyAgIGxhc3RVcGRhdGUsCiAgICAvLyAgIGV4cGlyYXRpb246IDAsCiAgICAvLyB9CiAgICBkaWcgNgogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NTUKICAgIC8vIGV4cGlyYXRpb246IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NTItNTU2CiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogaG9sZGluZ0Ftb3VudCwKICAgIC8vICAgbGFzdFVwZGF0ZSwKICAgIC8vICAgZXhwaXJhdGlvbjogMCwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKCnNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU1OQogICAgLy8gcmV0dXJuIHsgdmFsaWQsIGJhbGFuY2U6IGhvbGRpbmdBbW91bnQgfQogICAgYnl0ZWMgOSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDYKICAgIHNldGJpdAogICAgZGlnIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjkKICAgIC8vIHNvZnRDaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogU3Rha2VDaGVjayB7CiAgICBiIHNvZnRDaGVja19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc29mdENoZWNrQDgKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnVwZGF0ZVNldHRpbmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlU2V0dGluZ3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2MgogICAgLy8gdXBkYXRlU2V0dGluZ3MocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogdWludDY0LCB2YWx1ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBBc3NldChhc3NldCkuY3JlYXRvciwgRVJSX05PVF9BU1NFVF9DUkVBVE9SKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIGFzc2V0IGNyZWF0b3IgY2FuIGNhbGwgdGhpcyBtZXRob2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTY0LTU3MQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnNldHRpbmdzKGFzc2V0KS5leGlzdHMgPyAwIDogdGhpcy5tYnIoKS5zZXR0aW5ncywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2NwogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTY0LTU3MQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnNldHRpbmdzKGFzc2V0KS5leGlzdHMgPyAwIDogdGhpcy5tYnIoKS5zZXR0aW5ncywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NjgKICAgIC8vIGFtb3VudDogdGhpcy5zZXR0aW5ncyhhc3NldCkuZXhpc3RzID8gMCA6IHRoaXMubWJyKCkuc2V0dGluZ3MsCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkzCiAgICAvLyBzZXR0aW5ncyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTZXR0aW5ncyB9KQogICAgcHVzaGJ5dGVzICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTY4CiAgICAvLyBhbW91bnQ6IHRoaXMuc2V0dGluZ3MoYXNzZXQpLmV4aXN0cyA/IDAgOiB0aGlzLm1icigpLnNldHRpbmdzLAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiB1cGRhdGVTZXR0aW5nc190ZXJuYXJ5X2ZhbHNlQDMKICAgIGludGNfMCAvLyAwCgp1cGRhdGVTZXR0aW5nc190ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2NC01NzEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5zZXR0aW5ncyhhc3NldCkuZXhpc3RzID8gMCA6IHRoaXMubWJyKCkuc2V0dGluZ3MsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICA9PQogICAgZGlnIDMKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU3MwogICAgLy8gdGhpcy5zZXR0aW5ncyhhc3NldCkudmFsdWUgPSB2YWx1ZQogICAgZGlnIDMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2MgogICAgLy8gdXBkYXRlU2V0dGluZ3MocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogdWludDY0LCB2YWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp1cGRhdGVTZXR0aW5nc190ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2OAogICAgLy8gYW1vdW50OiB0aGlzLnNldHRpbmdzKGFzc2V0KS5leGlzdHMgPyAwIDogdGhpcy5tYnIoKS5zZXR0aW5ncywKICAgIHB1c2hpbnQgOTMwMCAvLyA5MzAwCiAgICBiIHVwZGF0ZVNldHRpbmdzX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcub3B0SW5Db3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODAKICAgIC8vIHJldHVybiB0b3RhbHNNQlIgKyBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIHB1c2hpbnQgMTI1MDAgLy8gMTI1MDAKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NzgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc3Rha2VDb3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKc3Rha2VDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODUKICAgIC8vIGNvbnN0IHsgc3Rha2VzLCBoZWFydGJlYXRzIH0gPSB0aGlzLm1icigpCiAgICBpbnRjIDQgLy8gMjg5MDAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTg2CiAgICAvLyBjb25zdCBzazogU3Rha2VLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIGFzc2V0LCB0eXBlIH0KICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU4NwogICAgLy8gY29uc3QgaXNVcGRhdGUgPSB0aGlzLnN0YWtlcyhzaykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTg5CiAgICAvLyBpZiAoaXNVcGRhdGUpIHsKICAgIGJ6IHN0YWtlQ29zdF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTkwCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKCnN0YWtlQ29zdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc3Rha2VDb3N0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU4MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzdGFrZUNvc3RfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1OTMKICAgIC8vIGlmICh0eXBlID09PSBTVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBkaWcgMQogICAgYnl0ZWMgNyAvLyAweDBhCiAgICA9PQogICAgYnogc3Rha2VDb3N0X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIHJldHVybiBzdGFrZXMgKyBoZWFydGJlYXRzCiAgICBpbnRjIDUgLy8gOTkwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTgzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgc3Rha2VDb3N0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNvc3RANgoKc3Rha2VDb3N0X2FmdGVyX2lmX2Vsc2VANToKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBzdGFrZUNvc3RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnN0YWtlQ29zdEA2CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRUaW1lTGVmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFRpbWVMZWZ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDIKICAgIC8vIGNvbnN0IHNrID0geyBhZGRyZXNzLCBhc3NldCwgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sgfQogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MjgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cyB8fCBHbG9iYWwubGF0ZXN0VGltZXN0YW1wID49IHRoaXMuc3Rha2VzKHNrKS52YWx1ZS5leHBpcmF0aW9uKSB7CiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDQwIDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYwMwogICAgLy8gaWYgKCF0aGlzLnN0YWtlcyhzaykuZXhpc3RzIHx8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPj0gdGhpcy5zdGFrZXMoc2spLnZhbHVlLmV4cGlyYXRpb24pIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0VGltZUxlZnRfaWZfYm9keUAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICA+PQogICAgYnogZ2V0VGltZUxlZnRfYWZ0ZXJfaWZfZWxzZUA0CgpnZXRUaW1lTGVmdF9pZl9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYwNAogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRUaW1lTGVmdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0VGltZUxlZnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjAwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldFRpbWVMZWZ0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjA3CiAgICAvLyByZXR1cm4gdGhpcy5zdGFrZXMoc2spLnZhbHVlLmV4cGlyYXRpb24gLSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRUaW1lTGVmdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0VGltZUxlZnRANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcubXVzdEdldFRpbWVMZWZ0W3JvdXRpbmddKCkgLT4gdm9pZDoKbXVzdEdldFRpbWVMZWZ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIGNvbnN0IHNrID0geyBhZGRyZXNzLCBhc3NldCwgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sgfQogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MjgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTMKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfTk9fTE9DSykKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiA4CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgNDAgMQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9OT19MT0NLKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBMb2NrIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTQKICAgIC8vIGFzc2VydChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgdGhpcy5zdGFrZXMoc2spLnZhbHVlLmV4cGlyYXRpb24sIEVSUl9MT0NLRUQpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIFRoaXMgYXNzZXQgaXMgc3RpbGwgbG9ja2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gcmV0dXJuIHRoaXMuc3Rha2VzKHNrKS52YWx1ZS5leHBpcmF0aW9uIC0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYxOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ2NCx1aW50OCkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjIwCiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgLi4uc3Rha2UgfQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYyMQogICAgLy8gaWYgKCF0aGlzLnN0YWtlcyhzaykuZXhpc3RzKSB7CiAgICBkdXAKICAgIGV4dHJhY3QgOSAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA4CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgOCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MjEKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0SW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyByZXR1cm4geyBhbW91bnQ6IDAsIGxhc3RVcGRhdGU6IDAsIGV4cGlyYXRpb246IDAgfQogICAgYnl0ZWMgMTMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmdldEluZm9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEluZm9ANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldEluZm9fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MjUKICAgIC8vIHJldHVybiB0aGlzLnN0YWtlcyhzaykudmFsdWUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgZ2V0SW5mb19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SW5mb0A0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5tdXN0R2V0SW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6Cm11c3RHZXRJbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MjgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yICh1aW50NjQsdWludDgpCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYzMAogICAgLy8gY29uc3Qgc2sgPSB7IGFkZHJlc3MsIC4uLnN0YWtlIH0KICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGV4dHJhY3QgOCAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfTk9fTE9DSykKICAgIGR1cAogICAgZXh0cmFjdCA5IDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA4IDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfTk9fTE9DSykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTG9jayBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjMzCiAgICAvLyByZXR1cm4gdGhpcy5zdGFrZXMoc2spLnZhbHVlCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjI4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEVzY3Jvd0luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRFc2Nyb3dJbmZvOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjM2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjM4CiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQsIHR5cGU6IFNUQUtJTkdfVFlQRV9IQVJEIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgZHVwCiAgICBieXRlYyA0IC8vIDB4MWUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzkKICAgIC8vIGNvbnN0IGxrID0geyBhZGRyZXNzLCBhc3NldCwgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sgfQogICAgc3dhcAogICAgYnl0ZWNfMiAvLyAweDI4CiAgICBjb25jYXQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyBsZXQgaGFyZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyBpZiAodGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NDIKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhzaykuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldEVzY3Jvd0luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY0MwogICAgLy8gaGFyZCA9IHRoaXMuc3Rha2VzKHNrKS52YWx1ZS5hbW91bnQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAyCgpnZXRFc2Nyb3dJbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQ2CiAgICAvLyBsZXQgbG9jazogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NDcKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhsaykuZXhpc3RzKSB7CiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY0NwogICAgLy8gaWYgKHRoaXMuc3Rha2VzKGxrKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0RXNjcm93SW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQ4CiAgICAvLyBsb2NrID0gdGhpcy5zdGFrZXMobGspLnZhbHVlLmFtb3VudAogICAgZGlnIDQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAoKZ2V0RXNjcm93SW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY1MQogICAgLy8gcmV0dXJuIHsgaGFyZCwgbG9jayB9CiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0SGVhcnRiZWF0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTYKICAgIC8vIGNvbnN0IGhiayA9IHsgYWRkcmVzcywgYXNzZXQgfQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY1NwogICAgLy8gaWYgKCF0aGlzLmhlYXJ0YmVhdHMoaGJrKS5leGlzdHMpIHsKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBleHRyYWN0IDMyIDgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4Ny04OQogICAgLy8gaGVhcnRiZWF0cyA9IEJveE1hcDxIZWFydGJlYXRLZXksIGFyYzQuU3RhdGljQXJyYXk8YXJjNEhlYXJ0YmVhdCwgND4+KHsKICAgIC8vICAga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4SGVhcnRiZWF0cywKICAgIC8vIH0pCiAgICBieXRlYyA1IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjU3CiAgICAvLyBpZiAoIXRoaXMuaGVhcnRiZWF0cyhoYmspLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0SGVhcnRiZWF0X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTgtNjYzCiAgICAvLyByZXR1cm4gbmV3IGFyYzQuU3RhdGljQXJyYXk8YXJjNEhlYXJ0YmVhdCwgND4oCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCksCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCksCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCksCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmdldEhlYXJ0YmVhdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY1NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRIZWFydGJlYXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIHJldHVybiB0aGlzLmhlYXJ0YmVhdHMoaGJrKS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRIZWFydGJlYXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5tdXN0R2V0SGVhcnRiZWF0W3JvdXRpbmddKCkgLT4gdm9pZDoKbXVzdEdldEhlYXJ0YmVhdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyBjb25zdCBoYmsgPSB7IGFkZHJlc3MsIGFzc2V0IH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIGFzc2VydCh0aGlzLmhlYXJ0YmVhdHMoaGJrKS5leGlzdHMsIEVSUl9IRUFSQkVBVF9OT1RfRk9VTkQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgZXh0cmFjdCAzMiA4CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODctODkKICAgIC8vIGhlYXJ0YmVhdHMgPSBCb3hNYXA8SGVhcnRiZWF0S2V5LCBhcmM0LlN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+Pih7CiAgICAvLyAgIGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeEhlYXJ0YmVhdHMsCiAgICAvLyB9KQogICAgYnl0ZWMgNSAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIGFzc2VydCh0aGlzLmhlYXJ0YmVhdHMoaGJrKS5leGlzdHMsIEVSUl9IRUFSQkVBVF9OT1RfRk9VTkQpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEhlYXJ0YmVhdCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjczCiAgICAvLyByZXR1cm4gdGhpcy5oZWFydGJlYXRzKGhiaykudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEhlYXJ0YmVhdEF2ZXJhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY3NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcubXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcwNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcwOAogICAgLy8gY29uc3QgaGJrID0geyBhZGRyZXNzLCBhc3NldCB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzA5CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIGV4dHJhY3QgMzIgOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzA5CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBIZWFydGJlYXQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcxMQogICAgLy8gY29uc3QgaGVhcnRiZWF0cyA9IGNsb25lKHRoaXMuaGVhcnRiZWF0cyhoYmspLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcxMwogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTQtNzE1CiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgIGR1cG4gMgoKbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2Vfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcxNQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IDQ7IGkgKz0gMSkgewogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPAogICAgYnogbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfd2hpbGVAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTcKICAgIC8vIGlmIChoZWFydGJlYXRzW2ldLnRpbWVzdGFtcC5hc1VpbnQ2NCgpID4gMCkgewogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDcKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzE4CiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIGlmIChpbmNsdWRlRXNjcm93ZWQpIHsKICAgIGRpZyA0CiAgICBieiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MjAKICAgIC8vIHRvdGFsICs9IGhlYXJ0YmVhdHNbaV0uaGVsZC5hc1VpbnQ2NCgpICsgaGVhcnRiZWF0c1tpXS5oYXJkLmFzVWludDY0KCkgKyBoZWFydGJlYXRzW2ldLmxvY2suYXNVaW50NjQoKQogICAgZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgMwoKbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV93aGlsZV90b3BAMgoKbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcyMgogICAgLy8gdG90YWwgKz0gaGVhcnRiZWF0c1tpXS5oZWxkLmFzVWludDY0KCkKICAgIGRpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICArCiAgICBidXJ5IDMKICAgIGIgbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUA4CgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl93aGlsZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIGlmIChjb3VudCA9PT0gMCkgewogICAgZGlnIDEKICAgIGJueiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcyOAogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcubXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcwNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MzEKICAgIC8vIHJldHVybiB0b3RhbCAvIGNvdW50CiAgICBkaWcgMgogICAgZGlnIDIKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzA2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLm11c3RHZXRIZWFydGJlYXRBdmVyYWdlQDEyCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRJbmZvTGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEluZm9MaXN0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDY0W10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczNgogICAgLy8gbGV0IHJlc3VsdHM6IFN0YWtlW10gPSBbXQogICAgYnl0ZWMgMTAgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczNwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmdldEluZm9MaXN0X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MzcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGdldEluZm9MaXN0X2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzM4CiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQ6IGFzc2V0c1tpXSwgdHlwZSB9CiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MzkKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczOQogICAgLy8gaWYgKCF0aGlzLnN0YWtlcyhzaykuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRJbmZvTGlzdF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzQ3CiAgICAvLyByZXN1bHRzLnB1c2goZW1wdHlTdGFrZSkKICAgIGRpZyAxCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzQxLTc0NQogICAgLy8gY29uc3QgZW1wdHlTdGFrZTogU3Rha2UgPSB7CiAgICAvLyAgIGFtb3VudDogMCwKICAgIC8vICAgbGFzdFVwZGF0ZTogMCwKICAgIC8vICAgZXhwaXJhdGlvbjogMCwKICAgIC8vIH0KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc0NwogICAgLy8gcmVzdWx0cy5wdXNoKGVtcHR5U3Rha2UpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDIKCmdldEluZm9MaXN0X2Jsb2NrQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczNwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGdldEluZm9MaXN0X3doaWxlX3RvcEAyCgpnZXRJbmZvTGlzdF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1MQogICAgLy8gcmVzdWx0cy5wdXNoKHRoaXMuc3Rha2VzKHNrKS52YWx1ZSkKICAgIGRpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDIKICAgIGIgZ2V0SW5mb0xpc3RfYmxvY2tANgoKZ2V0SW5mb0xpc3RfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5tdXN0R2V0SW5mb0xpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgptdXN0R2V0SW5mb0xpc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ2NFtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NTgKICAgIC8vIGxldCByZXN1bHRzOiBTdGFrZVtdID0gW10KICAgIGJ5dGVjIDEwIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgptdXN0R2V0SW5mb0xpc3Rfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogbXVzdEdldEluZm9MaXN0X2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzYwCiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQ6IGFzc2V0c1tpXSwgdHlwZSB9CiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNwogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9TVEFLRV9OT1RfRk9VTkQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDQwIDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfU1RBS0VfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBTdGFrZSBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzYyCiAgICAvLyByZXN1bHRzLnB1c2godGhpcy5zdGFrZXMoc2spLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgbXVzdEdldEluZm9MaXN0X3doaWxlX3RvcEAyCgptdXN0R2V0SW5mb0xpc3RfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzU2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNoZWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKc3Rha2VDaGVjazoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuKyh1aW50NjQsdWludDY0KVtdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgpzdGFrZUNoZWNrX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHN0YWtlQ2hlY2tfYWZ0ZXJfd2hpbGVAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzcwCiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQ6IGNoZWNrc1tpXS5hc3NldCwgdHlwZSB9CiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgaXRvYgogICAgZGlnIDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzEKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzEKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogc3Rha2VDaGVja19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzcyCiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCgpzdGFrZUNoZWNrX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNoZWNrQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgOSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlQ2hlY2tfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIGxldCBhbW91bnRUb0NoZWNrOiB1aW50NjQgPSB0aGlzLnN0YWtlcyhzaykudmFsdWUuYW1vdW50CiAgICBkaWcgOAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc3NgogICAgLy8gaWYgKHR5cGUgPT09IFNUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGRpZyAyCiAgICBieXRlYyA3IC8vIDB4MGEKICAgID09CiAgICBieiBzdGFrZUNoZWNrX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIGFtb3VudFRvQ2hlY2sgPSB0aGlzLmdldEhlYXJ0YmVhdEF2ZXJhZ2UoYWRkcmVzcywgY2hlY2tzW2ldLmFzc2V0LCBpbmNsdWRlRXNjcm93ZWQpCiAgICBkaWcgNQogICAgZGlnIDcKICAgIGRpZyAzCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZQogICAgYnVyeSA4CgpzdGFrZUNoZWNrX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzgwCiAgICAvLyBpZiAoY2hlY2tzW2ldLmFtb3VudCA+PSBhbW91bnRUb0NoZWNrKSB7CiAgICBkaWcgOQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPj0KICAgIGJ6IHN0YWtlQ2hlY2tfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc4MQogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBzdGFrZUNoZWNrX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNoZWNrQDExCgpzdGFrZUNoZWNrX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzY5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3Rha2VDaGVja193aGlsZV90b3BAMgoKc3Rha2VDaGVja19hZnRlcl93aGlsZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Nzg1CiAgICAvLyByZXR1cm4gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzY3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgc3Rha2VDaGVja19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc3Rha2VDaGVja0AxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0VG90YWxzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VG90YWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDY0W10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gbGV0IHJlc3VsdHM6IFRvdGFsc0luZm9bXSA9IFtdCiAgICBieXRlYyAxMCAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzkxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKZ2V0VG90YWxzX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3OTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGdldFRvdGFsc19hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc5MgogICAgLy8gcmVzdWx0cy5wdXNoKHRoaXMudG90YWxzKGFzc2V0c1tpXSkudmFsdWUpCiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3OTIKICAgIC8vIHJlc3VsdHMucHVzaCh0aGlzLnRvdGFscyhhc3NldHNbaV0pLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc5MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBnZXRUb3RhbHNfd2hpbGVfdG9wQDIKCmdldFRvdGFsc19hZnRlcl93aGlsZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDggLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlYyA4IC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcudXBkYXRlVG90YWxzKGFzc2V0OiB1aW50NjQsIHR5cGU6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCwgaXNBZGQ6IHVpbnQ2NCkgLT4gdm9pZDoKdXBkYXRlVG90YWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIHByaXZhdGUgdXBkYXRlVG90YWxzKGFzc2V0OiB1aW50NjQsIHR5cGU6IFN0YWtpbmdUeXBlLCBhbW91bnQ6IHVpbnQ2NCwgaXNBZGQ6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIGlmICh0eXBlID09PSBTVEFLSU5HX1RZUEVfSEFSRCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlYyA0IC8vIDB4MWUKICAgID09CiAgICBieiB1cGRhdGVUb3RhbHNfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBpZiAoaXNBZGQpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogdXBkYXRlVG90YWxzX2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmVzY3Jvd2VkICs9IGFtb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIHRoaXMudG90YWxzKGFzc2V0KS52YWx1ZS5lc2Nyb3dlZCArPSBhbW91bnQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzIgLy8gOAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCnVwZGF0ZVRvdGFsc19hZnRlcl9pZl9lbHNlQDExOgogICAgcmV0c3ViCgp1cGRhdGVUb3RhbHNfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmVzY3Jvd2VkIC09IGFtb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHRoaXMudG90YWxzKGFzc2V0KS52YWx1ZS5lc2Nyb3dlZCAtPSBhbW91bnQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpdG9iCiAgICBpbnRjXzIgLy8gOAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKdXBkYXRlVG90YWxzX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIH0gZWxzZSBpZiAodHlwZSA9PT0gU1RBS0lOR19UWVBFX0xPQ0spIHsKICAgIGZyYW1lX2RpZyAtMwogICAgYnl0ZWNfMiAvLyAweDI4CiAgICA9PQogICAgYnogdXBkYXRlVG90YWxzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBpZiAoaXNBZGQpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogdXBkYXRlVG90YWxzX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmxvY2tlZCArPSBhbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdG90YWxzID0gQm94TWFwPHVpbnQ2NCwgVG90YWxzSW5mbz4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhUb3RhbHMgfSkKICAgIGJ5dGVjIDYgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUubG9ja2VkICs9IGFtb3VudAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgp1cGRhdGVUb3RhbHNfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEyMAogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmxvY2tlZCAtPSBhbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdG90YWxzID0gQm94TWFwPHVpbnQ2NCwgVG90YWxzSW5mbz4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhUb3RhbHMgfSkKICAgIGJ5dGVjIDYgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUubG9ja2VkIC09IGFtb3VudAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGl0b2IKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlKGFkZHJlc3M6IGJ5dGVzLCBhc3NldDogdWludDY0LCBpbmNsdWRlRXNjcm93ZWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY3Ni02NzcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0SGVhcnRiZWF0QXZlcmFnZShhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0LCBpbmNsdWRlRXNjcm93ZWQ6IGJvb2xlYW4pOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Njc4CiAgICAvLyBjb25zdCBoYmsgPSB7IGFkZHJlc3MsIGFzc2V0IH0KICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjgwCiAgICAvLyBpZiAoIXRoaXMuaGVhcnRiZWF0cyhoYmspLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIGV4dHJhY3QgMzIgOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODAKICAgIC8vIGlmICghdGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4MQogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Njg0CiAgICAvLyBjb25zdCBoZWFydGJlYXRzID0gY2xvbmUodGhpcy5oZWFydGJlYXRzKGhiaykudmFsdWUpCiAgICBmcmFtZV9kaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODcKICAgIC8vIGxldCBjb3VudDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBoZWFydGJlYXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2Vfd2hpbGVfdG9wQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGhlYXJ0YmVhdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDQgLy8gNAogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX3doaWxlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4OQogICAgLy8gaWYgKGhlYXJ0YmVhdHNbaV0udGltZXN0YW1wLmFzVWludDY0KCkgPiAwKSB7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2OTAKICAgIC8vIGNvdW50ICs9IDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY5MQogICAgLy8gaWYgKGluY2x1ZGVFc2Nyb3dlZCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2VfZWxzZV9ib2R5QDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjkyCiAgICAvLyB0b3RhbCArPSBoZWFydGJlYXRzW2ldLmhlbGQuYXNVaW50NjQoKSArIGhlYXJ0YmVhdHNbaV0uaGFyZC5hc1VpbnQ2NCgpICsgaGVhcnRiZWF0c1tpXS5sb2NrLmFzVWludDY0KCkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIGZyYW1lX2RpZyA0CiAgICArCiAgICBmcmFtZV9idXJ5IDQKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGhlYXJ0YmVhdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV93aGlsZV90b3BAMwoKc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2OTQKICAgIC8vIHRvdGFsICs9IGhlYXJ0YmVhdHNbaV0uaGVsZC5hc1VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDkKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl93aGlsZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Njk5CiAgICAvLyBpZiAoY291bnQgPT09IDApIHsKICAgIGZyYW1lX2RpZyAyCiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzAzCiAgICAvLyByZXR1cm4gdG90YWwgLyBjb3VudAogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=\",\"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 Escrow = {\n hard: bigint,\n lock: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Escrow to the struct representation\n */\nexport function EscrowFromTuple(abiTuple: [bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Escrow, APP_SPEC.structs) as Escrow\n}\n\nexport type HeartbeatKey = {\n address: string,\n asset: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a HeartbeatKey to the struct representation\n */\nexport function HeartbeatKeyFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.HeartbeatKey, APP_SPEC.structs) as HeartbeatKey\n}\n\nexport type Stake = {\n amount: bigint,\n lastUpdate: bigint,\n expiration: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Stake to the struct representation\n */\nexport function StakeFromTuple(abiTuple: [bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Stake, APP_SPEC.structs) as Stake\n}\n\nexport type StakeCheck = {\n valid: boolean,\n balance: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakeCheck to the struct representation\n */\nexport function StakeCheckFromTuple(abiTuple: [boolean, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakeCheck, APP_SPEC.structs) as StakeCheck\n}\n\nexport type StakeInfo = {\n asset: bigint,\n type: number\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakeInfo to the struct representation\n */\nexport function StakeInfoFromTuple(abiTuple: [bigint, number]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakeInfo, APP_SPEC.structs) as StakeInfo\n}\n\nexport type StakeKey = {\n address: string,\n asset: bigint,\n type: number\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakeKey to the struct representation\n */\nexport function StakeKeyFromTuple(abiTuple: [string, bigint, number]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakeKey, APP_SPEC.structs) as StakeKey\n}\n\nexport type TotalsInfo = {\n locked: bigint,\n escrowed: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a TotalsInfo to the struct representation\n */\nexport function TotalsInfoFromTuple(abiTuple: [bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.TotalsInfo, APP_SPEC.structs) as TotalsInfo\n}\n\n/**\n * The argument types for the Staking contract\n */\nexport type StakingArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint64)void': {\n version: string\n akitaDao: bigint | number\n }\n 'init()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 'stake(pay,uint8,uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n type: bigint | number\n amount: bigint | number\n expiration: bigint | number\n }\n 'stakeAsa(pay,axfer,uint8,uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n type: bigint | number\n amount: bigint | number\n expiration: bigint | number\n }\n 'withdraw(uint64,uint8)void': {\n asset: bigint | number\n type: bigint | number\n }\n 'createHeartbeat(address,uint64)void': {\n address: string\n asset: bigint | number\n }\n 'softCheck(address,uint64)(bool,uint64)': {\n address: string\n asset: bigint | number\n }\n 'updateSettings(pay,uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n asset: bigint | number\n value: bigint | number\n }\n 'optInCost()uint64': Record<string, never>\n 'stakeCost(uint64,uint8)uint64': {\n asset: bigint | number\n type: bigint | number\n }\n 'getTimeLeft(address,uint64)uint64': {\n address: string\n asset: bigint | number\n }\n 'mustGetTimeLeft(address,uint64)uint64': {\n address: string\n asset: bigint | number\n }\n 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)': {\n address: string\n stake: StakeInfo\n }\n 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)': {\n address: string\n stake: StakeInfo\n }\n 'getEscrowInfo(address,uint64)(uint64,uint64)': {\n address: string\n asset: bigint | number\n }\n 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': {\n address: string\n asset: bigint | number\n }\n 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': {\n address: string\n asset: bigint | number\n }\n 'getHeartbeatAverage(address,uint64,bool)uint64': {\n address: string\n asset: bigint | number\n includeEscrowed: boolean\n }\n 'mustGetHeartbeatAverage(address,uint64,bool)uint64': {\n address: string\n asset: bigint | number\n includeEscrowed: boolean\n }\n 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': {\n address: string\n type: bigint | number\n assets: bigint[] | number[]\n }\n 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': {\n address: string\n type: bigint | number\n assets: bigint[] | number[]\n }\n 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool': {\n address: string\n checks: [bigint | number, bigint | number][]\n type: bigint | number\n includeEscrowed: boolean\n }\n 'getTotals(uint64[])(uint64,uint64)[]': {\n assets: bigint[] | number[]\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,uint64)void': [version: string, akitaDao: bigint | number]\n 'init()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'stake(pay,uint8,uint64,uint64)void': [payment: AppMethodCallTransactionArgument, type: bigint | number, amount: bigint | number, expiration: bigint | number]\n 'stakeAsa(pay,axfer,uint8,uint64,uint64)void': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, type: bigint | number, amount: bigint | number, expiration: bigint | number]\n 'withdraw(uint64,uint8)void': [asset: bigint | number, type: bigint | number]\n 'createHeartbeat(address,uint64)void': [address: string, asset: bigint | number]\n 'softCheck(address,uint64)(bool,uint64)': [address: string, asset: bigint | number]\n 'updateSettings(pay,uint64,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number, value: bigint | number]\n 'optInCost()uint64': []\n 'stakeCost(uint64,uint8)uint64': [asset: bigint | number, type: bigint | number]\n 'getTimeLeft(address,uint64)uint64': [address: string, asset: bigint | number]\n 'mustGetTimeLeft(address,uint64)uint64': [address: string, asset: bigint | number]\n 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)': [address: string, stake: StakeInfo]\n 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)': [address: string, stake: StakeInfo]\n 'getEscrowInfo(address,uint64)(uint64,uint64)': [address: string, asset: bigint | number]\n 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [address: string, asset: bigint | number]\n 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [address: string, asset: bigint | number]\n 'getHeartbeatAverage(address,uint64,bool)uint64': [address: string, asset: bigint | number, includeEscrowed: boolean]\n 'mustGetHeartbeatAverage(address,uint64,bool)uint64': [address: string, asset: bigint | number, includeEscrowed: boolean]\n 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [address: string, type: bigint | number, assets: bigint[] | number[]]\n 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [address: string, type: bigint | number, assets: bigint[] | number[]]\n 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool': [address: string, checks: [bigint | number, bigint | number][], type: bigint | number, includeEscrowed: boolean]\n 'getTotals(uint64[])(uint64,uint64)[]': [assets: bigint[] | number[]]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type StakingReturns = {\n 'create(string,uint64)void': void\n 'init()void': void\n 'optIn(pay,uint64)void': void\n 'stake(pay,uint8,uint64,uint64)void': void\n 'stakeAsa(pay,axfer,uint8,uint64,uint64)void': void\n 'withdraw(uint64,uint8)void': void\n 'createHeartbeat(address,uint64)void': void\n 'softCheck(address,uint64)(bool,uint64)': StakeCheck\n 'updateSettings(pay,uint64,uint64)void': void\n 'optInCost()uint64': bigint\n 'stakeCost(uint64,uint8)uint64': bigint\n 'getTimeLeft(address,uint64)uint64': bigint\n 'mustGetTimeLeft(address,uint64)uint64': bigint\n 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)': Stake\n 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)': Stake\n 'getEscrowInfo(address,uint64)(uint64,uint64)': Escrow\n 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]\n 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]\n 'getHeartbeatAverage(address,uint64,bool)uint64': bigint\n 'mustGetHeartbeatAverage(address,uint64,bool)uint64': bigint\n 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [bigint, bigint, bigint][]\n 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [bigint, bigint, bigint][]\n 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool': boolean\n 'getTotals(uint64[])(uint64,uint64)[]': [bigint, bigint][]\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the Staking smart contract.\n */\nexport type StakingTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint64)void' | 'create', {\n argsObj: StakingArgs['obj']['create(string,uint64)void']\n argsTuple: StakingArgs['tuple']['create(string,uint64)void']\n returns: StakingReturns['create(string,uint64)void']\n }>\n & Record<'init()void' | 'init', {\n argsObj: StakingArgs['obj']['init()void']\n argsTuple: StakingArgs['tuple']['init()void']\n returns: StakingReturns['init()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: StakingArgs['obj']['optIn(pay,uint64)void']\n argsTuple: StakingArgs['tuple']['optIn(pay,uint64)void']\n returns: StakingReturns['optIn(pay,uint64)void']\n }>\n & Record<'stake(pay,uint8,uint64,uint64)void' | 'stake', {\n argsObj: StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void']\n argsTuple: StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']\n returns: StakingReturns['stake(pay,uint8,uint64,uint64)void']\n }>\n & Record<'stakeAsa(pay,axfer,uint8,uint64,uint64)void' | 'stakeAsa', {\n argsObj: StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']\n argsTuple: StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']\n returns: StakingReturns['stakeAsa(pay,axfer,uint8,uint64,uint64)void']\n }>\n & Record<'withdraw(uint64,uint8)void' | 'withdraw', {\n argsObj: StakingArgs['obj']['withdraw(uint64,uint8)void']\n argsTuple: StakingArgs['tuple']['withdraw(uint64,uint8)void']\n returns: StakingReturns['withdraw(uint64,uint8)void']\n }>\n & Record<'createHeartbeat(address,uint64)void' | 'createHeartbeat', {\n argsObj: StakingArgs['obj']['createHeartbeat(address,uint64)void']\n argsTuple: StakingArgs['tuple']['createHeartbeat(address,uint64)void']\n returns: StakingReturns['createHeartbeat(address,uint64)void']\n }>\n & Record<'softCheck(address,uint64)(bool,uint64)' | 'softCheck', {\n argsObj: StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)']\n argsTuple: StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']\n returns: StakingReturns['softCheck(address,uint64)(bool,uint64)']\n }>\n & Record<'updateSettings(pay,uint64,uint64)void' | 'updateSettings', {\n argsObj: StakingArgs['obj']['updateSettings(pay,uint64,uint64)void']\n argsTuple: StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']\n returns: StakingReturns['updateSettings(pay,uint64,uint64)void']\n }>\n & Record<'optInCost()uint64' | 'optInCost', {\n argsObj: StakingArgs['obj']['optInCost()uint64']\n argsTuple: StakingArgs['tuple']['optInCost()uint64']\n returns: StakingReturns['optInCost()uint64']\n }>\n & Record<'stakeCost(uint64,uint8)uint64' | 'stakeCost', {\n argsObj: StakingArgs['obj']['stakeCost(uint64,uint8)uint64']\n argsTuple: StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']\n returns: StakingReturns['stakeCost(uint64,uint8)uint64']\n }>\n & Record<'getTimeLeft(address,uint64)uint64' | 'getTimeLeft', {\n argsObj: StakingArgs['obj']['getTimeLeft(address,uint64)uint64']\n argsTuple: StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']\n returns: StakingReturns['getTimeLeft(address,uint64)uint64']\n }>\n & Record<'mustGetTimeLeft(address,uint64)uint64' | 'mustGetTimeLeft', {\n argsObj: StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64']\n argsTuple: StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']\n returns: StakingReturns['mustGetTimeLeft(address,uint64)uint64']\n }>\n & Record<'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)' | 'getInfo', {\n argsObj: StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n argsTuple: StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n returns: StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }>\n & Record<'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)' | 'mustGetInfo', {\n argsObj: StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n argsTuple: StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n returns: StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }>\n & Record<'getEscrowInfo(address,uint64)(uint64,uint64)' | 'getEscrowInfo', {\n argsObj: StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)']\n argsTuple: StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']\n returns: StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)']\n }>\n & Record<'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' | 'getHeartbeat', {\n argsObj: StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n argsTuple: StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n returns: StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }>\n & Record<'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' | 'mustGetHeartbeat', {\n argsObj: StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n argsTuple: StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n returns: StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }>\n & Record<'getHeartbeatAverage(address,uint64,bool)uint64' | 'getHeartbeatAverage', {\n argsObj: StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64']\n argsTuple: StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']\n returns: StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64']\n }>\n & Record<'mustGetHeartbeatAverage(address,uint64,bool)uint64' | 'mustGetHeartbeatAverage', {\n argsObj: StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n argsTuple: StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n returns: StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n }>\n & Record<'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' | 'getInfoList', {\n argsObj: StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n argsTuple: StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n returns: StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }>\n & Record<'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' | 'mustGetInfoList', {\n argsObj: StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n argsTuple: StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n returns: StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }>\n & Record<'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool' | 'stakeCheck', {\n argsObj: StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n argsTuple: StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n returns: StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n }>\n & Record<'getTotals(uint64[])(uint64,uint64)[]' | 'getTotals', {\n argsObj: StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]']\n argsTuple: StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']\n returns: StakingReturns['getTotals(uint64[])(uint64,uint64)[]']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: StakingArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: StakingArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: StakingReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: StakingArgs['obj']['opUp()void']\n argsTuple: StakingArgs['tuple']['opUp()void']\n returns: StakingReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * The address that is allowed to call the 'beat' method to create heartbeat records\n */\n heartbeatManagerAddress: string\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 maps: {\n stakes: Map<StakeKey, Stake>\n heartbeats: Map<HeartbeatKey, [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]>\n totals: Map<bigint | number, TotalsInfo>\n settings: Map<bigint | number, bigint>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type StakingSignatures = keyof StakingTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type StakingNonVoidMethodSignatures = keyof StakingTypes['methods'] extends infer T ? T extends keyof StakingTypes['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 Staking smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends StakingSignatures> = StakingTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Staking smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends StakingSignatures> = StakingTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = StakingTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = StakingTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type StakingCreateCallParams =\n | Expand<CallParams<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & {method: 'create(string,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type StakingDeployParams = 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?: StakingCreateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Staking smart contract\n */\nexport abstract class StakingParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends StakingCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint64)void':\n return StakingParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Staking smart contract using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.akitaDao],\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<StakingArgs['obj']['init()void'] | StakingArgs['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\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['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 stake(pay,uint8,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stake(params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stake(pay,uint8,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.type, params.args.amount, params.args.expiration],\n }\n }\n /**\n * Constructs a no op call for the stakeAsa(pay,axfer,uint8,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stakeAsa(params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stakeAsa(pay,axfer,uint8,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.type, params.args.amount, params.args.expiration],\n }\n }\n /**\n * Constructs a no op call for the withdraw(uint64,uint8)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static withdraw(params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'withdraw(uint64,uint8)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the createHeartbeat(address,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createHeartbeat(params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createHeartbeat(address,uint64)void' 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 softCheck(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 softCheck(params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'softCheck(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 updateSettings(pay,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateSettings(params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateSettings(pay,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset, params.args.value],\n }\n }\n /**\n * Constructs a no op call for the optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost()uint64' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the stakeCost(uint64,uint8)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stakeCost(params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stakeCost(uint64,uint8)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the getTimeLeft(address,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getTimeLeft(params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getTimeLeft(address,uint64)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 mustGetTimeLeft(address,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mustGetTimeLeft(params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetTimeLeft(address,uint64)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 getInfo(address,(uint64,uint8))(uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getInfo(params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.stake],\n }\n }\n /**\n * Constructs a no op call for the mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mustGetInfo(params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.stake],\n }\n }\n /**\n * Constructs a no op call for the getEscrowInfo(address,uint64)(uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getEscrowInfo(params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getEscrowInfo(address,uint64)(uint64,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 getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getHeartbeat(params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' 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 mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mustGetHeartbeat(params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' 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 getHeartbeatAverage(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 getHeartbeatAverage(params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getHeartbeatAverage(address,uint64,bool)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.asset, params.args.includeEscrowed],\n }\n }\n /**\n * Constructs a no op call for the mustGetHeartbeatAverage(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 mustGetHeartbeatAverage(params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetHeartbeatAverage(address,uint64,bool)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.asset, params.args.includeEscrowed],\n }\n }\n /**\n * Constructs a no op call for the getInfoList(address,uint8,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 getInfoList(params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.type, params.args.assets],\n }\n }\n /**\n * Constructs a no op call for the mustGetInfoList(address,uint8,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 mustGetInfoList(params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.type, params.args.assets],\n }\n }\n /**\n * Constructs a no op call for the stakeCheck(address,(uint64,uint64)[],uint8,bool)bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stakeCheck(params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.checks, params.args.type, params.args.includeEscrowed],\n }\n }\n /**\n * Constructs a no op call for the getTotals(uint64[])(uint64,uint64)[] ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getTotals(params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getTotals(uint64[])(uint64,uint64)[]' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assets],\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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['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<StakingArgs['obj']['opUp()void'] | StakingArgs['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 Staking smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class StakingFactory {\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 `StakingFactory`\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 StakingClient(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 StakingClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Staking 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: StakingDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? StakingParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (StakingCreateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new StakingClient(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 Staking smart contract using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(StakingParamsFactory.create.create(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 Staking smart contract using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(StakingParamsFactory.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 Staking smart contract using an ABI method call using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(StakingParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | StakingReturns['create(string,uint64)void']) }, appClient: new StakingClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Staking smart contract\n */\nexport class StakingClient {\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 `StakingClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Staking app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `StakingClient`\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 StakingNonVoidMethodSignatures>(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 `StakingClient` 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<StakingClient> {\n return new StakingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `StakingClient` 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<StakingClient> {\n return new StakingClient(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 * Makes a clear_state call to an existing instance of the Staking 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 Staking 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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stake(pay,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n stake: (params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stake(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeAsa(pay,axfer,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n stakeAsa: (params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stakeAsa(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `withdraw(uint64,uint8)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n withdraw: (params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `createHeartbeat(address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createHeartbeat: (params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.createHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `softCheck(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n softCheck: (params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.softCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `updateSettings(pay,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateSettings: (params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.updateSettings(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost: (params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stakeCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call params\n */\n getTimeLeft: (params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call params\n */\n mustGetTimeLeft: (params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n getInfo: (params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n mustGetInfo: (params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n getEscrowInfo: (params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getEscrowInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat: (params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat: (params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage: (params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage: (params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n getInfoList: (params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n mustGetInfoList: (params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n stakeCheck: (params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stakeCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTotals(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\n */\n getTotals: (params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getTotals(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Makes a clear_state call to an existing instance of the Staking 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 Staking 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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stake(pay,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n stake: (params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stake(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeAsa(pay,axfer,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n stakeAsa: (params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stakeAsa(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `withdraw(uint64,uint8)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n withdraw: (params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `createHeartbeat(address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createHeartbeat: (params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.createHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `softCheck(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n softCheck: (params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.softCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `updateSettings(pay,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateSettings: (params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.updateSettings(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost: (params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stakeCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call transaction\n */\n getTimeLeft: (params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call transaction\n */\n mustGetTimeLeft: (params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n getInfo: (params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n mustGetInfo: (params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n getEscrowInfo: (params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getEscrowInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat: (params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat: (params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage: (params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage: (params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n getInfoList: (params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n mustGetInfoList: (params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n stakeCheck: (params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stakeCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTotals(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\n */\n getTotals: (params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getTotals(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Makes a clear_state call to an existing instance of the Staking 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 Staking 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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.init(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['init()void'])}\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stake(pay,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n stake: async (params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stake(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stake(pay,uint8,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeAsa(pay,axfer,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n stakeAsa: async (params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeAsa(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stakeAsa(pay,axfer,uint8,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `withdraw(uint64,uint8)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n withdraw: async (params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.withdraw(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['withdraw(uint64,uint8)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `createHeartbeat(address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createHeartbeat: async (params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.createHeartbeat(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['createHeartbeat(address,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `softCheck(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n softCheck: async (params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.softCheck(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['softCheck(address,uint64)(bool,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `updateSettings(pay,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateSettings: async (params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.updateSettings(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['updateSettings(pay,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['optInCost()uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost: async (params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stakeCost(uint64,uint8)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n getTimeLeft: async (params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getTimeLeft(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getTimeLeft(address,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n mustGetTimeLeft: async (params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetTimeLeft(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetTimeLeft(address,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n getInfo: async (params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfo(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n mustGetInfo: async (params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfo(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n getEscrowInfo: async (params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getEscrowInfo(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat: async (params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeat(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat: async (params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeat(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage: async (params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeatAverage(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage: async (params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n getInfoList: async (params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfoList(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n mustGetInfoList: async (params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfoList(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n stakeCheck: async (params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCheck(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTotals(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\n */\n getTotals: async (params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getTotals(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getTotals(uint64[])(uint64,uint64)[]'])}\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['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 StakingClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> = {args: []}) {\n const result = await this.appClient.send.call(StakingParamsFactory.optInCost(params))\n return result.return as unknown as StakingReturns['optInCost()uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost(params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCost(params))\n return result.return as unknown as StakingReturns['stakeCost(uint64,uint8)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n async getTimeLeft(params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getTimeLeft(params))\n return result.return as unknown as StakingReturns['getTimeLeft(address,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n async mustGetTimeLeft(params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetTimeLeft(params))\n return result.return as unknown as StakingReturns['mustGetTimeLeft(address,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n async getInfo(params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfo(params))\n return result.return as unknown as StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n async mustGetInfo(params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfo(params))\n return result.return as unknown as StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n async getEscrowInfo(params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getEscrowInfo(params))\n return result.return as unknown as StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat(params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeat(params))\n return result.return as unknown as StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat(params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeat(params))\n return result.return as unknown as StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage(params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeatAverage(params))\n return result.return as unknown as StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage(params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n return result.return as unknown as StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n async getInfoList(params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfoList(params))\n return result.return as unknown as StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n async mustGetInfoList(params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfoList(params))\n return result.return as unknown as StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n async stakeCheck(params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCheck(params))\n return result.return as unknown as StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getTotals(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\n */\n async getTotals(params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getTotals(params))\n return result.return as unknown as StakingReturns['getTotals(uint64[])(uint64,uint64)[]']\n }\n\n /**\n * Methods to access state for the current Staking app\n */\n state = {\n /**\n * Methods to access global state for the current Staking 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 heartbeatManagerAddress: result.heartbeatManagerAddress,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the heartbeatManagerAddress key in global state\n */\n heartbeatManagerAddress: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"heartbeatManagerAddress\")) as string | 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 Staking 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 stakes map in box state\n */\n stakes: {\n /**\n * Get all current values of the stakes map in box state\n */\n getMap: async (): Promise<Map<StakeKey, Stake>> => { return (await this.appClient.state.box.getMap(\"stakes\")) as Map<StakeKey, Stake> },\n /**\n * Get a current value of the stakes map by key from box state\n */\n value: async (key: StakeKey): Promise<Stake | undefined> => { return await this.appClient.state.box.getMapValue(\"stakes\", key) as Stake | undefined },\n },\n /**\n * Get values from the heartbeats map in box state\n */\n heartbeats: {\n /**\n * Get all current values of the heartbeats map in box state\n */\n getMap: async (): Promise<Map<HeartbeatKey, [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]>> => { return (await this.appClient.state.box.getMap(\"heartbeats\")) as Map<HeartbeatKey, [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]> },\n /**\n * Get a current value of the heartbeats map by key from box state\n */\n value: async (key: HeartbeatKey): Promise<[[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]] | undefined> => { return await this.appClient.state.box.getMapValue(\"heartbeats\", key) as [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]] | undefined },\n },\n /**\n * Get values from the totals map in box state\n */\n totals: {\n /**\n * Get all current values of the totals map in box state\n */\n getMap: async (): Promise<Map<bigint, TotalsInfo>> => { return (await this.appClient.state.box.getMap(\"totals\")) as Map<bigint, TotalsInfo> },\n /**\n * Get a current value of the totals map by key from box state\n */\n value: async (key: bigint | number): Promise<TotalsInfo | undefined> => { return await this.appClient.state.box.getMapValue(\"totals\", key) as TotalsInfo | undefined },\n },\n /**\n * Get values from the settings map in box state\n */\n settings: {\n /**\n * Get all current values of the settings map in box state\n */\n getMap: async (): Promise<Map<bigint, bigint>> => { return (await this.appClient.state.box.getMap(\"settings\")) as Map<bigint, bigint> },\n /**\n * Get a current value of the settings map by key from box state\n */\n value: async (key: bigint | number): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"settings\", key) as bigint | undefined },\n },\n },\n }\n\n public newGroup(): StakingComposer {\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 Staking contract\n */\n init(params: CallParams<StakingArgs['obj']['init()void'] | StakingArgs['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 Staking contract\n */\n optIn(params: CallParams<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['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 stake(pay,uint8,uint64,uint64)void method call against the Staking contract\n */\n stake(params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stake(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a stakeAsa(pay,axfer,uint8,uint64,uint64)void method call against the Staking contract\n */\n stakeAsa(params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a withdraw(uint64,uint8)void method call against the Staking contract\n */\n withdraw(params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdraw(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a createHeartbeat(address,uint64)void method call against the Staking contract\n */\n createHeartbeat(params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createHeartbeat(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a softCheck(address,uint64)(bool,uint64) method call against the Staking contract\n */\n softCheck(params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.softCheck(params)))\n resultMappers.push((v) => client.decodeReturnValue('softCheck(address,uint64)(bool,uint64)', v))\n return this\n },\n /**\n * Add a updateSettings(pay,uint64,uint64)void method call against the Staking contract\n */\n updateSettings(params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateSettings(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optInCost()uint64 method call against the Staking contract\n */\n optInCost(params: CallParams<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost()uint64', v))\n return this\n },\n /**\n * Add a stakeCost(uint64,uint8)uint64 method call against the Staking contract\n */\n stakeCost(params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('stakeCost(uint64,uint8)uint64', v))\n return this\n },\n /**\n * Add a getTimeLeft(address,uint64)uint64 method call against the Staking contract\n */\n getTimeLeft(params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTimeLeft(params)))\n resultMappers.push((v) => client.decodeReturnValue('getTimeLeft(address,uint64)uint64', v))\n return this\n },\n /**\n * Add a mustGetTimeLeft(address,uint64)uint64 method call against the Staking contract\n */\n mustGetTimeLeft(params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetTimeLeft(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetTimeLeft(address,uint64)uint64', v))\n return this\n },\n /**\n * Add a getInfo(address,(uint64,uint8))(uint64,uint64,uint64) method call against the Staking contract\n */\n getInfo(params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getInfo(params)))\n resultMappers.push((v) => client.decodeReturnValue('getInfo(address,(uint64,uint8))(uint64,uint64,uint64)', v))\n return this\n },\n /**\n * Add a mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64) method call against the Staking contract\n */\n mustGetInfo(params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetInfo(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)', v))\n return this\n },\n /**\n * Add a getEscrowInfo(address,uint64)(uint64,uint64) method call against the Staking contract\n */\n getEscrowInfo(params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getEscrowInfo(params)))\n resultMappers.push((v) => client.decodeReturnValue('getEscrowInfo(address,uint64)(uint64,uint64)', v))\n return this\n },\n /**\n * Add a getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] method call against the Staking contract\n */\n getHeartbeat(params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getHeartbeat(params)))\n resultMappers.push((v) => client.decodeReturnValue('getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]', v))\n return this\n },\n /**\n * Add a mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] method call against the Staking contract\n */\n mustGetHeartbeat(params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetHeartbeat(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]', v))\n return this\n },\n /**\n * Add a getHeartbeatAverage(address,uint64,bool)uint64 method call against the Staking contract\n */\n getHeartbeatAverage(params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getHeartbeatAverage(params)))\n resultMappers.push((v) => client.decodeReturnValue('getHeartbeatAverage(address,uint64,bool)uint64', v))\n return this\n },\n /**\n * Add a mustGetHeartbeatAverage(address,uint64,bool)uint64 method call against the Staking contract\n */\n mustGetHeartbeatAverage(params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetHeartbeatAverage(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetHeartbeatAverage(address,uint64,bool)uint64', v))\n return this\n },\n /**\n * Add a getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[] method call against the Staking contract\n */\n getInfoList(params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getInfoList(params)))\n resultMappers.push((v) => client.decodeReturnValue('getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]', v))\n return this\n },\n /**\n * Add a mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[] method call against the Staking contract\n */\n mustGetInfoList(params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetInfoList(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]', v))\n return this\n },\n /**\n * Add a stakeCheck(address,(uint64,uint64)[],uint8,bool)bool method call against the Staking contract\n */\n stakeCheck(params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeCheck(params)))\n resultMappers.push((v) => client.decodeReturnValue('stakeCheck(address,(uint64,uint64)[],uint8,bool)bool', v))\n return this\n },\n /**\n * Add a getTotals(uint64[])(uint64,uint64)[] method call against the Staking contract\n */\n getTotals(params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTotals(params)))\n resultMappers.push((v) => client.decodeReturnValue('getTotals(uint64[])(uint64,uint64)[]', v))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Staking contract\n */\n updateAkitaDao(params: CallParams<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['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 Staking contract\n */\n opUp(params: CallParams<StakingArgs['obj']['opUp()void'] | StakingArgs['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 clear state call to the Staking 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 StakingComposer\n }\n}\nexport type StakingComposer<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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']>): StakingComposer<[...TReturns, StakingReturns['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\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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the stake(pay,uint8,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 stake(params?: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['stake(pay,uint8,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the stakeAsa(pay,axfer,uint8,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 stakeAsa(params?: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the withdraw(uint64,uint8)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 withdraw(params?: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']>): StakingComposer<[...TReturns, StakingReturns['withdraw(uint64,uint8)void'] | undefined]>\n\n /**\n * Calls the createHeartbeat(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 createHeartbeat(params?: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['createHeartbeat(address,uint64)void'] | undefined]>\n\n /**\n * Calls the softCheck(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 softCheck(params?: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']>): StakingComposer<[...TReturns, StakingReturns['softCheck(address,uint64)(bool,uint64)'] | undefined]>\n\n /**\n * Calls the updateSettings(pay,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 updateSettings(params?: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['updateSettings(pay,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']>): StakingComposer<[...TReturns, StakingReturns['optInCost()uint64'] | undefined]>\n\n /**\n * Calls the stakeCost(uint64,uint8)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 stakeCost(params?: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']>): StakingComposer<[...TReturns, StakingReturns['stakeCost(uint64,uint8)uint64'] | undefined]>\n\n /**\n * Calls the getTimeLeft(address,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 getTimeLeft(params?: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']>): StakingComposer<[...TReturns, StakingReturns['getTimeLeft(address,uint64)uint64'] | undefined]>\n\n /**\n * Calls the mustGetTimeLeft(address,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 mustGetTimeLeft(params?: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']>): StakingComposer<[...TReturns, StakingReturns['mustGetTimeLeft(address,uint64)uint64'] | undefined]>\n\n /**\n * Calls the getInfo(address,(uint64,uint8))(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 getInfo(params?: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>): StakingComposer<[...TReturns, StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Calls the mustGetInfo(address,(uint64,uint8))(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 mustGetInfo(params?: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>): StakingComposer<[...TReturns, StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Calls the getEscrowInfo(address,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 getEscrowInfo(params?: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']>): StakingComposer<[...TReturns, StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)'] | undefined]>\n\n /**\n * Calls the getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] 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 getHeartbeat(params?: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>): StakingComposer<[...TReturns, StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | undefined]>\n\n /**\n * Calls the mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] 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 mustGetHeartbeat(params?: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>): StakingComposer<[...TReturns, StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | undefined]>\n\n /**\n * Calls the getHeartbeatAverage(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 getHeartbeatAverage(params?: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']>): StakingComposer<[...TReturns, StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64'] | undefined]>\n\n /**\n * Calls the mustGetHeartbeatAverage(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 mustGetHeartbeatAverage(params?: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']>): StakingComposer<[...TReturns, StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | undefined]>\n\n /**\n * Calls the getInfoList(address,uint8,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 getInfoList(params?: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>): StakingComposer<[...TReturns, StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | undefined]>\n\n /**\n * Calls the mustGetInfoList(address,uint8,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 mustGetInfoList(params?: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>): StakingComposer<[...TReturns, StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | undefined]>\n\n /**\n * Calls the stakeCheck(address,(uint64,uint64)[],uint8,bool)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 stakeCheck(params?: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']>): StakingComposer<[...TReturns, StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | undefined]>\n\n /**\n * Calls the getTotals(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 getTotals(params?: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']>): StakingComposer<[...TReturns, StakingReturns['getTotals(uint64[])(uint64,uint64)[]'] | 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']>): StakingComposer<[...TReturns, StakingReturns['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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']>): StakingComposer<[...TReturns, StakingReturns['opUp()void'] | undefined]>\n\n /**\n * Makes a clear_state call to an existing instance of the Staking 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): StakingComposer<[...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): StakingComposer<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<StakingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<StakingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<StakingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<StakingComposerResults<TReturns>>\n}\nexport type StakingComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { MaybeSigner } from \"../types\";\nimport {\n StakingArgs,\n Stake,\n Escrow,\n StakeInfo,\n StakeKey\n} from '../generated/StakingClient';\n\n// Re-export types from generated client\nexport { Stake, Escrow, StakeInfo, StakeKey };\n\ntype ContractArgs = StakingArgs[\"obj\"];\n\n/** Staking type enum matching contract values */\nexport enum StakingType {\n Heartbeat = 10,\n Soft = 20,\n Hard = 30,\n Lock = 40,\n}\n\nexport type OptInArgs = MaybeSigner & ContractArgs['optIn(pay,uint64)void'];\n\n/** Stake parameters for ALGO staking */\nexport type StakeArgs = MaybeSigner & Omit<ContractArgs['stake(pay,uint8,uint64,uint64)void'], 'payment' | 'amount' | 'expiration'> & {\n /** The asset ID to stake */\n asset: bigint;\n amount: bigint;\n} & (\n | { type: StakingType.Hard | StakingType.Lock, expiration: bigint }\n | { type: StakingType.Soft | StakingType.Heartbeat }\n);\n\n/** Withdraw parameters */\nexport type WithdrawArgs = MaybeSigner & ContractArgs['withdraw(uint64,uint8)void'];\n\n/** Create heartbeat parameters */\nexport type CreateHeartbeatArgs = MaybeSigner & ContractArgs['createHeartbeat(address,uint64)void'];\n\n/** Update settings parameters */\nexport type UpdateSettingsArgs = MaybeSigner & Omit<ContractArgs['updateSettings(pay,uint64,uint64)void'], 'payment'>;\n\n/** Soft check parameters */\nexport type SoftCheckArgs = ContractArgs['softCheck(address,uint64)(bool,uint64)'];\n\n/** Get time left parameters */\nexport type GetTimeLeftArgs = ContractArgs['getTimeLeft(address,uint64)uint64'];\n\n/** Get info parameters */\nexport type GetInfoArgs = ContractArgs['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'];\n\n/** Get escrow info parameters */\nexport type GetEscrowInfoArgs = ContractArgs['getEscrowInfo(address,uint64)(uint64,uint64)'];\n\n/** Get heartbeat parameters */\nexport type GetHeartbeatArgs = ContractArgs['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'];\n\n/** Get heartbeat average parameters */\nexport type GetHeartbeatAverageArgs = ContractArgs['getHeartbeatAverage(address,uint64,bool)uint64'];\n\n/** Get info list parameters */\nexport type GetInfoListArgs = ContractArgs['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'];\n\n/** Stake check parameters */\nexport type StakeCheckArgs = ContractArgs['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'];\n\n/** Heartbeat entry - tuple of [timestamp, balance, escrowed, average] */\nexport type HeartbeatEntry = {\n timestamp: bigint;\n balance: bigint;\n escrowed: bigint;\n average: bigint;\n};\n\nexport type AssetCheck = {\n asset: bigint;\n amount: bigint;\n}\n"]}
1
+ {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-KOIJBMJ4.js","../src/staking/index.ts","../src/generated/StakingClient.ts","../src/staking/types.ts"],"names":["StakingType"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-KOIJBMJ4.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n StakingClient, \n StakingFactory,\n Stake,\n Escrow,\n StakeCheck,\n TotalsInfo\n} from '../generated/StakingClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n StakeArgs,\n WithdrawArgs,\n CreateHeartbeatArgs,\n UpdateSettingsArgs,\n SoftCheckArgs,\n GetTimeLeftArgs,\n GetInfoArgs,\n GetEscrowInfoArgs,\n GetHeartbeatArgs,\n GetHeartbeatAverageArgs,\n GetInfoListArgs,\n StakeCheckArgs,\n HeartbeatEntry,\n StakingType,\n StakeInfo,\n AssetCheck,\n OptInArgs\n} from \"./types\";\nimport { AlgoAmount } from \"@algorandfoundation/algokit-utils/types/amount\";\nimport { AppReturn } from \"@algorandfoundation/algokit-utils/types/app\";\n\nexport * from './types';\n\n/**\n * SDK for interacting with the global Staking contract.\n * Handles all staking operations including soft, hard, lock, and heartbeat staking.\n */\nexport class StakingSDK extends BaseSDK<StakingClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: StakingFactory, ...params }, ENV_VAR_NAMES.STAKING_APP_ID);\n }\n\n async softCheck({ address, asset }: SoftCheckArgs): Promise<StakeCheck> {\n const { return: result } = await this.client.send.softCheck({ \n args: { address, asset } \n });\n\n if (result === undefined) {\n throw new Error('Failed to perform soft check');\n }\n\n return result\n }\n\n async getTimeLeft({ address, asset }: GetTimeLeftArgs): Promise<bigint> {\n const { return: timeLeft } = await this.client.send.getTimeLeft({ \n args: { address, asset } \n });\n return timeLeft ?? 0n;\n }\n\n async mustGetTimeLeft({ address, asset }: GetTimeLeftArgs): Promise<bigint> {\n const { return: timeLeft } = await this.client.send.mustGetTimeLeft({ \n args: { address, asset } \n });\n\n if (timeLeft === undefined) {\n throw new Error('No active stake found');\n }\n\n return timeLeft;\n }\n\n /**\n * Gets stake info for an address and stake type.\n * Returns undefined if no stake exists.\n */\n async getInfo({ address, stake }: GetInfoArgs): Promise<Stake> {\n return await this.client.getInfo({ \n args: { address, stake } \n });\n }\n\n /**\n * Gets stake info for an address and stake type.\n * Throws if no stake exists.\n */\n async mustGetInfo({ address, stake }: GetInfoArgs): Promise<Stake> {\n const { return: info } = await this.client.send.mustGetInfo({ \n args: { address, stake } \n });\n\n if (info === undefined) {\n throw new Error('No stake info found');\n }\n\n return info;\n }\n\n /**\n * Gets escrow info for an address and asset.\n */\n async getEscrowInfo({ address, asset }: GetEscrowInfoArgs): Promise<Escrow | undefined> {\n const { return: info } = await this.client.send.getEscrowInfo({ \n args: { address, asset } \n });\n return info;\n }\n\n /**\n * Gets heartbeat data for an address and asset.\n * Returns an array of heartbeat entries.\n */\n async getHeartbeat({ address, asset }: GetHeartbeatArgs): Promise<HeartbeatEntry[]> {\n const { return: heartbeats } = await this.client.send.getHeartbeat({ \n args: { address, asset } \n });\n\n if (!heartbeats) {\n return [];\n }\n\n return heartbeats.map(([timestamp, balance, escrowed, average]) => ({\n timestamp,\n balance,\n escrowed,\n average\n }));\n }\n\n /**\n * Gets heartbeat data for an address and asset.\n * Throws if no heartbeat exists.\n */\n async mustGetHeartbeat({ address, asset }: GetHeartbeatArgs): Promise<HeartbeatEntry[]> {\n const { return: heartbeats } = await this.client.send.mustGetHeartbeat({ \n args: { address, asset } \n });\n\n if (heartbeats === undefined) {\n throw new Error('No heartbeat found');\n }\n\n return heartbeats.map(([timestamp, balance, escrowed, average]) => ({\n timestamp,\n balance,\n escrowed,\n average\n }));\n }\n\n /**\n * Gets the average heartbeat value for an address and asset.\n */\n async getHeartbeatAverage({ address, asset, includeEscrowed }: GetHeartbeatAverageArgs): Promise<bigint> {\n const { return: average } = await this.client.send.getHeartbeatAverage({ \n args: { address, asset, includeEscrowed } \n });\n return average ?? 0n;\n }\n\n /**\n * Gets the average heartbeat value for an address and asset.\n * Throws if no heartbeat exists.\n */\n async mustGetHeartbeatAverage({ address, asset, includeEscrowed }: GetHeartbeatAverageArgs): Promise<bigint> {\n const { return: average } = await this.client.send.mustGetHeartbeatAverage({ \n args: { address, asset, includeEscrowed } \n });\n\n if (average === undefined) {\n throw new Error('No heartbeat average found');\n }\n\n return average;\n }\n\n /**\n * Gets stake info for multiple assets at once.\n */\n async getInfoList({ address, type, assets }: GetInfoListArgs): Promise<Stake[]> {\n const { return: infoList } = await this.client.send.getInfoList({ \n args: { address, type, assets } \n });\n\n if (!infoList) {\n return [];\n }\n\n return infoList.map(([amount, lastUpdate, expiration]) => ({\n amount,\n lastUpdate,\n expiration\n }));\n }\n\n /**\n * Gets stake info for multiple assets at once.\n * Throws if any stake doesn't exist.\n */\n async mustGetInfoList({ address, type, assets }: GetInfoListArgs): Promise<Stake[]> {\n const { return: infoList } = await this.client.send.mustGetInfoList({ \n args: { address, type, assets } \n });\n\n if (infoList === undefined) {\n throw new Error('Failed to get info list');\n }\n\n return infoList.map(([amount, lastUpdate, expiration]) => ({\n amount,\n lastUpdate,\n expiration\n }));\n }\n\n async stakeCheck({ \n address, \n checks,\n type, \n includeEscrowed \n }: { \n address: string; \n checks: AssetCheck[];\n type: StakingType;\n includeEscrowed: boolean;\n }): Promise<boolean> {\n\n const formattedChecks: [bigint | number, bigint | number][] = checks.map(r => [\n r.asset,\n r.amount\n ]);\n\n return await this.client.stakeCheck({ \n args: { \n address,\n checks: formattedChecks,\n type,\n includeEscrowed\n } \n });\n }\n\n /**\n * Stakes an asset in the staking contract.\n * @param type - The staking type (Heartbeat, Soft, Hard, Lock)\n * @param asset - The asset ID to stake\n * @param amount - The amount to stake\n * @param expiration - The expiration timestamp (for Hard/Lock staking)\n */\n async stake(args: StakeArgs): Promise<void> {\n\n const { sender, signer, type, asset = 0n, amount } = args;\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // For escrowed staking (Hard/Lock), the payment includes the amount being staked\n // For non-escrowed staking (Soft/Heartbeat), only the MBR cost is required\n const isEscrowed = type === StakingType.Hard || type === StakingType.Lock;\n\n let expiration: bigint;\n if (isEscrowed) {\n // ensure args.expiration is in the future\n if (args.expiration < BigInt(Date.now() / 1000)) { // AVM uses unix timestamp in seconds\n throw new Error('Expiration must be in the future');\n }\n expiration = args.expiration;\n } else {\n expiration = 0n;\n }\n\n const cost = await this.stakeCost(asset, type);\n\n if (asset === 0n) {\n\n const total = microAlgo(isEscrowed ? cost + amount : cost);\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: total,\n receiver: this.client.appAddress,\n });\n\n await this.client.send.stake({\n ...sendParams,\n args: {\n payment,\n type,\n amount,\n expiration\n }\n });\n } else {\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n const assetXfer = this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount,\n assetId: asset,\n receiver: this.client.appAddress,\n });\n\n await this.client.send.stakeAsa({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n type,\n amount,\n expiration\n }\n });\n }\n }\n\n /**\n * Withdraws a stake from the contract.\n * @param asset - The asset ID (0 for ALGO)\n * @param type - The staking type\n */\n async withdraw({ sender, signer, asset, type }: WithdrawArgs): Promise<AppReturn<void>> {\n return await this.client.send.withdraw({\n ...this.getSendParams({ sender, signer }),\n args: { asset, type }\n });\n }\n\n /**\n * Creates a heartbeat entry for tracking stake history.\n * @param address - The address to create heartbeat for\n * @param asset - The asset ID (0 for ALGO)\n */\n async createHeartbeat({ sender, signer, address, asset }: CreateHeartbeatArgs): Promise<AppReturn<void>> {\n return await this.client.send.createHeartbeat({\n ...this.getSendParams({ sender, signer }),\n args: { address, asset }\n });\n }\n\n /**\n * Updates settings for a stake (e.g., extending expiration).\n * @param asset - The asset ID\n * @param value - The new value/setting\n */\n async updateSettings({ sender, signer, asset, value }: UpdateSettingsArgs): Promise<void> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(0), // May need adjustment based on operation\n receiver: this.client.appAddress,\n });\n\n await this.client.send.updateSettings({\n ...sendParams,\n args: {\n payment,\n asset,\n value\n }\n });\n }\n\n async optIn({ sender, signer, asset }: OptInArgs): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.optInCost();\n\n const payment = this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.optIn({ \n ...sendParams,\n args: { payment, asset },\n });\n }\n\n async optInCost(): Promise<bigint> {\n return await this.client.optInCost();\n }\n\n async stakeCost(asset: bigint | number, type: StakingType): Promise<bigint> {\n return await this.client.stakeCost({ \n args: { asset, type } \n });\n }\n\n async getTotals(assets: bigint[]): Promise<TotalsInfo[]> {\n return await this.client.getTotals({ \n args: { assets } \n }) as unknown as TotalsInfo[];\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\":\"Staking\",\"structs\":{\"Escrow\":[{\"name\":\"hard\",\"type\":\"uint64\"},{\"name\":\"lock\",\"type\":\"uint64\"}],\"HeartbeatKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"}],\"Stake\":[{\"name\":\"amount\",\"type\":\"uint64\"},{\"name\":\"lastUpdate\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"}],\"StakeCheck\":[{\"name\":\"valid\",\"type\":\"bool\"},{\"name\":\"balance\",\"type\":\"uint64\"}],\"StakeInfo\":[{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"type\",\"type\":\"uint8\"}],\"StakeKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"type\",\"type\":\"uint8\"}],\"TotalsInfo\":[{\"name\":\"locked\",\"type\":\"uint64\"},{\"name\":\"escrowed\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"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\":\"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\":\"stake\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"expiration\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"stakeAsa\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"expiration\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"withdraw\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"uint8\",\"name\":\"type\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createHeartbeat\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"softCheck\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(bool,uint64)\",\"struct\":\"StakeCheck\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateSettings\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"uint64\",\"name\":\"value\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"stakeCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"uint8\",\"name\":\"type\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getTimeLeft\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetTimeLeft\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getInfo\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"(uint64,uint8)\",\"struct\":\"StakeInfo\",\"name\":\"stake\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)\",\"struct\":\"Stake\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetInfo\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"(uint64,uint8)\",\"struct\":\"StakeInfo\",\"name\":\"stake\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)\",\"struct\":\"Stake\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getEscrowInfo\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(uint64,uint64)\",\"struct\":\"Escrow\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getHeartbeat\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64)[4]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetHeartbeat\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64,uint64)[4]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getHeartbeatAverage\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"bool\",\"name\":\"includeEscrowed\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetHeartbeatAverage\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint64\",\"name\":\"asset\"},{\"type\":\"bool\",\"name\":\"includeEscrowed\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getInfoList\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64[]\",\"name\":\"assets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)[]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"mustGetInfoList\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"uint64[]\",\"name\":\"assets\"}],\"returns\":{\"type\":\"(uint64,uint64,uint64)[]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"stakeCheck\",\"args\":[{\"type\":\"address\",\"name\":\"address\"},{\"type\":\"(uint64,uint64)[]\",\"name\":\"checks\"},{\"type\":\"uint8\",\"name\":\"type\"},{\"type\":\"bool\",\"name\":\"includeEscrowed\"}],\"returns\":{\"type\":\"bool\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"getTotals\",\"args\":[{\"type\":\"uint64[]\",\"name\":\"assets\"}],\"returns\":{\"type\":\"(uint64,uint64)[]\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"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\":1,\"bytes\":2},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"heartbeatManagerAddress\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"aGVhcnRiZWF0X21hbmFnZXJfYWRkcmVzcw==\",\"desc\":\"The address that is allowed to call the 'beat' method to create heartbeat records\"},\"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\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"stakes\":{\"keyType\":\"StakeKey\",\"valueType\":\"Stake\",\"prefix\":\"cw==\"},\"heartbeats\":{\"keyType\":\"HeartbeatKey\",\"valueType\":\"(uint64,uint64,uint64,uint64)[4]\",\"prefix\":\"aA==\"},\"totals\":{\"keyType\":\"uint64\",\"valueType\":\"TotalsInfo\",\"prefix\":\"dA==\"},\"settings\":{\"keyType\":\"uint64\",\"valueType\":\"uint64\",\"prefix\":\"ZQ==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[758,785,880,1080,1261,1291,1398,1833,1879,2383,2401,2549,2678,2722,2918,3280,3572,3670,3766,3786,3818,3838,3894],\"errorMessage\":\"Box must have value\"},{\"pc\":[901,1420],\"errorMessage\":\"Expiration must be greater than or equal to the current unlock time or hardlock disabled\"},{\"pc\":[636,1129],\"errorMessage\":\"Expiration must be in the future or hardlock disabled\"},{\"pc\":[1780,2958,3053],\"errorMessage\":\"Heartbeat not found\"},{\"pc\":[876,1394],\"errorMessage\":\"Heartbeat stakes cannot be updated\"},{\"pc\":[851,966,1364,1501],\"errorMessage\":\"Insufficient balance\"},{\"pc\":[1178,1187,1231,1316,1385,1447,1456,1507],\"errorMessage\":\"Invalid asset amount\"},{\"pc\":[509,686,805,867,2233],\"errorMessage\":\"Invalid payment\"},{\"pc\":[924,1169,1310,1379,1433],\"errorMessage\":\"Invalid payment amount\"},{\"pc\":[915,1163,1304,1373,1429],\"errorMessage\":\"Invalid payment receiver\"},{\"pc\":[1601,2458,2607],\"errorMessage\":\"Lock not found\"},{\"pc\":[1229,1360,1494,2126],\"errorMessage\":\"Not opted in\"},{\"pc\":[194],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[3734],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2199],\"errorMessage\":\"Only the asset creator can call this method\"},{\"pc\":[1749],\"errorMessage\":\"Only the heartbeat manager can call this method\"},{\"pc\":[2052],\"errorMessage\":\"Stake does not exist\"},{\"pc\":[3402],\"errorMessage\":\"Stake not found\"},{\"pc\":[1628,2471],\"errorMessage\":\"This asset is still locked\"},{\"pc\":[1559],\"errorMessage\":\"Withdraw is only for hard or lock\"},{\"pc\":[725,847,959,2069,2081,2098],\"errorMessage\":\"account funded\"},{\"pc\":[487],\"errorMessage\":\"already opted into asset\"},{\"pc\":[3732],\"errorMessage\":\"application exists\"},{\"pc\":[2197],\"errorMessage\":\"asset exists\"},{\"pc\":[1747,3719],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[1918,1934,3073,3211,3368,3508,3664,3920],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[3469],\"errorMessage\":\"invalid number of bytes for (len+(uint64,uint64)[])\"},{\"pc\":[3190,3344,3640],\"errorMessage\":\"invalid number of bytes for (len+uint64[])\"},{\"pc\":[428],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[2498,2569],\"errorMessage\":\"invalid number of bytes for (uint64,uint8)\"},{\"pc\":[2991,3029,3485],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[439,476,572,582,1030,1040,1535,1714,2008,2178,2187,2269,2343,2426,2633,2755,2937,2982,3020,3711],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[564,1022,1545,2281,3171,3325,3477],\"errorMessage\":\"invalid number of bytes for uint8\"},{\"pc\":[1706,2000,2335,2418,2489,2560,2625,2747,2929,2974,3012,3163,3317,3449],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[3255,3286,3410,3676],\"errorMessage\":\"max array length exceeded\"},{\"pc\":[1012],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[468,555,1000,2170],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgMjg5MDAgOTkwMDAgMzE1MzYwMDAKICAgIGJ5dGVjYmxvY2sgInMiIDB4MTUxZjdjNzUgMHgyOCAiIiAweDFlICJoIiAidCIgMHgwYSAiYWtpdGFfZGFvIiAweDAwIDB4MDAwMCAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIGNsYXNzZXMoQmFzZVN0YWtpbmcsIEFraXRhQmFzZUNvbnRyYWN0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzEKICAgIHB1c2hieXRlc3MgMHg4M2YxNDc0OCAweDM5NGVhZWIyIDB4ODI1NmNmMTkgMHgyMDQ2N2I5MyAweDgzMDQ4MGYzIDB4YzgxNzNjYTEgMHg0ODcxNmYxYSAweDVkOWQxNDI4IDB4MjIzNWE2ODMgMHg2Y2IwMGU3ZCAweDlmNGY1Njc0IDB4NzVkMTM4ZmIgMHhjOTA2ODgwOSAweGY1MjMyYmYzIDB4NGM4OGVhY2UgMHhlYWU2NWYxMiAweGRkNDRhODQzIDB4YzZmZDBjYTUgMHg4YWUyNjZiOSAweGU5N2E1NjU1IDB4MTEyNWQ3M2IgMHg5ZGZmNDA2MCAweDZiZThjZWU2IDB4MzNlOTJjOTQgMHg4NTRkZWRlMCAvLyBtZXRob2QgImluaXQoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3Rha2UocGF5LHVpbnQ4LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3Rha2VBc2EocGF5LGF4ZmVyLHVpbnQ4LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXcodWludDY0LHVpbnQ4KXZvaWQiLCBtZXRob2QgImNyZWF0ZUhlYXJ0YmVhdChhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzb2Z0Q2hlY2soYWRkcmVzcyx1aW50NjQpKGJvb2wsdWludDY0KSIsIG1ldGhvZCAidXBkYXRlU2V0dGluZ3MocGF5LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KCl1aW50NjQiLCBtZXRob2QgInN0YWtlQ29zdCh1aW50NjQsdWludDgpdWludDY0IiwgbWV0aG9kICJnZXRUaW1lTGVmdChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgIm11c3RHZXRUaW1lTGVmdChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldEluZm8oYWRkcmVzcywodWludDY0LHVpbnQ4KSkodWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJtdXN0R2V0SW5mbyhhZGRyZXNzLCh1aW50NjQsdWludDgpKSh1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldEVzY3Jvd0luZm8oYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRIZWFydGJlYXQoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbNF0iLCBtZXRob2QgIm11c3RHZXRIZWFydGJlYXQoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbNF0iLCBtZXRob2QgImdldEhlYXJ0YmVhdEF2ZXJhZ2UoYWRkcmVzcyx1aW50NjQsYm9vbCl1aW50NjQiLCBtZXRob2QgIm11c3RHZXRIZWFydGJlYXRBdmVyYWdlKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IiwgbWV0aG9kICJnZXRJbmZvTGlzdChhZGRyZXNzLHVpbnQ4LHVpbnQ2NFtdKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAibXVzdEdldEluZm9MaXN0KGFkZHJlc3MsdWludDgsdWludDY0W10pKHVpbnQ2NCx1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJzdGFrZUNoZWNrKGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpW10sdWludDgsYm9vbClib29sIiwgbWV0aG9kICJnZXRUb3RhbHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9pbml0X3JvdXRlQDUgb3B0SW4gc3Rha2Ugc3Rha2VBc2Egd2l0aGRyYXcgY3JlYXRlSGVhcnRiZWF0IHNvZnRDaGVjayB1cGRhdGVTZXR0aW5ncyBvcHRJbkNvc3Qgc3Rha2VDb3N0IGdldFRpbWVMZWZ0IG11c3RHZXRUaW1lTGVmdCBnZXRJbmZvIG11c3RHZXRJbmZvIGdldEVzY3Jvd0luZm8gZ2V0SGVhcnRiZWF0IG11c3RHZXRIZWFydGJlYXQgZ2V0SGVhcnRiZWF0QXZlcmFnZSBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZSBnZXRJbmZvTGlzdCBtdXN0R2V0SW5mb0xpc3Qgc3Rha2VDaGVjayBnZXRUb3RhbHMgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDI5CiAgICBlcnIKCm1haW5fb3BVcF9yb3V0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQzCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2luaXRfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHRvdGFscyA9IEJveE1hcDx1aW50NjQsIFRvdGFsc0luZm8+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4VG90YWxzIH0pCiAgICBwdXNoYnl0ZXMgMHg3NDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyB0aGlzLnRvdGFscygwKS52YWx1ZSA9IHsgbG9ja2VkOiAwLCBlc2Nyb3dlZDogMCB9CiAgICBieXRlYyAxMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gaW5pdCgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIGNsYXNzZXMoQmFzZVN0YWtpbmcsIEFraXRhQmFzZUNvbnRyYWN0KSB7CiAgICBwdXNoYnl0ZXMgMHhjZDlhZDY3ZSAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogR2xvYmFsU3RhdGVLZXlWZXJzaW9uIH0pCiAgICBwdXNoYnl0ZXMgInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDggLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBhc3NlcnQoIUdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmlzT3B0ZWRJbihBc3NldChhc3NldCkpLCBFUlJfQUxSRUFEWV9PUFRFRF9JTikKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyB0b3RhbHNNQlIgKwogICAgcHVzaGludCAxMjUwMCAvLyAxMjUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMzgKICAgIC8vIEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEzNy0xMzgKICAgIC8vIHRvdGFsc01CUiArCiAgICAvLyBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTQxLTE0OAogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBtYnIsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNDQKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE0MS0xNDgKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbWJyLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgdW5jb3ZlciAzCiAgICBndHhucyBBbW91bnQKICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE1MC0xNTQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTUxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTUwLTE1NAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyB9KS5zdWJtaXQoKQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUgPSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNTYtMTU5CiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUgPSB7CiAgICAvLyAgIGxvY2tlZDogMCwKICAgIC8vICAgZXNjcm93ZWQ6IDAsCiAgICAvLyB9CiAgICBieXRlYyAxMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0YWtlOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gc3Rha2UocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB0eXBlOiBTdGFraW5nVHlwZSwgYW1vdW50OiB1aW50NjQsIGV4cGlyYXRpb246IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIGNvbnN0IGluVGhlRnV0dXJlID0gZXhwaXJhdGlvbiA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGxlc3NUaGFuT25lWWVhckluVGhlRnV0dXJlID0gZXhwaXJhdGlvbiA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgT05FX1lFQVIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGMgNiAvLyAzMTUzNjAwMAogICAgKwogICAgPD0KICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyBjb25zdCBsb2NrZWQgPSB0eXBlID09PSBTVEFLSU5HX1RZUEVfTE9DSwogICAgZHVwCiAgICBieXRlY18yIC8vIDB4MjgKICAgID09CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gY29uc3QgaXNFc2Nyb3cgPSB0eXBlID09PSBTVEFLSU5HX1RZUEVfSEFSRCB8fCB0eXBlID09PSBTVEFLSU5HX1RZUEVfTE9DSwogICAgYnl0ZWMgNCAvLyAweDFlCiAgICA9PQogICAgYm56IHN0YWtlX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIGJ6IHN0YWtlX2Jvb2xfZmFsc2VANAoKc3Rha2VfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxMAoKc3Rha2VfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIGNvbnN0IHRpbWVzdGFtcCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCgoaW5UaGVGdXR1cmUgJiYgbGVzc1RoYW5PbmVZZWFySW5UaGVGdXR1cmUpIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTikKICAgIGRpZyAyCiAgICBieiBzdGFrZV9vcl9jb250ZEA3CiAgICBkaWcgMQogICAgYm56IHN0YWtlX2Jvb2xfdHJ1ZUA4CgpzdGFrZV9vcl9jb250ZEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCgoaW5UaGVGdXR1cmUgJiYgbGVzc1RoYW5PbmVZZWFySW5UaGVGdXR1cmUpIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTikKICAgIGR1cAogICAgYm56IHN0YWtlX2Jvb2xfZmFsc2VAOQoKc3Rha2VfYm9vbF90cnVlQDg6CiAgICBpbnRjXzEgLy8gMQoKc3Rha2VfYm9vbF9tZXJnZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBhc3NlcnQoKGluVGhlRnV0dXJlICYmIGxlc3NUaGFuT25lWWVhckluVGhlRnV0dXJlKSB8fCAhbG9ja2VkLCBFUlJfQkFEX0VYUElSQVRJT04pCiAgICBhc3NlcnQgLy8gRXhwaXJhdGlvbiBtdXN0IGJlIGluIHRoZSBmdXR1cmUgb3IgaGFyZGxvY2sgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNzMKICAgIC8vIGFzc2V0OiAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTcxLTE3NQogICAgLy8gY29uc3Qgc2s6IFN0YWtlS2V5ID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogMCwKICAgIC8vICAgdHlwZSwKICAgIC8vIH0KICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxOQogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE3NwogICAgLy8gY29uc3QgaXNVcGRhdGUgPSB0aGlzLnN0YWtlcyhzaykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTc5CiAgICAvLyBpZiAoIWlzVXBkYXRlKSB7CiAgICBibnogc3Rha2VfZWxzZV9ib2R5QDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgOQogICAgYnogc3Rha2VfZWxzZV9ib2R5QDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4NS0xOTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogYW1vdW50ICsgY29zdHMuc3Rha2VzLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgNgogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4NS0xOTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogYW1vdW50ICsgY29zdHMuc3Rha2VzLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjE4OQogICAgLy8gYW1vdW50OiBhbW91bnQgKyBjb3N0cy5zdGFrZXMsCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjIDQgLy8gMjg5MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTg1LTE5MgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5zdGFrZXMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMudXBkYXRlVG90YWxzKDAsIHR5cGUsIGFtb3VudCwgdHJ1ZSkKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiB1cGRhdGVUb3RhbHMKCnN0YWtlX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI3Mi0yNzYKICAgIC8vIHRoaXMuc3Rha2VzKHNrKS52YWx1ZSA9IHsKICAgIC8vICAgYW1vdW50LAogICAgLy8gICBsYXN0VXBkYXRlOiB0aW1lc3RhbXAsCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyB9CiAgICBkaWcgNAogICAgaXRvYgogICAgZGlnIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDE2CiAgICBzd2FwCiAgICBib3hfcHV0CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIHN0YWtlKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgdHlwZTogU3Rha2luZ1R5cGUsIGFtb3VudDogdWludDY0LCBleHBpcmF0aW9uOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlX2Vsc2VfYm9keUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyB9IGVsc2UgaWYgKHR5cGUgPT09IFNUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGRpZyA1CiAgICBieXRlYyA3IC8vIDB4MGEKICAgID09CiAgICBieiBzdGFrZV9lbHNlX2JvZHlAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyBjb25zdCBoZWxkID0gbmV3IFVpbnQ2NChUeG4uc2VuZGVyLmJhbGFuY2UpCiAgICB0eG4gU2VuZGVyCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgaXRvYgogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGxldCBoYXJkOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMDEKICAgIC8vIGxldCBsb2NrOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gYWRkcmVzczogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjAzLTIwNwogICAgLy8gY29uc3QgaGFyZFN0YWtlS2V5OiBTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzczogVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXQ6IDAsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9IQVJELAogICAgLy8gfQogICAgZGlnIDE3CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0eXBlOiBTVEFLSU5HX1RZUEVfSEFSRCwKICAgIGJ5dGVjIDQgLy8gMHgxZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMDMtMjA3CiAgICAvLyBjb25zdCBoYXJkU3Rha2VLZXk6IFN0YWtlS2V5ID0gewogICAgLy8gICBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldDogMCwKICAgIC8vICAgdHlwZTogU1RBS0lOR19UWVBFX0hBUkQsCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjA5CiAgICAvLyBpZiAodGhpcy5zdGFrZXMoaGFyZFN0YWtlS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogc3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMTAKICAgIC8vIGhhcmQgPSB0aGlzLnN0YWtlcyhoYXJkU3Rha2VLZXkpLnZhbHVlLmFtb3VudAogICAgZGlnIDE0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDExCgpzdGFrZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIxMy0yMTcKICAgIC8vIGNvbnN0IGxvY2tTdGFrZUtleTogU3Rha2VLZXkgPSB7CiAgICAvLyAgIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0OiAwLAogICAgLy8gICB0eXBlOiBTVEFLSU5HX1RZUEVfTE9DSywKICAgIC8vIH0KICAgIGRpZyAxNwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gdHlwZTogU1RBS0lOR19UWVBFX0xPQ0ssCiAgICBieXRlY18yIC8vIDB4MjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gY29uc3QgbG9ja1N0YWtlS2V5OiBTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzczogVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXQ6IDAsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLLAogICAgLy8gfQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gaWYgKHRoaXMuc3Rha2VzKGxvY2tTdGFrZUtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN0YWtlX2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBsb2NrID0gdGhpcy5zdGFrZXMobG9ja1N0YWtlS2V5KS52YWx1ZS5hbW91bnQKICAgIGRpZyAxMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA5CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyMjMtMjMwCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLnN0YWtlcyArIGNvc3RzLmhlYXJ0YmVhdHMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA2CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjIzLTIzMAogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5zdGFrZXMgKyBjb3N0cy5oZWFydGJlYXRzLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gYW1vdW50OiBjb3N0cy5zdGFrZXMgKyBjb3N0cy5oZWFydGJlYXRzLAogICAgaW50YyA1IC8vIDk5MDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIyMy0yMzAKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuc3Rha2VzICsgY29zdHMuaGVhcnRiZWF0cywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gYWRkcmVzczogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjMyLTIzNQogICAgLy8gY29uc3QgaGVhcnRiZWF0S2V5OiBIZWFydGJlYXRLZXkgPSB7CiAgICAvLyAgIGFkZHJlc3M6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0OiAwLAogICAgLy8gfQogICAgZGlnIDE3CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyBoYXJkOiBuZXcgVWludDY0KGhhcmQpLAogICAgZGlnIDExCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIGRpZyAxMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIHRpbWVzdGFtcDogbmV3IFVpbnQ2NCh0aW1lc3RhbXApLAogICAgZGlnIDEwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDIKICAgIC8vIGNvbnN0IGhidiA9IG5ldyBhcmM0SGVhcnRiZWF0KHsKICAgIC8vICAgaGVsZCwKICAgIC8vICAgaGFyZDogbmV3IFVpbnQ2NChoYXJkKSwKICAgIC8vICAgbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIC8vICAgdGltZXN0YW1wOiBuZXcgVWludDY0KHRpbWVzdGFtcCksCiAgICAvLyB9KQogICAgZGlnIDE2CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNTEtMjU2CiAgICAvLyBjb25zdCBoZWFydGJlYXRzID0gbmV3IFN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+KAogICAgLy8gICBjbG9uZShoYnYpLAogICAgLy8gICBjbG9uZShlaGJ2KSwKICAgIC8vICAgY2xvbmUoZWhidiksCiAgICAvLyAgIGNsb25lKGVoYnYpCiAgICAvLyApCiAgICBieXRlYyAxMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNTgKICAgIC8vIHRoaXMuaGVhcnRiZWF0cyhoZWFydGJlYXRLZXkpLnZhbHVlID0gY2xvbmUoaGVhcnRiZWF0cykKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgc3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMQoKc3Rha2VfZWxzZV9ib2R5QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNjEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJhbGFuY2UgPj0gYW1vdW50LCBFUlJfSU5TVUZGSUNJRU5UX0JBTEFOQ0UpCiAgICB0eG4gU2VuZGVyCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDUKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IGJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjYyLTI2OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5zdGFrZXMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA2CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI2NQogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjYyLTI2OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5zdGFrZXMsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBhbW91bnQ6IGNvc3RzLnN0YWtlcywKICAgIGludGMgNCAvLyAyODkwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyNjItMjY5CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLnN0YWtlcywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICBiIHN0YWtlX2FmdGVyX2lmX2Vsc2VAMjEKCnN0YWtlX2Vsc2VfYm9keUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyBhc3NlcnQodHlwZSAhPT0gU1RBS0lOR19UWVBFX0hFQVJUQkVBVCwgRVJSX0hFQVJUQkVBVF9DQU5OT1RfVVBEQVRFKQogICAgZGlnIDUKICAgIGJ5dGVjIDcgLy8gMHgwYQogICAgIT0KICAgIGFzc2VydCAvLyBIZWFydGJlYXQgc3Rha2VzIGNhbm5vdCBiZSB1cGRhdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gY29uc3QgeyBleHBpcmF0aW9uOiBjdXJyZW50U3Rha2VFeHBpcmF0aW9uLCBhbW91bnQ6IGN1cnJlbnRTdGFrZUFtb3VudCB9ID0gdGhpcy5zdGFrZXMoc2spLnZhbHVlCiAgICBkaWcgMTUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjgxCiAgICAvLyBhc3NlcnQoZXhwaXJhdGlvbiA+PSBjdXJyZW50U3Rha2VFeHBpcmF0aW9uIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTl9VUERBVEUpCiAgICBkaWcgNAogICAgPD0KICAgIGJueiBzdGFrZV9ib29sX3RydWVAMjQKICAgIGR1cAogICAgYm56IHN0YWtlX2Jvb2xfZmFsc2VAMjUKCnN0YWtlX2Jvb2xfdHJ1ZUAyNDoKICAgIGludGNfMSAvLyAxCgpzdGFrZV9ib29sX21lcmdlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID49IGN1cnJlbnRTdGFrZUV4cGlyYXRpb24gfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OX1VQREFURSkKICAgIGFzc2VydCAvLyBFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHVubG9jayB0aW1lIG9yIGhhcmRsb2NrIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgOQogICAgYnogc3Rha2VfZWxzZV9ib2R5QDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gYXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZGlnIDYKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCByZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyODUKICAgIC8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gYW1vdW50LCBFUlJfSU5WQUxJRF9QQVlNRU5UX0FNT1VOVCkKICAgIGd0eG5zIEFtb3VudAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gdGhpcy51cGRhdGVUb3RhbHMoMCwgdHlwZSwgYW1vdW50LCB0cnVlKQogICAgaW50Y18wIC8vIDAKICAgIGRpZyA3CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIHVwZGF0ZVRvdGFscwoKc3Rha2VfYWZ0ZXJfaWZfZWxzZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MjkyCiAgICAvLyBjb25zdCBuZXdBbW91bnQ6IHVpbnQ2NCA9IGN1cnJlbnRTdGFrZUFtb3VudCArIGFtb3VudAogICAgZGlnIDExCiAgICBkaWcgNQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoyOTQtMjk4CiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogbmV3QW1vdW50LAogICAgLy8gICBsYXN0VXBkYXRlOiB0aW1lc3RhbXAsCiAgICAvLyAgIGV4cGlyYXRpb24KICAgIC8vIH0KICAgIGl0b2IKICAgIGRpZyA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxNgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBzdGFrZV9hZnRlcl9pZl9lbHNlQDMwCgpzdGFrZV9lbHNlX2JvZHlAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYmFsYW5jZSA+PSBjdXJyZW50U3Rha2VBbW91bnQgKyBhbW91bnQsIEVSUl9JTlNVRkZJQ0lFTlRfQkFMQU5DRSkKICAgIHR4biBTZW5kZXIKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMTIKICAgIGRpZyA2CiAgICArCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBiYWxhbmNlCiAgICBiIHN0YWtlX2FmdGVyX2lmX2Vsc2VAMjkKCnN0YWtlX2Jvb2xfZmFsc2VAMjU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZV9ib29sX21lcmdlQDI2CgpzdGFrZV9ib29sX2ZhbHNlQDk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZV9ib29sX21lcmdlQDEwCgpzdGFrZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgYiBzdGFrZV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnN0YWtlQXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKc3Rha2VBc2E6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzAyLTMwOAogICAgLy8gc3Rha2VBc2EoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHR5cGU6IFN0YWtpbmdUeXBlLAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBjb25zdCBpblRoZUZ1dHVyZSA9IGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBsZXQgbGVzc1RoYW5NYXhMb2NrdXAgPSBleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfWUVBUgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50YyA2IC8vIDMxNTM2MDAwCiAgICArCiAgICA8PQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTEKICAgIC8vIGlmICh0aGlzLnNldHRpbmdzKGFzc2V0WGZlci54ZmVyQXNzZXQuaWQpLmV4aXN0cykgewogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkdXAKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5MwogICAgLy8gc2V0dGluZ3MgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U2V0dGluZ3MgfSkKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxMQogICAgLy8gaWYgKHRoaXMuc2V0dGluZ3MoYXNzZXRYZmVyLnhmZXJBc3NldC5pZCkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIGxlc3NUaGFuTWF4TG9ja3VwID0gZXhwaXJhdGlvbiA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgdGhpcy5zZXR0aW5ncyhhc3NldFhmZXIueGZlckFzc2V0LmlkKS52YWx1ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICArCiAgICBkaWcgNgogICAgPj0KICAgIGJ1cnkgNAoKc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIGNvbnN0IGxvY2tlZCA9IHR5cGUgPT09IFNUQUtJTkdfVFlQRV9MT0NLCiAgICBkaWcgNwogICAgZHVwCiAgICBieXRlY18yIC8vIDB4MjgKICAgID09CiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gY29uc3QgaXNFc2Nyb3cgPSB0eXBlID09PSBTVEFLSU5HX1RZUEVfSEFSRCB8fCB0eXBlID09PSBTVEFLSU5HX1RZUEVfTE9DSwogICAgYnl0ZWMgNCAvLyAweDFlCiAgICA9PQogICAgYm56IHN0YWtlQXNhX2Jvb2xfdHJ1ZUA1CiAgICBkaWcgMTEKICAgIGJ6IHN0YWtlQXNhX2Jvb2xfZmFsc2VANgoKc3Rha2VBc2FfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxNAoKc3Rha2VBc2FfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMTYKICAgIC8vIGNvbnN0IHRpbWVzdGFtcCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBhc3NlcnQoKGluVGhlRnV0dXJlICYmIGxlc3NUaGFuTWF4TG9ja3VwKSB8fCAhbG9ja2VkLCBFUlJfQkFEX0VYUElSQVRJT04pCiAgICBkaWcgNAogICAgYnogc3Rha2VBc2Ffb3JfY29udGRAOQogICAgZGlnIDMKICAgIGJueiBzdGFrZUFzYV9ib29sX3RydWVAMTAKCnN0YWtlQXNhX29yX2NvbnRkQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gYXNzZXJ0KChpblRoZUZ1dHVyZSAmJiBsZXNzVGhhbk1heExvY2t1cCkgfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OKQogICAgZGlnIDExCiAgICBibnogc3Rha2VBc2FfYm9vbF9mYWxzZUAxMQoKc3Rha2VBc2FfYm9vbF90cnVlQDEwOgogICAgaW50Y18xIC8vIDEKCnN0YWtlQXNhX2Jvb2xfbWVyZ2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gYXNzZXJ0KChpblRoZUZ1dHVyZSAmJiBsZXNzVGhhbk1heExvY2t1cCkgfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OKQogICAgYXNzZXJ0IC8vIEV4cGlyYXRpb24gbXVzdCBiZSBpbiB0aGUgZnV0dXJlIG9yIGhhcmRsb2NrIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gY29uc3Qgc2s6IFN0YWtlS2V5ID0geyBhZGRyZXNzOiBUeG4uc2VuZGVyLCBhc3NldCwgdHlwZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMyNAogICAgLy8gY29uc3QgaXNVcGRhdGUgPSB0aGlzLnN0YWtlcyhzaykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBpZiAoIWlzVXBkYXRlKSB7CiAgICBibnogc3Rha2VBc2FfZWxzZV9ib2R5QDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgMTMKICAgIGJ6IHN0YWtlQXNhX2Vsc2VfYm9keUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVF9SRUNFSVZFUikKICAgIGRpZyA5CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgcmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzMyCiAgICAvLyBhc3NlcnQocGF5bWVudC5hbW91bnQgPT09IGNvc3RzLnN0YWtlcywgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBndHhucyBBbW91bnQKICAgIGludGMgNCAvLyAyODkwMAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gYXNzZXJ0KGFzc2V0WGZlci5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfQVNTRVRfQU1PVU5UKQogICAgZGlnIDgKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhc3NldCBhbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBhc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID09PSBhbW91bnQsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gdGhpcy51cGRhdGVUb3RhbHMoYXNzZXQsIHR5cGUsIGFtb3VudCwgdHJ1ZSkKICAgIGRpZyAzCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiB1cGRhdGVUb3RhbHMKCnN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQwMS00MDUKICAgIC8vIHRoaXMuc3Rha2VzKHNrKS52YWx1ZSA9IHsKICAgIC8vICAgYW1vdW50LAogICAgLy8gICBsYXN0VXBkYXRlOiB0aW1lc3RhbXAsCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyB9CiAgICBkaWcgNgogICAgaXRvYgogICAgZGlnIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyMAogICAgc3dhcAogICAgYm94X3B1dAoKc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzAyLTMwOAogICAgLy8gc3Rha2VBc2EoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHR5cGU6IFN0YWtpbmdUeXBlLAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlQXNhX2Vsc2VfYm9keUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyB9IGVsc2UgaWYgKHR5cGUgPT09IFNUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGRpZyA3CiAgICBieXRlYyA3IC8vIDB4MGEKICAgID09CiAgICBieiBzdGFrZUFzYV9lbHNlX2JvZHlAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBbaG9sZGluZ0Ftb3VudCwgb3B0ZWRJbl0gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKFR4bi5zZW5kZXIsIGFzc2V0KQogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIGFzc2VydChvcHRlZEluLCBFUlJfTk9UX09QVEVEX0lOKQogICAgYXNzZXJ0IC8vIE5vdCBvcHRlZCBpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGFzc2VydChob2xkaW5nQW1vdW50ID4gMCwgRVJSX0lOVkFMSURfQVNTRVRfQU1PVU5UKQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhc3NldCBhbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBjb25zdCBoZWxkID0gbmV3IFVpbnQ2NChob2xkaW5nQW1vdW50KQogICAgaXRvYgogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIGNvbnN0IGhhcmRTdGFrZUtleTogU3Rha2VLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIGFzc2V0LCB0eXBlOiBTVEFLSU5HX1RZUEVfSEFSRCB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MWUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGxldCBoYXJkOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhoYXJkU3Rha2VLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBzdGFrZUFzYV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gaGFyZCA9IHRoaXMuc3Rha2VzKGhhcmRTdGFrZUtleSkudmFsdWUuYW1vdW50CiAgICBkaWcgMTgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTUKCnN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gY29uc3QgbG9ja1N0YWtlS2V5OiBTdGFrZUtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgYXNzZXQsIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLIH0KICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gMHgyOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gbGV0IGxvY2s6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gaWYgKHRoaXMuc3Rha2VzKGxvY2tTdGFrZUtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBsb2NrID0gdGhpcy5zdGFrZXMobG9ja1N0YWtlS2V5KS52YWx1ZS5hbW91bnQKICAgIGRpZyAxNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMwoKc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgOQogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IHJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSAoY29zdHMuc3Rha2VzICsgY29zdHMuaGVhcnRiZWF0cyksIEVSUl9JTlZBTElEX1BBWU1FTlRfQU1PVU5UKQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDUgLy8gOTkwMDAKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIGFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IDAsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGRpZyA4CiAgICBndHhucyBBc3NldEFtb3VudAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gY29uc3QgaGVhcnRiZWF0S2V5OiBIZWFydGJlYXRLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIGFzc2V0IH0KICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBoYXJkOiBuZXcgVWludDY0KGhhcmQpLAogICAgZGlnIDE1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIGRpZyAxNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIHRpbWVzdGFtcDogbmV3IFVpbnQ2NCh0aW1lc3RhbXApLAogICAgZGlnIDEzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM2OS0zNzQKICAgIC8vIGNvbnN0IGhidiA9IG5ldyBhcmM0SGVhcnRiZWF0KHsKICAgIC8vICAgaGVsZCwKICAgIC8vICAgaGFyZDogbmV3IFVpbnQ2NChoYXJkKSwKICAgIC8vICAgbG9jazogbmV3IFVpbnQ2NChsb2NrKSwKICAgIC8vICAgdGltZXN0YW1wOiBuZXcgVWludDY0KHRpbWVzdGFtcCksCiAgICAvLyB9KQogICAgZGlnIDIwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozODMtMzg4CiAgICAvLyB0aGlzLmhlYXJ0YmVhdHMoaGVhcnRiZWF0S2V5KS52YWx1ZSA9IG5ldyBhcmM0LlN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+KAogICAgLy8gICBjbG9uZShoYnYpLAogICAgLy8gICBjbG9uZShlaGJ2KSwKICAgIC8vICAgY2xvbmUoZWhidiksCiAgICAvLyAgIGNsb25lKGVoYnYpCiAgICAvLyApCiAgICBieXRlYyAxMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozODMtMzg4CiAgICAvLyB0aGlzLmhlYXJ0YmVhdHMoaGVhcnRiZWF0S2V5KS52YWx1ZSA9IG5ldyBhcmM0LlN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+KAogICAgLy8gICBjbG9uZShoYnYpLAogICAgLy8gICBjbG9uZShlaGJ2KSwKICAgIC8vICAgY2xvbmUoZWhidiksCiAgICAvLyAgIGNsb25lKGVoYnYpCiAgICAvLyApCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjMKCnN0YWtlQXNhX2Vsc2VfYm9keUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MzkwCiAgICAvLyBjb25zdCBbaG9sZGluZ0Ftb3VudCwgb3B0ZWRJbl0gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKFR4bi5zZW5kZXIsIGFzc2V0KQogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozOTEKICAgIC8vIGFzc2VydChvcHRlZEluLCBFUlJfTk9UX09QVEVEX0lOKQogICAgYXNzZXJ0IC8vIE5vdCBvcHRlZCBpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozOTIKICAgIC8vIGFzc2VydChob2xkaW5nQW1vdW50ID49IGFtb3VudCwgRVJSX0lOU1VGRklDSUVOVF9CQUxBTkNFKQogICAgZGlnIDcKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IGJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgOQogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IHJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjM5NQogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSBjb3N0cy5zdGFrZXMsIEVSUl9JTlZBTElEX1BBWU1FTlRfQU1PVU5UKQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDQgLy8gMjg5MDAKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIGFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IDAsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGRpZyA4CiAgICBndHhucyBBc3NldEFtb3VudAogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICBiIHN0YWtlQXNhX2FmdGVyX2lmX2Vsc2VAMjMKCnN0YWtlQXNhX2Vsc2VfYm9keUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBhc3NlcnQodHlwZSAhPT0gU1RBS0lOR19UWVBFX0hFQVJUQkVBVCwgRVJSX0hFQVJUQkVBVF9DQU5OT1RfVVBEQVRFKQogICAgZGlnIDcKICAgIGJ5dGVjIDcgLy8gMHgwYQogICAgIT0KICAgIGFzc2VydCAvLyBIZWFydGJlYXQgc3Rha2VzIGNhbm5vdCBiZSB1cGRhdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gY29uc3QgeyBleHBpcmF0aW9uOiBjdXJyZW50U3Rha2VFeHBpcmF0aW9uLCBhbW91bnQ6IGN1cnJlbnRTdGFrZUFtb3VudCB9ID0gdGhpcy5zdGFrZXMoc2spLnZhbHVlCiAgICBkaWcgMTkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyBhc3NlcnQoZXhwaXJhdGlvbiA+PSBjdXJyZW50U3Rha2VFeHBpcmF0aW9uIHx8ICFsb2NrZWQsIEVSUl9CQURfRVhQSVJBVElPTl9VUERBVEUpCiAgICBkaWcgNgogICAgPD0KICAgIGJueiBzdGFrZUFzYV9ib29sX3RydWVAMjYKICAgIGRpZyAxMQogICAgYm56IHN0YWtlQXNhX2Jvb2xfZmFsc2VAMjcKCnN0YWtlQXNhX2Jvb2xfdHJ1ZUAyNjoKICAgIGludGNfMSAvLyAxCgpzdGFrZUFzYV9ib29sX21lcmdlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID49IGN1cnJlbnRTdGFrZUV4cGlyYXRpb24gfHwgIWxvY2tlZCwgRVJSX0JBRF9FWFBJUkFUSU9OX1VQREFURSkKICAgIGFzc2VydCAvLyBFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHVubG9jayB0aW1lIG9yIGhhcmRsb2NrIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gYXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZGlnIDkKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCByZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gMCwgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBndHhucyBBbW91bnQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gaWYgKGlzRXNjcm93KSB7CiAgICBkaWcgMTMKICAgIGJ6IHN0YWtlQXNhX2Vsc2VfYm9keUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MTYKICAgIC8vIGFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX0FTU0VUX0FNT1VOVCkKICAgIGRpZyA4CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXNzZXQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gYXNzZXJ0KGFzc2V0WGZlci5hc3NldEFtb3VudCA9PT0gYW1vdW50LCBFUlJfSU5WQUxJRF9BU1NFVF9BTU9VTlQpCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFzc2V0IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHRoaXMudXBkYXRlVG90YWxzKGFzc2V0LCB0eXBlLCBhbW91bnQsIHRydWUpCiAgICBkaWcgMwogICAgZGlnIDkKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgdXBkYXRlVG90YWxzCgpzdGFrZUFzYV9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIGNvbnN0IG5ld0Ftb3VudDogdWludDY0ID0gY3VycmVudFN0YWtlQW1vdW50ICsgYW1vdW50CiAgICBkaWcgMTUKICAgIGRpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQzMC00MzQKICAgIC8vIHRoaXMuc3Rha2VzKHNrKS52YWx1ZSA9IHsKICAgIC8vICAgYW1vdW50OiBuZXdBbW91bnQsCiAgICAvLyAgIGxhc3RVcGRhdGU6IHRpbWVzdGFtcCwKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vIH0KICAgIGl0b2IKICAgIGRpZyAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMjAKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMgoKc3Rha2VBc2FfZWxzZV9ib2R5QDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0MjEKICAgIC8vIGNvbnN0IFtob2xkaW5nQW1vdW50LCBvcHRlZEluXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoVHhuLnNlbmRlciwgYXNzZXQpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQyMgogICAgLy8gYXNzZXJ0KG9wdGVkSW4sIEVSUl9OT1RfT1BURURfSU4pCiAgICBhc3NlcnQgLy8gTm90IG9wdGVkIGluCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gYXNzZXJ0KGhvbGRpbmdBbW91bnQgPj0gY3VycmVudFN0YWtlQW1vdW50ICsgYW1vdW50LCBFUlJfSU5TVUZGSUNJRU5UX0JBTEFOQ0UpCiAgICBkaWcgMTYKICAgIGRpZyA4CiAgICArCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBiYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYXNzZXJ0KGFzc2V0WGZlci5hc3NldEFtb3VudCA9PT0gMCwgRVJSX0lOVkFMSURfQVNTRVRfQU1PVU5UKQogICAgZGlnIDgKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhc3NldCBhbW91bnQKICAgIGIgc3Rha2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMQoKc3Rha2VBc2FfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHN0YWtlQXNhX2Jvb2xfbWVyZ2VAMjgKCnN0YWtlQXNhX2Jvb2xfZmFsc2VAMTE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZUFzYV9ib29sX21lcmdlQDEyCgpzdGFrZUFzYV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxNAogICAgYiBzdGFrZUFzYV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLndpdGhkcmF3W3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXc6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gd2l0aGRyYXcoYXNzZXQ6IHVpbnQ2NCwgdHlwZTogU3Rha2luZ1R5cGUpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gdHlwZSA9PT0gU1RBS0lOR19UWVBFX0hBUkQgfHwgdHlwZSA9PT0gU1RBS0lOR19UWVBFX0xPQ0ssCiAgICBieXRlYyA0IC8vIDB4MWUKICAgID09CiAgICBibnogd2l0aGRyYXdfYm9vbF90cnVlQDMKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAweDI4CiAgICA9PQogICAgYnogd2l0aGRyYXdfYm9vbF9mYWxzZUA0Cgp3aXRoZHJhd19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgp3aXRoZHJhd19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQzOS00NDIKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdHlwZSA9PT0gU1RBS0lOR19UWVBFX0hBUkQgfHwgdHlwZSA9PT0gU1RBS0lOR19UWVBFX0xPQ0ssCiAgICAvLyAgIEVSUl9XSVRIRFJBV19JU19PTkxZX0ZPUl9IQVJEX09SX0xPQ0sKICAgIC8vICkKICAgIGFzc2VydCAvLyBXaXRoZHJhdyBpcyBvbmx5IGZvciBoYXJkIG9yIGxvY2sKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDQ0CiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgYXNzZXQsIHR5cGUgfQogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ0NQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9OT19MT0NLKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ0NQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9OT19MT0NLKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBMb2NrIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIGNvbnN0IHsgZXhwaXJhdGlvbiwgYW1vdW50IH0gPSB0aGlzLnN0YWtlcyhzaykudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIGFzc2VydCh0eXBlICE9PSBTVEFLSU5HX1RZUEVfTE9DSyB8fCBleHBpcmF0aW9uIDwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xPQ0tFRCkKICAgIGJ5dGVjXzIgLy8gMHgyOAogICAgIT0KICAgIGJueiB3aXRoZHJhd19ib29sX3RydWVANwogICAgZGlnIDIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDwKICAgIGJ6IHdpdGhkcmF3X2Jvb2xfZmFsc2VAOAoKd2l0aGRyYXdfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKd2l0aGRyYXdfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIGFzc2VydCh0eXBlICE9PSBTVEFLSU5HX1RZUEVfTE9DSyB8fCBleHBpcmF0aW9uIDwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xPQ0tFRCkKICAgIGFzc2VydCAvLyBUaGlzIGFzc2V0IGlzIHN0aWxsIGxvY2tlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgZGlnIDEKICAgIGJueiB3aXRoZHJhd19lbHNlX2JvZHlAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDUxLTQ1NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ1MwogICAgLy8gcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDUxLTQ1NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDUxLTQ1NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDY3CiAgICAvLyB0aGlzLnVwZGF0ZVRvdGFscyhhc3NldCwgdHlwZSwgYW1vdW50LCBmYWxzZSkKICAgIGR1cDIKICAgIGRpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1cGRhdGVUb3RhbHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDY5CiAgICAvLyB0aGlzLnN0YWtlcyhzaykuZGVsZXRlKCkKICAgIGRpZyA0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyB3aXRoZHJhdyhhc3NldDogdWludDY0LCB0eXBlOiBTdGFraW5nVHlwZSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKd2l0aGRyYXdfZWxzZV9ib2R5QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NTgtNDY0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ1OC00NjMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ1OC00NjQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAxNAoKd2l0aGRyYXdfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgd2l0aGRyYXdfYm9vbF9tZXJnZUA5Cgp3aXRoZHJhd19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiB3aXRoZHJhd19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmNyZWF0ZUhlYXJ0YmVhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUhlYXJ0YmVhdDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBjcmVhdGVIZWFydGJlYXQoYWRkcmVzczogQWNjb3VudCwgYXNzZXQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmhlYXJ0YmVhdE1hbmFnZXJBZGRyZXNzLnZhbHVlLCBFUlJfTk9UX0hFQVJUQkVBVF9NQU5BR0VSKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIGhlYXJ0YmVhdE1hbmFnZXJBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IFN0YWtpbmdHbG9iYWxTdGF0ZUtleUhlYXJ0YmVhdE1hbmFnZXJBZGRyZXNzIH0pCiAgICBwdXNoYnl0ZXMgImhlYXJ0YmVhdF9tYW5hZ2VyX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuaGVhcnRiZWF0TWFuYWdlckFkZHJlc3MudmFsdWUsIEVSUl9OT1RfSEVBUlRCRUFUX01BTkFHRVIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBoZWFydGJlYXQgbWFuYWdlciBjYW4gY2FsbCB0aGlzIG1ldGhvZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIGNvbnN0IGhiayA9IHsgYWRkcmVzcywgYXNzZXQgfQogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDc2CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4Ny04OQogICAgLy8gaGVhcnRiZWF0cyA9IEJveE1hcDxIZWFydGJlYXRLZXksIGFyYzQuU3RhdGljQXJyYXk8YXJjNEhlYXJ0YmVhdCwgND4+KHsKICAgIC8vICAga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4SGVhcnRiZWF0cywKICAgIC8vIH0pCiAgICBieXRlYyA1IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDc2CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBIZWFydGJlYXQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gY29uc3QgdGltZXN0YW1wID0gbmV3IFVpbnQ2NChHbG9iYWwubGF0ZXN0VGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIGNvbnN0IGhlYXJ0YmVhdHMgPSBjbG9uZSh0aGlzLmhlYXJ0YmVhdHMoaGJrKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHBvcAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IFtob2xkaW5nc10gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKGFkZHJlc3MsIGFzc2V0KQogICAgY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBjb25zdCBoZWxkID0gbmV3IFVpbnQ2NChob2xkaW5ncykKICAgIGl0b2IKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDg3CiAgICAvLyB0eXBlOiBTVEFLSU5HX1RZUEVfSEFSRAogICAgYnl0ZWMgNCAvLyAweDFlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ4NC00ODgKICAgIC8vIGNvbnN0IGhhcmRTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzcywKICAgIC8vICAgYXNzZXQsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9IQVJECiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyBsZXQgaGFyZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBpZiAodGhpcy5zdGFrZXMoaGFyZFN0YWtlS2V5KS5leGlzdHMpIHsKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiA4CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgNDAgMQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBpZiAodGhpcy5zdGFrZXMoaGFyZFN0YWtlS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY3JlYXRlSGVhcnRiZWF0X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGhhcmQgPSB0aGlzLnN0YWtlcyhoYXJkU3Rha2VLZXkpLnZhbHVlLmFtb3VudAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDIKCmNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ5NS00OTkKICAgIC8vIGNvbnN0IGxvY2tTdGFrZUtleSA9IHsKICAgIC8vICAgYWRkcmVzcywKICAgIC8vICAgYXNzZXQsCiAgICAvLyAgIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLCiAgICAvLyB9CiAgICBkaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo0OTgKICAgIC8vIHR5cGU6IFNUQUtJTkdfVFlQRV9MT0NLCiAgICBieXRlY18yIC8vIDB4MjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NDk1LTQ5OQogICAgLy8gY29uc3QgbG9ja1N0YWtlS2V5ID0gewogICAgLy8gICBhZGRyZXNzLAogICAgLy8gICBhc3NldCwKICAgIC8vICAgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sKICAgIC8vIH0KICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGxldCBsb2NrOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhsb2NrU3Rha2VLZXkpLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhsb2NrU3Rha2VLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBjcmVhdGVIZWFydGJlYXRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUwMwogICAgLy8gbG9jayA9IHRoaXMuc3Rha2VzKGxvY2tTdGFrZUtleSkudmFsdWUuYW1vdW50CiAgICBkaWcgMTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOQoKY3JlYXRlSGVhcnRiZWF0X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTEyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgNDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKY3JlYXRlSGVhcnRiZWF0X3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgIGRpZyAxMAogICAgcHVzaGludCA0IC8vIDQKICAgIDwKICAgIGJ6IGNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuY3JlYXRlSGVhcnRiZWF0QDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gaSA9PT0gMyB8fAogICAgZGlnIDEwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUxNC01MTUKICAgIC8vIGkgPT09IDMgfHwKICAgIC8vIGhlYXJ0YmVhdHNbaV0udGltZXN0YW1wLmFzVWludDY0KCkgPiBoZWFydGJlYXRzW2kgKyAxXS50aW1lc3RhbXAuYXNVaW50NjQoKQogICAgYm56IGNyZWF0ZUhlYXJ0YmVhdF9pZl9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTE1CiAgICAvLyBoZWFydGJlYXRzW2ldLnRpbWVzdGFtcC5hc1VpbnQ2NCgpID4gaGVhcnRiZWF0c1tpICsgMV0udGltZXN0YW1wLmFzVWludDY0KCkKICAgIGRpZyAxMAogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMwogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTQtNTE1CiAgICAvLyBpID09PSAzIHx8CiAgICAvLyBoZWFydGJlYXRzW2ldLnRpbWVzdGFtcC5hc1VpbnQ2NCgpID4gaGVhcnRiZWF0c1tpICsgMV0udGltZXN0YW1wLmFzVWludDY0KCkKICAgIGJ6IGNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pZl9lbHNlQDEzCgpjcmVhdGVIZWFydGJlYXRfaWZfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTcKICAgIC8vIGNvbnN0IGluZGV4VG9Nb2RpZnk6IHVpbnQ2NCA9IGkgPT09IDMgPyAwIDogaSArIDEKICAgIGRpZyA3CiAgICBieiBjcmVhdGVIZWFydGJlYXRfdGVybmFyeV9mYWxzZUAxMQogICAgaW50Y18wIC8vIDAKCmNyZWF0ZUhlYXJ0YmVhdF90ZXJuYXJ5X21lcmdlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjAKICAgIC8vIGhhcmQ6IG5ldyBVaW50NjQoaGFyZCksCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjEKICAgIC8vIGxvY2s6IG5ldyBVaW50NjQobG9jayksCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUyMwogICAgLy8gdGhpcy5oZWFydGJlYXRzKGhiaykudmFsdWVbaW5kZXhUb01vZGlmeV0gPSBuZXcgYXJjNEhlYXJ0YmVhdCh7CiAgICAvLyAgIGhlbGQsCiAgICAvLyAgIGhhcmQ6IG5ldyBVaW50NjQoaGFyZCksCiAgICAvLyAgIGxvY2s6IG5ldyBVaW50NjQobG9jayksCiAgICAvLyAgIHRpbWVzdGFtcCwKICAgIC8vIH0pCiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBkaWcgNwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQoKY3JlYXRlSGVhcnRiZWF0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5jcmVhdGVIZWFydGJlYXRAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjQ3MgogICAgLy8gY3JlYXRlSGVhcnRiZWF0KGFkZHJlc3M6IEFjY291bnQsIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZUhlYXJ0YmVhdF90ZXJuYXJ5X2ZhbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MTcKICAgIC8vIGNvbnN0IGluZGV4VG9Nb2RpZnk6IHVpbnQ2NCA9IGkgPT09IDMgPyAwIDogaSArIDEKICAgIGRpZyAxMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGIgY3JlYXRlSGVhcnRiZWF0X3Rlcm5hcnlfbWVyZ2VAMTIKCmNyZWF0ZUhlYXJ0YmVhdF9hZnRlcl9pZl9lbHNlQDEzOgogICAgZGlnIDkKICAgIGJ1cnkgMTEKICAgIGIgY3JlYXRlSGVhcnRiZWF0X3doaWxlX3RvcEA2CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zb2Z0Q2hlY2tbcm91dGluZ10oKSAtPiB2b2lkOgpzb2Z0Q2hlY2s6CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTI5CiAgICAvLyBzb2Z0Q2hlY2soYWRkcmVzczogQWNjb3VudCwgYXNzZXQ6IHVpbnQ2NCk6IFN0YWtlQ2hlY2sgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMAogICAgLy8gY29uc3Qgc2sgPSB7IGFkZHJlc3MsIGFzc2V0LCB0eXBlOiBTVEFLSU5HX1RZUEVfU09GVCB9CiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9TVEFLRV9ET0VTTlRfRVhJU1QpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDQwIDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9TVEFLRV9ET0VTTlRfRVhJU1QpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFN0YWtlIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzMwogICAgLy8gY29uc3QgeyBhbW91bnQgfSA9IHRoaXMuc3Rha2VzKHNrKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTM0CiAgICAvLyBjb25zdCBsYXN0VXBkYXRlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MzYKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgYm56IHNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTM3CiAgICAvLyBjb25zdCB2YWxpZCA9IGFkZHJlc3MuYmFsYW5jZSA+PSBhbW91bnQKICAgIGRpZyA0CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgPD0KICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjUzOAogICAgLy8gaWYgKCF2YWxpZCkgewogICAgYm56IHNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTQwCiAgICAvLyBhbW91bnQ6IGFkZHJlc3MuYmFsYW5jZSwKICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MzktNTQzCiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogYWRkcmVzcy5iYWxhbmNlLAogICAgLy8gICBsYXN0VXBkYXRlLAogICAgLy8gICBleHBpcmF0aW9uOiAwLAogICAgLy8gfQogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NDIKICAgIC8vIGV4cGlyYXRpb246IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MzktNTQzCiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogYWRkcmVzcy5iYWxhbmNlLAogICAgLy8gICBsYXN0VXBkYXRlLAogICAgLy8gICBleHBpcmF0aW9uOiAwLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgc3dhcAogICAgYm94X3B1dAoKc29mdENoZWNrX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyByZXR1cm4geyB2YWxpZCwgYmFsYW5jZTogYWRkcmVzcy5iYWxhbmNlIH0KICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgYnl0ZWMgOSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDgKICAgIHNldGJpdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0Cgpzb2Z0Q2hlY2tfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnNvZnRDaGVja0A4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjkKICAgIC8vIHNvZnRDaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogU3Rha2VDaGVjayB7CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzb2Z0Q2hlY2tfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NDgKICAgIC8vIGNvbnN0IFtob2xkaW5nQW1vdW50LCBvcHRlZEluXSA9IEFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoYWRkcmVzcywgYXNzZXQpCiAgICBkaWcgNAogICAgZGlnIDQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gYXNzZXJ0KG9wdGVkSW4sIEVSUl9OT1RfT1BURURfSU4pCiAgICBhc3NlcnQgLy8gTm90IG9wdGVkIGluCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU1MAogICAgLy8gY29uc3QgdmFsaWQgPSBob2xkaW5nQW1vdW50ID49IGFtb3VudAogICAgPD0KICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU1MQogICAgLy8gaWYgKCF2YWxpZCkgewogICAgYm56IHNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTUyLTU1NgogICAgLy8gdGhpcy5zdGFrZXMoc2spLnZhbHVlID0gewogICAgLy8gICBhbW91bnQ6IGhvbGRpbmdBbW91bnQsCiAgICAvLyAgIGxhc3RVcGRhdGUsCiAgICAvLyAgIGV4cGlyYXRpb246IDAsCiAgICAvLyB9CiAgICBkaWcgNgogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NTUKICAgIC8vIGV4cGlyYXRpb246IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NTItNTU2CiAgICAvLyB0aGlzLnN0YWtlcyhzaykudmFsdWUgPSB7CiAgICAvLyAgIGFtb3VudDogaG9sZGluZ0Ftb3VudCwKICAgIC8vICAgbGFzdFVwZGF0ZSwKICAgIC8vICAgZXhwaXJhdGlvbjogMCwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKCnNvZnRDaGVja19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU1OQogICAgLy8gcmV0dXJuIHsgdmFsaWQsIGJhbGFuY2U6IGhvbGRpbmdBbW91bnQgfQogICAgYnl0ZWMgOSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDYKICAgIHNldGJpdAogICAgZGlnIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1MjkKICAgIC8vIHNvZnRDaGVjayhhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0KTogU3Rha2VDaGVjayB7CiAgICBiIHNvZnRDaGVja19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc29mdENoZWNrQDgKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnVwZGF0ZVNldHRpbmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlU2V0dGluZ3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2MgogICAgLy8gdXBkYXRlU2V0dGluZ3MocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogdWludDY0LCB2YWx1ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBBc3NldChhc3NldCkuY3JlYXRvciwgRVJSX05PVF9BU1NFVF9DUkVBVE9SKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIGFzc2V0IGNyZWF0b3IgY2FuIGNhbGwgdGhpcyBtZXRob2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTY0LTU3MQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnNldHRpbmdzKGFzc2V0KS5leGlzdHMgPyAwIDogdGhpcy5tYnIoKS5zZXR0aW5ncywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2NwogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTY0LTU3MQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnNldHRpbmdzKGFzc2V0KS5leGlzdHMgPyAwIDogdGhpcy5tYnIoKS5zZXR0aW5ncywKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NjgKICAgIC8vIGFtb3VudDogdGhpcy5zZXR0aW5ncyhhc3NldCkuZXhpc3RzID8gMCA6IHRoaXMubWJyKCkuc2V0dGluZ3MsCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkzCiAgICAvLyBzZXR0aW5ncyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTZXR0aW5ncyB9KQogICAgcHVzaGJ5dGVzICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTY4CiAgICAvLyBhbW91bnQ6IHRoaXMuc2V0dGluZ3MoYXNzZXQpLmV4aXN0cyA/IDAgOiB0aGlzLm1icigpLnNldHRpbmdzLAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiB1cGRhdGVTZXR0aW5nc190ZXJuYXJ5X2ZhbHNlQDMKICAgIGludGNfMCAvLyAwCgp1cGRhdGVTZXR0aW5nc190ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2NC01NzEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5zZXR0aW5ncyhhc3NldCkuZXhpc3RzID8gMCA6IHRoaXMubWJyKCkuc2V0dGluZ3MsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICA9PQogICAgZGlnIDMKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU3MwogICAgLy8gdGhpcy5zZXR0aW5ncyhhc3NldCkudmFsdWUgPSB2YWx1ZQogICAgZGlnIDMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2MgogICAgLy8gdXBkYXRlU2V0dGluZ3MocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogdWludDY0LCB2YWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp1cGRhdGVTZXR0aW5nc190ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU2OAogICAgLy8gYW1vdW50OiB0aGlzLnNldHRpbmdzKGFzc2V0KS5leGlzdHMgPyAwIDogdGhpcy5tYnIoKS5zZXR0aW5ncywKICAgIHB1c2hpbnQgOTMwMCAvLyA5MzAwCiAgICBiIHVwZGF0ZVNldHRpbmdzX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcub3B0SW5Db3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODAKICAgIC8vIHJldHVybiB0b3RhbHNNQlIgKyBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIHB1c2hpbnQgMTI1MDAgLy8gMTI1MDAKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1NzgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc3Rha2VDb3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKc3Rha2VDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODUKICAgIC8vIGNvbnN0IHsgc3Rha2VzLCBoZWFydGJlYXRzIH0gPSB0aGlzLm1icigpCiAgICBpbnRjIDQgLy8gMjg5MDAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTg2CiAgICAvLyBjb25zdCBzazogU3Rha2VLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIGFzc2V0LCB0eXBlIH0KICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU4NwogICAgLy8gY29uc3QgaXNVcGRhdGUgPSB0aGlzLnN0YWtlcyhzaykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTg5CiAgICAvLyBpZiAoaXNVcGRhdGUpIHsKICAgIGJ6IHN0YWtlQ29zdF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTkwCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKCnN0YWtlQ29zdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc3Rha2VDb3N0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjU4MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzdGFrZUNvc3RfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1OTMKICAgIC8vIGlmICh0eXBlID09PSBTVEFLSU5HX1RZUEVfSEVBUlRCRUFUKSB7CiAgICBkaWcgMQogICAgYnl0ZWMgNyAvLyAweDBhCiAgICA9PQogICAgYnogc3Rha2VDb3N0X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIHJldHVybiBzdGFrZXMgKyBoZWFydGJlYXRzCiAgICBpbnRjIDUgLy8gOTkwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NTgzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgc3Rha2VDb3N0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNvc3RANgoKc3Rha2VDb3N0X2FmdGVyX2lmX2Vsc2VANToKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBzdGFrZUNvc3RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLnN0YWtlQ29zdEA2CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRUaW1lTGVmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFRpbWVMZWZ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDIKICAgIC8vIGNvbnN0IHNrID0geyBhZGRyZXNzLCBhc3NldCwgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sgfQogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MjgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cyB8fCBHbG9iYWwubGF0ZXN0VGltZXN0YW1wID49IHRoaXMuc3Rha2VzKHNrKS52YWx1ZS5leHBpcmF0aW9uKSB7CiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDQwIDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYwMwogICAgLy8gaWYgKCF0aGlzLnN0YWtlcyhzaykuZXhpc3RzIHx8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPj0gdGhpcy5zdGFrZXMoc2spLnZhbHVlLmV4cGlyYXRpb24pIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0VGltZUxlZnRfaWZfYm9keUAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICA+PQogICAgYnogZ2V0VGltZUxlZnRfYWZ0ZXJfaWZfZWxzZUA0CgpnZXRUaW1lTGVmdF9pZl9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYwNAogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRUaW1lTGVmdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0VGltZUxlZnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjAwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldFRpbWVMZWZ0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjA3CiAgICAvLyByZXR1cm4gdGhpcy5zdGFrZXMoc2spLnZhbHVlLmV4cGlyYXRpb24gLSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MDAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRUaW1lTGVmdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0VGltZUxlZnRANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcubXVzdEdldFRpbWVMZWZ0W3JvdXRpbmddKCkgLT4gdm9pZDoKbXVzdEdldFRpbWVMZWZ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIGNvbnN0IHNrID0geyBhZGRyZXNzLCBhc3NldCwgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sgfQogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MjgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTMKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfTk9fTE9DSykKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiA4CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgNDAgMQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHN0YWtlcyA9IEJveE1hcDxTdGFrZUtleSwgU3Rha2U+KHsga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4U3Rha2VzIH0pCiAgICBieXRlY18wIC8vICJzIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9OT19MT0NLKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBMb2NrIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTQKICAgIC8vIGFzc2VydChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgdGhpcy5zdGFrZXMoc2spLnZhbHVlLmV4cGlyYXRpb24sIEVSUl9MT0NLRUQpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIFRoaXMgYXNzZXQgaXMgc3RpbGwgbG9ja2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gcmV0dXJuIHRoaXMuc3Rha2VzKHNrKS52YWx1ZS5leHBpcmF0aW9uIC0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYxOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ2NCx1aW50OCkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjIwCiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgLi4uc3Rha2UgfQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYyMQogICAgLy8gaWYgKCF0aGlzLnN0YWtlcyhzaykuZXhpc3RzKSB7CiAgICBkdXAKICAgIGV4dHJhY3QgOSAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA4CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgOCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MjEKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0SW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyByZXR1cm4geyBhbW91bnQ6IDAsIGxhc3RVcGRhdGU6IDAsIGV4cGlyYXRpb246IDAgfQogICAgYnl0ZWMgMTMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmdldEluZm9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEluZm9ANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldEluZm9fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MjUKICAgIC8vIHJldHVybiB0aGlzLnN0YWtlcyhzaykudmFsdWUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgZ2V0SW5mb19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SW5mb0A0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5tdXN0R2V0SW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6Cm11c3RHZXRJbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MjgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yICh1aW50NjQsdWludDgpCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjYzMAogICAgLy8gY29uc3Qgc2sgPSB7IGFkZHJlc3MsIC4uLnN0YWtlIH0KICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGV4dHJhY3QgOCAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfTk9fTE9DSykKICAgIGR1cAogICAgZXh0cmFjdCA5IDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA4IDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfTk9fTE9DSykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTG9jayBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjMzCiAgICAvLyByZXR1cm4gdGhpcy5zdGFrZXMoc2spLnZhbHVlCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjI4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEVzY3Jvd0luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRFc2Nyb3dJbmZvOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjM2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjM4CiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQsIHR5cGU6IFNUQUtJTkdfVFlQRV9IQVJEIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgZHVwCiAgICBieXRlYyA0IC8vIDB4MWUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzkKICAgIC8vIGNvbnN0IGxrID0geyBhZGRyZXNzLCBhc3NldCwgdHlwZTogU1RBS0lOR19UWVBFX0xPQ0sgfQogICAgc3dhcAogICAgYnl0ZWNfMiAvLyAweDI4CiAgICBjb25jYXQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyBsZXQgaGFyZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyBpZiAodGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NDIKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhzaykuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldEVzY3Jvd0luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY0MwogICAgLy8gaGFyZCA9IHRoaXMuc3Rha2VzKHNrKS52YWx1ZS5hbW91bnQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAyCgpnZXRFc2Nyb3dJbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQ2CiAgICAvLyBsZXQgbG9jazogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NDcKICAgIC8vIGlmICh0aGlzLnN0YWtlcyhsaykuZXhpc3RzKSB7CiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY0NwogICAgLy8gaWYgKHRoaXMuc3Rha2VzKGxrKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0RXNjcm93SW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjQ4CiAgICAvLyBsb2NrID0gdGhpcy5zdGFrZXMobGspLnZhbHVlLmFtb3VudAogICAgZGlnIDQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAoKZ2V0RXNjcm93SW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY1MQogICAgLy8gcmV0dXJuIHsgaGFyZCwgbG9jayB9CiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2MzYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0SGVhcnRiZWF0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTYKICAgIC8vIGNvbnN0IGhiayA9IHsgYWRkcmVzcywgYXNzZXQgfQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY1NwogICAgLy8gaWYgKCF0aGlzLmhlYXJ0YmVhdHMoaGJrKS5leGlzdHMpIHsKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBleHRyYWN0IDMyIDgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4Ny04OQogICAgLy8gaGVhcnRiZWF0cyA9IEJveE1hcDxIZWFydGJlYXRLZXksIGFyYzQuU3RhdGljQXJyYXk8YXJjNEhlYXJ0YmVhdCwgND4+KHsKICAgIC8vICAga2V5UHJlZml4OiBTdGFraW5nQm94UHJlZml4SGVhcnRiZWF0cywKICAgIC8vIH0pCiAgICBieXRlYyA1IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjU3CiAgICAvLyBpZiAoIXRoaXMuaGVhcnRiZWF0cyhoYmspLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0SGVhcnRiZWF0X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTgtNjYzCiAgICAvLyByZXR1cm4gbmV3IGFyYzQuU3RhdGljQXJyYXk8YXJjNEhlYXJ0YmVhdCwgND4oCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCksCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCksCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCksCiAgICAvLyAgIGVtcHR5SGVhcnRiZWF0KCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmdldEhlYXJ0YmVhdF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY1NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRIZWFydGJlYXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIHJldHVybiB0aGlzLmhlYXJ0YmVhdHMoaGJrKS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRIZWFydGJlYXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5tdXN0R2V0SGVhcnRiZWF0W3JvdXRpbmddKCkgLT4gdm9pZDoKbXVzdEdldEhlYXJ0YmVhdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyBjb25zdCBoYmsgPSB7IGFkZHJlc3MsIGFzc2V0IH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIGFzc2VydCh0aGlzLmhlYXJ0YmVhdHMoaGJrKS5leGlzdHMsIEVSUl9IRUFSQkVBVF9OT1RfRk9VTkQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgZXh0cmFjdCAzMiA4CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6ODctODkKICAgIC8vIGhlYXJ0YmVhdHMgPSBCb3hNYXA8SGVhcnRiZWF0S2V5LCBhcmM0LlN0YXRpY0FycmF5PGFyYzRIZWFydGJlYXQsIDQ+Pih7CiAgICAvLyAgIGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeEhlYXJ0YmVhdHMsCiAgICAvLyB9KQogICAgYnl0ZWMgNSAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIGFzc2VydCh0aGlzLmhlYXJ0YmVhdHMoaGJrKS5leGlzdHMsIEVSUl9IRUFSQkVBVF9OT1RfRk9VTkQpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEhlYXJ0YmVhdCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjczCiAgICAvLyByZXR1cm4gdGhpcy5oZWFydGJlYXRzKGhiaykudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEhlYXJ0YmVhdEF2ZXJhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY3NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcubXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcwNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcwOAogICAgLy8gY29uc3QgaGJrID0geyBhZGRyZXNzLCBhc3NldCB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzA5CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIGV4dHJhY3QgMzIgOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzA5CiAgICAvLyBhc3NlcnQodGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzLCBFUlJfSEVBUkJFQVRfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBIZWFydGJlYXQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcxMQogICAgLy8gY29uc3QgaGVhcnRiZWF0cyA9IGNsb25lKHRoaXMuaGVhcnRiZWF0cyhoYmspLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcxMwogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTQtNzE1CiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgIGR1cG4gMgoKbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2Vfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcxNQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IDQ7IGkgKz0gMSkgewogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPAogICAgYnogbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfd2hpbGVAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTcKICAgIC8vIGlmIChoZWFydGJlYXRzW2ldLnRpbWVzdGFtcC5hc1VpbnQ2NCgpID4gMCkgewogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDcKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzE4CiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIGlmIChpbmNsdWRlRXNjcm93ZWQpIHsKICAgIGRpZyA0CiAgICBieiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MjAKICAgIC8vIHRvdGFsICs9IGhlYXJ0YmVhdHNbaV0uaGVsZC5hc1VpbnQ2NCgpICsgaGVhcnRiZWF0c1tpXS5oYXJkLmFzVWludDY0KCkgKyBoZWFydGJlYXRzW2ldLmxvY2suYXNVaW50NjQoKQogICAgZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgMwoKbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MTUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV93aGlsZV90b3BAMgoKbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcyMgogICAgLy8gdG90YWwgKz0gaGVhcnRiZWF0c1tpXS5oZWxkLmFzVWludDY0KCkKICAgIGRpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICArCiAgICBidXJ5IDMKICAgIGIgbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUA4CgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl93aGlsZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIGlmIChjb3VudCA9PT0gMCkgewogICAgZGlnIDEKICAgIGJueiBtdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcyOAogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcubXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjcwNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptdXN0R2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MzEKICAgIC8vIHJldHVybiB0b3RhbCAvIGNvdW50CiAgICBkaWcgMgogICAgZGlnIDIKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzA2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgbXVzdEdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLm11c3RHZXRIZWFydGJlYXRBdmVyYWdlQDEyCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRJbmZvTGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEluZm9MaXN0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDY0W10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczNgogICAgLy8gbGV0IHJlc3VsdHM6IFN0YWtlW10gPSBbXQogICAgYnl0ZWMgMTAgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczNwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmdldEluZm9MaXN0X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MzcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGdldEluZm9MaXN0X2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzM4CiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQ6IGFzc2V0c1tpXSwgdHlwZSB9CiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3MzkKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczOQogICAgLy8gaWYgKCF0aGlzLnN0YWtlcyhzaykuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRJbmZvTGlzdF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzQ3CiAgICAvLyByZXN1bHRzLnB1c2goZW1wdHlTdGFrZSkKICAgIGRpZyAxCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzQxLTc0NQogICAgLy8gY29uc3QgZW1wdHlTdGFrZTogU3Rha2UgPSB7CiAgICAvLyAgIGFtb3VudDogMCwKICAgIC8vICAgbGFzdFVwZGF0ZTogMCwKICAgIC8vICAgZXhwaXJhdGlvbjogMCwKICAgIC8vIH0KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc0NwogICAgLy8gcmVzdWx0cy5wdXNoKGVtcHR5U3Rha2UpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDIKCmdldEluZm9MaXN0X2Jsb2NrQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjczNwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGdldEluZm9MaXN0X3doaWxlX3RvcEAyCgpnZXRJbmZvTGlzdF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1MQogICAgLy8gcmVzdWx0cy5wdXNoKHRoaXMuc3Rha2VzKHNrKS52YWx1ZSkKICAgIGRpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDIKICAgIGIgZ2V0SW5mb0xpc3RfYmxvY2tANgoKZ2V0SW5mb0xpc3RfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5tdXN0R2V0SW5mb0xpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgptdXN0R2V0SW5mb0xpc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ2NFtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NTgKICAgIC8vIGxldCByZXN1bHRzOiBTdGFrZVtdID0gW10KICAgIGJ5dGVjIDEwIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgptdXN0R2V0SW5mb0xpc3Rfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogbXVzdEdldEluZm9MaXN0X2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzYwCiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQ6IGFzc2V0c1tpXSwgdHlwZSB9CiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNwogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VzKHNrKS5leGlzdHMsIEVSUl9TVEFLRV9OT1RfRk9VTkQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDQwIDEKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBzdGFrZXMgPSBCb3hNYXA8U3Rha2VLZXksIFN0YWtlPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFN0YWtlcyB9KQogICAgYnl0ZWNfMCAvLyAicyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcyhzaykuZXhpc3RzLCBFUlJfU1RBS0VfTk9UX0ZPVU5EKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBTdGFrZSBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzYyCiAgICAvLyByZXN1bHRzLnB1c2godGhpcy5zdGFrZXMoc2spLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgbXVzdEdldEluZm9MaXN0X3doaWxlX3RvcEAyCgptdXN0R2V0SW5mb0xpc3RfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzU2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNoZWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKc3Rha2VDaGVjazoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuKyh1aW50NjQsdWludDY0KVtdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgpzdGFrZUNoZWNrX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHN0YWtlQ2hlY2tfYWZ0ZXJfd2hpbGVAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzcwCiAgICAvLyBjb25zdCBzayA9IHsgYWRkcmVzcywgYXNzZXQ6IGNoZWNrc1tpXS5hc3NldCwgdHlwZSB9CiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgaXRvYgogICAgZGlnIDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzEKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0MCAxCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gc3Rha2VzID0gQm94TWFwPFN0YWtlS2V5LCBTdGFrZT4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhTdGFrZXMgfSkKICAgIGJ5dGVjXzAgLy8gInMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzEKICAgIC8vIGlmICghdGhpcy5zdGFrZXMoc2spLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogc3Rha2VDaGVja19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzcyCiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCgpzdGFrZUNoZWNrX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNoZWNrQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgOSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlQ2hlY2tfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIGxldCBhbW91bnRUb0NoZWNrOiB1aW50NjQgPSB0aGlzLnN0YWtlcyhzaykudmFsdWUuYW1vdW50CiAgICBkaWcgOAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc3NgogICAgLy8gaWYgKHR5cGUgPT09IFNUQUtJTkdfVFlQRV9IRUFSVEJFQVQpIHsKICAgIGRpZyAyCiAgICBieXRlYyA3IC8vIDB4MGEKICAgID09CiAgICBieiBzdGFrZUNoZWNrX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIGFtb3VudFRvQ2hlY2sgPSB0aGlzLmdldEhlYXJ0YmVhdEF2ZXJhZ2UoYWRkcmVzcywgY2hlY2tzW2ldLmFzc2V0LCBpbmNsdWRlRXNjcm93ZWQpCiAgICBkaWcgNQogICAgZGlnIDcKICAgIGRpZyAzCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZQogICAgYnVyeSA4CgpzdGFrZUNoZWNrX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzgwCiAgICAvLyBpZiAoY2hlY2tzW2ldLmFtb3VudCA+PSBhbW91bnRUb0NoZWNrKSB7CiAgICBkaWcgOQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOAogICAgPj0KICAgIGJ6IHN0YWtlQ2hlY2tfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc4MQogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBzdGFrZUNoZWNrX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5zdGFrZUNoZWNrQDExCgpzdGFrZUNoZWNrX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzY5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3Rha2VDaGVja193aGlsZV90b3BAMgoKc3Rha2VDaGVja19hZnRlcl93aGlsZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Nzg1CiAgICAvLyByZXR1cm4gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzY3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgc3Rha2VDaGVja19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuc3Rha2VDaGVja0AxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0VG90YWxzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VG90YWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDY0W10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gbGV0IHJlc3VsdHM6IFRvdGFsc0luZm9bXSA9IFtdCiAgICBieXRlYyAxMCAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzkxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKZ2V0VG90YWxzX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3OTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGdldFRvdGFsc19hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc5MgogICAgLy8gcmVzdWx0cy5wdXNoKHRoaXMudG90YWxzKGFzc2V0c1tpXSkudmFsdWUpCiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3OTIKICAgIC8vIHJlc3VsdHMucHVzaCh0aGlzLnRvdGFscyhhc3NldHNbaV0pLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjc5MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBnZXRUb3RhbHNfd2hpbGVfdG9wQDIKCmdldFRvdGFsc19hZnRlcl93aGlsZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDggLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlYyA4IC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcudXBkYXRlVG90YWxzKGFzc2V0OiB1aW50NjQsIHR5cGU6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCwgaXNBZGQ6IHVpbnQ2NCkgLT4gdm9pZDoKdXBkYXRlVG90YWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIHByaXZhdGUgdXBkYXRlVG90YWxzKGFzc2V0OiB1aW50NjQsIHR5cGU6IFN0YWtpbmdUeXBlLCBhbW91bnQ6IHVpbnQ2NCwgaXNBZGQ6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIGlmICh0eXBlID09PSBTVEFLSU5HX1RZUEVfSEFSRCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlYyA0IC8vIDB4MWUKICAgID09CiAgICBieiB1cGRhdGVUb3RhbHNfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBpZiAoaXNBZGQpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogdXBkYXRlVG90YWxzX2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmVzY3Jvd2VkICs9IGFtb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIHRoaXMudG90YWxzKGFzc2V0KS52YWx1ZS5lc2Nyb3dlZCArPSBhbW91bnQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBpbnRjXzIgLy8gOAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCnVwZGF0ZVRvdGFsc19hZnRlcl9pZl9lbHNlQDExOgogICAgcmV0c3ViCgp1cGRhdGVUb3RhbHNfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmVzY3Jvd2VkIC09IGFtb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB0b3RhbHMgPSBCb3hNYXA8dWludDY0LCBUb3RhbHNJbmZvPih7IGtleVByZWZpeDogU3Rha2luZ0JveFByZWZpeFRvdGFscyB9KQogICAgYnl0ZWMgNiAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHRoaXMudG90YWxzKGFzc2V0KS52YWx1ZS5lc2Nyb3dlZCAtPSBhbW91bnQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpdG9iCiAgICBpbnRjXzIgLy8gOAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKdXBkYXRlVG90YWxzX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIH0gZWxzZSBpZiAodHlwZSA9PT0gU1RBS0lOR19UWVBFX0xPQ0spIHsKICAgIGZyYW1lX2RpZyAtMwogICAgYnl0ZWNfMiAvLyAweDI4CiAgICA9PQogICAgYnogdXBkYXRlVG90YWxzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBpZiAoaXNBZGQpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogdXBkYXRlVG90YWxzX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmxvY2tlZCArPSBhbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdG90YWxzID0gQm94TWFwPHVpbnQ2NCwgVG90YWxzSW5mbz4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhUb3RhbHMgfSkKICAgIGJ5dGVjIDYgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUubG9ja2VkICs9IGFtb3VudAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgp1cGRhdGVUb3RhbHNfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjEyMAogICAgLy8gdGhpcy50b3RhbHMoYXNzZXQpLnZhbHVlLmxvY2tlZCAtPSBhbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdG90YWxzID0gQm94TWFwPHVpbnQ2NCwgVG90YWxzSW5mbz4oeyBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhUb3RhbHMgfSkKICAgIGJ5dGVjIDYgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyB0aGlzLnRvdGFscyhhc3NldCkudmFsdWUubG9ja2VkIC09IGFtb3VudAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGl0b2IKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlKGFkZHJlc3M6IGJ5dGVzLCBhc3NldDogdWludDY0LCBpbmNsdWRlRXNjcm93ZWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY3Ni02NzcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0SGVhcnRiZWF0QXZlcmFnZShhZGRyZXNzOiBBY2NvdW50LCBhc3NldDogdWludDY0LCBpbmNsdWRlRXNjcm93ZWQ6IGJvb2xlYW4pOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Njc4CiAgICAvLyBjb25zdCBoYmsgPSB7IGFkZHJlc3MsIGFzc2V0IH0KICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjgwCiAgICAvLyBpZiAoIXRoaXMuaGVhcnRiZWF0cyhoYmspLmV4aXN0cykgewogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIGV4dHJhY3QgMzIgOAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjg3LTg5CiAgICAvLyBoZWFydGJlYXRzID0gQm94TWFwPEhlYXJ0YmVhdEtleSwgYXJjNC5TdGF0aWNBcnJheTxhcmM0SGVhcnRiZWF0LCA0Pj4oewogICAgLy8gICBrZXlQcmVmaXg6IFN0YWtpbmdCb3hQcmVmaXhIZWFydGJlYXRzLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODAKICAgIC8vIGlmICghdGhpcy5oZWFydGJlYXRzKGhiaykuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4MQogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Njg0CiAgICAvLyBjb25zdCBoZWFydGJlYXRzID0gY2xvbmUodGhpcy5oZWFydGJlYXRzKGhiaykudmFsdWUpCiAgICBmcmFtZV9kaWcgNQogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODcKICAgIC8vIGxldCBjb3VudDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2ODgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBoZWFydGJlYXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2Vfd2hpbGVfdG9wQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGhlYXJ0YmVhdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDQgLy8gNAogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX3doaWxlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4OQogICAgLy8gaWYgKGhlYXJ0YmVhdHNbaV0udGltZXN0YW1wLmFzVWludDY0KCkgPiAwKSB7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2OTAKICAgIC8vIGNvdW50ICs9IDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY5MQogICAgLy8gaWYgKGluY2x1ZGVFc2Nyb3dlZCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2VfZWxzZV9ib2R5QDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NjkyCiAgICAvLyB0b3RhbCArPSBoZWFydGJlYXRzW2ldLmhlbGQuYXNVaW50NjQoKSArIGhlYXJ0YmVhdHNbaV0uaGFyZC5hc1VpbnQ2NCgpICsgaGVhcnRiZWF0c1tpXS5sb2NrLmFzVWludDY0KCkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIGZyYW1lX2RpZyA0CiAgICArCiAgICBmcmFtZV9idXJ5IDQKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGhlYXJ0YmVhdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV93aGlsZV90b3BAMwoKc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo2OTQKICAgIC8vIHRvdGFsICs9IGhlYXJ0YmVhdHNbaV0uaGVsZC5hc1VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl9pZl9lbHNlQDkKCnNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6OlN0YWtpbmcuZ2V0SGVhcnRiZWF0QXZlcmFnZV9hZnRlcl93aGlsZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6Njk5CiAgICAvLyBpZiAoY291bnQgPT09IDApIHsKICAgIGZyYW1lX2RpZyAyCiAgICBibnogc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29udHJhY3QuYWxnby50czo6U3Rha2luZy5nZXRIZWFydGJlYXRBdmVyYWdlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb250cmFjdC5hbGdvLnRzOjpTdGFraW5nLmdldEhlYXJ0YmVhdEF2ZXJhZ2VfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbnRyYWN0LmFsZ28udHM6NzAzCiAgICAvLyByZXR1cm4gdG90YWwgLyBjb3VudAogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=\",\"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 Escrow = {\n hard: bigint,\n lock: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Escrow to the struct representation\n */\nexport function EscrowFromTuple(abiTuple: [bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Escrow, APP_SPEC.structs) as Escrow\n}\n\nexport type HeartbeatKey = {\n address: string,\n asset: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a HeartbeatKey to the struct representation\n */\nexport function HeartbeatKeyFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.HeartbeatKey, APP_SPEC.structs) as HeartbeatKey\n}\n\nexport type Stake = {\n amount: bigint,\n lastUpdate: bigint,\n expiration: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Stake to the struct representation\n */\nexport function StakeFromTuple(abiTuple: [bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Stake, APP_SPEC.structs) as Stake\n}\n\nexport type StakeCheck = {\n valid: boolean,\n balance: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakeCheck to the struct representation\n */\nexport function StakeCheckFromTuple(abiTuple: [boolean, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakeCheck, APP_SPEC.structs) as StakeCheck\n}\n\nexport type StakeInfo = {\n asset: bigint,\n type: number\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakeInfo to the struct representation\n */\nexport function StakeInfoFromTuple(abiTuple: [bigint, number]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakeInfo, APP_SPEC.structs) as StakeInfo\n}\n\nexport type StakeKey = {\n address: string,\n asset: bigint,\n type: number\n}\n\n\n/**\n * Converts the ABI tuple representation of a StakeKey to the struct representation\n */\nexport function StakeKeyFromTuple(abiTuple: [string, bigint, number]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.StakeKey, APP_SPEC.structs) as StakeKey\n}\n\nexport type TotalsInfo = {\n locked: bigint,\n escrowed: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a TotalsInfo to the struct representation\n */\nexport function TotalsInfoFromTuple(abiTuple: [bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.TotalsInfo, APP_SPEC.structs) as TotalsInfo\n}\n\n/**\n * The argument types for the Staking contract\n */\nexport type StakingArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint64)void': {\n version: string\n akitaDao: bigint | number\n }\n 'init()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 'stake(pay,uint8,uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n type: bigint | number\n amount: bigint | number\n expiration: bigint | number\n }\n 'stakeAsa(pay,axfer,uint8,uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n type: bigint | number\n amount: bigint | number\n expiration: bigint | number\n }\n 'withdraw(uint64,uint8)void': {\n asset: bigint | number\n type: bigint | number\n }\n 'createHeartbeat(address,uint64)void': {\n address: string\n asset: bigint | number\n }\n 'softCheck(address,uint64)(bool,uint64)': {\n address: string\n asset: bigint | number\n }\n 'updateSettings(pay,uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n asset: bigint | number\n value: bigint | number\n }\n 'optInCost()uint64': Record<string, never>\n 'stakeCost(uint64,uint8)uint64': {\n asset: bigint | number\n type: bigint | number\n }\n 'getTimeLeft(address,uint64)uint64': {\n address: string\n asset: bigint | number\n }\n 'mustGetTimeLeft(address,uint64)uint64': {\n address: string\n asset: bigint | number\n }\n 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)': {\n address: string\n stake: StakeInfo\n }\n 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)': {\n address: string\n stake: StakeInfo\n }\n 'getEscrowInfo(address,uint64)(uint64,uint64)': {\n address: string\n asset: bigint | number\n }\n 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': {\n address: string\n asset: bigint | number\n }\n 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': {\n address: string\n asset: bigint | number\n }\n 'getHeartbeatAverage(address,uint64,bool)uint64': {\n address: string\n asset: bigint | number\n includeEscrowed: boolean\n }\n 'mustGetHeartbeatAverage(address,uint64,bool)uint64': {\n address: string\n asset: bigint | number\n includeEscrowed: boolean\n }\n 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': {\n address: string\n type: bigint | number\n assets: bigint[] | number[]\n }\n 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': {\n address: string\n type: bigint | number\n assets: bigint[] | number[]\n }\n 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool': {\n address: string\n checks: [bigint | number, bigint | number][]\n type: bigint | number\n includeEscrowed: boolean\n }\n 'getTotals(uint64[])(uint64,uint64)[]': {\n assets: bigint[] | number[]\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,uint64)void': [version: string, akitaDao: bigint | number]\n 'init()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'stake(pay,uint8,uint64,uint64)void': [payment: AppMethodCallTransactionArgument, type: bigint | number, amount: bigint | number, expiration: bigint | number]\n 'stakeAsa(pay,axfer,uint8,uint64,uint64)void': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, type: bigint | number, amount: bigint | number, expiration: bigint | number]\n 'withdraw(uint64,uint8)void': [asset: bigint | number, type: bigint | number]\n 'createHeartbeat(address,uint64)void': [address: string, asset: bigint | number]\n 'softCheck(address,uint64)(bool,uint64)': [address: string, asset: bigint | number]\n 'updateSettings(pay,uint64,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number, value: bigint | number]\n 'optInCost()uint64': []\n 'stakeCost(uint64,uint8)uint64': [asset: bigint | number, type: bigint | number]\n 'getTimeLeft(address,uint64)uint64': [address: string, asset: bigint | number]\n 'mustGetTimeLeft(address,uint64)uint64': [address: string, asset: bigint | number]\n 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)': [address: string, stake: StakeInfo]\n 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)': [address: string, stake: StakeInfo]\n 'getEscrowInfo(address,uint64)(uint64,uint64)': [address: string, asset: bigint | number]\n 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [address: string, asset: bigint | number]\n 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [address: string, asset: bigint | number]\n 'getHeartbeatAverage(address,uint64,bool)uint64': [address: string, asset: bigint | number, includeEscrowed: boolean]\n 'mustGetHeartbeatAverage(address,uint64,bool)uint64': [address: string, asset: bigint | number, includeEscrowed: boolean]\n 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [address: string, type: bigint | number, assets: bigint[] | number[]]\n 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [address: string, type: bigint | number, assets: bigint[] | number[]]\n 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool': [address: string, checks: [bigint | number, bigint | number][], type: bigint | number, includeEscrowed: boolean]\n 'getTotals(uint64[])(uint64,uint64)[]': [assets: bigint[] | number[]]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type StakingReturns = {\n 'create(string,uint64)void': void\n 'init()void': void\n 'optIn(pay,uint64)void': void\n 'stake(pay,uint8,uint64,uint64)void': void\n 'stakeAsa(pay,axfer,uint8,uint64,uint64)void': void\n 'withdraw(uint64,uint8)void': void\n 'createHeartbeat(address,uint64)void': void\n 'softCheck(address,uint64)(bool,uint64)': StakeCheck\n 'updateSettings(pay,uint64,uint64)void': void\n 'optInCost()uint64': bigint\n 'stakeCost(uint64,uint8)uint64': bigint\n 'getTimeLeft(address,uint64)uint64': bigint\n 'mustGetTimeLeft(address,uint64)uint64': bigint\n 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)': Stake\n 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)': Stake\n 'getEscrowInfo(address,uint64)(uint64,uint64)': Escrow\n 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]\n 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]': [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]\n 'getHeartbeatAverage(address,uint64,bool)uint64': bigint\n 'mustGetHeartbeatAverage(address,uint64,bool)uint64': bigint\n 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [bigint, bigint, bigint][]\n 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]': [bigint, bigint, bigint][]\n 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool': boolean\n 'getTotals(uint64[])(uint64,uint64)[]': [bigint, bigint][]\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the Staking smart contract.\n */\nexport type StakingTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint64)void' | 'create', {\n argsObj: StakingArgs['obj']['create(string,uint64)void']\n argsTuple: StakingArgs['tuple']['create(string,uint64)void']\n returns: StakingReturns['create(string,uint64)void']\n }>\n & Record<'init()void' | 'init', {\n argsObj: StakingArgs['obj']['init()void']\n argsTuple: StakingArgs['tuple']['init()void']\n returns: StakingReturns['init()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: StakingArgs['obj']['optIn(pay,uint64)void']\n argsTuple: StakingArgs['tuple']['optIn(pay,uint64)void']\n returns: StakingReturns['optIn(pay,uint64)void']\n }>\n & Record<'stake(pay,uint8,uint64,uint64)void' | 'stake', {\n argsObj: StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void']\n argsTuple: StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']\n returns: StakingReturns['stake(pay,uint8,uint64,uint64)void']\n }>\n & Record<'stakeAsa(pay,axfer,uint8,uint64,uint64)void' | 'stakeAsa', {\n argsObj: StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']\n argsTuple: StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']\n returns: StakingReturns['stakeAsa(pay,axfer,uint8,uint64,uint64)void']\n }>\n & Record<'withdraw(uint64,uint8)void' | 'withdraw', {\n argsObj: StakingArgs['obj']['withdraw(uint64,uint8)void']\n argsTuple: StakingArgs['tuple']['withdraw(uint64,uint8)void']\n returns: StakingReturns['withdraw(uint64,uint8)void']\n }>\n & Record<'createHeartbeat(address,uint64)void' | 'createHeartbeat', {\n argsObj: StakingArgs['obj']['createHeartbeat(address,uint64)void']\n argsTuple: StakingArgs['tuple']['createHeartbeat(address,uint64)void']\n returns: StakingReturns['createHeartbeat(address,uint64)void']\n }>\n & Record<'softCheck(address,uint64)(bool,uint64)' | 'softCheck', {\n argsObj: StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)']\n argsTuple: StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']\n returns: StakingReturns['softCheck(address,uint64)(bool,uint64)']\n }>\n & Record<'updateSettings(pay,uint64,uint64)void' | 'updateSettings', {\n argsObj: StakingArgs['obj']['updateSettings(pay,uint64,uint64)void']\n argsTuple: StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']\n returns: StakingReturns['updateSettings(pay,uint64,uint64)void']\n }>\n & Record<'optInCost()uint64' | 'optInCost', {\n argsObj: StakingArgs['obj']['optInCost()uint64']\n argsTuple: StakingArgs['tuple']['optInCost()uint64']\n returns: StakingReturns['optInCost()uint64']\n }>\n & Record<'stakeCost(uint64,uint8)uint64' | 'stakeCost', {\n argsObj: StakingArgs['obj']['stakeCost(uint64,uint8)uint64']\n argsTuple: StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']\n returns: StakingReturns['stakeCost(uint64,uint8)uint64']\n }>\n & Record<'getTimeLeft(address,uint64)uint64' | 'getTimeLeft', {\n argsObj: StakingArgs['obj']['getTimeLeft(address,uint64)uint64']\n argsTuple: StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']\n returns: StakingReturns['getTimeLeft(address,uint64)uint64']\n }>\n & Record<'mustGetTimeLeft(address,uint64)uint64' | 'mustGetTimeLeft', {\n argsObj: StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64']\n argsTuple: StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']\n returns: StakingReturns['mustGetTimeLeft(address,uint64)uint64']\n }>\n & Record<'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)' | 'getInfo', {\n argsObj: StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n argsTuple: StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n returns: StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }>\n & Record<'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)' | 'mustGetInfo', {\n argsObj: StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n argsTuple: StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n returns: StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }>\n & Record<'getEscrowInfo(address,uint64)(uint64,uint64)' | 'getEscrowInfo', {\n argsObj: StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)']\n argsTuple: StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']\n returns: StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)']\n }>\n & Record<'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' | 'getHeartbeat', {\n argsObj: StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n argsTuple: StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n returns: StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }>\n & Record<'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' | 'mustGetHeartbeat', {\n argsObj: StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n argsTuple: StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n returns: StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }>\n & Record<'getHeartbeatAverage(address,uint64,bool)uint64' | 'getHeartbeatAverage', {\n argsObj: StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64']\n argsTuple: StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']\n returns: StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64']\n }>\n & Record<'mustGetHeartbeatAverage(address,uint64,bool)uint64' | 'mustGetHeartbeatAverage', {\n argsObj: StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n argsTuple: StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n returns: StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n }>\n & Record<'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' | 'getInfoList', {\n argsObj: StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n argsTuple: StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n returns: StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }>\n & Record<'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' | 'mustGetInfoList', {\n argsObj: StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n argsTuple: StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n returns: StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }>\n & Record<'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool' | 'stakeCheck', {\n argsObj: StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n argsTuple: StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n returns: StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n }>\n & Record<'getTotals(uint64[])(uint64,uint64)[]' | 'getTotals', {\n argsObj: StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]']\n argsTuple: StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']\n returns: StakingReturns['getTotals(uint64[])(uint64,uint64)[]']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: StakingArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: StakingArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: StakingReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: StakingArgs['obj']['opUp()void']\n argsTuple: StakingArgs['tuple']['opUp()void']\n returns: StakingReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * The address that is allowed to call the 'beat' method to create heartbeat records\n */\n heartbeatManagerAddress: string\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 maps: {\n stakes: Map<StakeKey, Stake>\n heartbeats: Map<HeartbeatKey, [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]>\n totals: Map<bigint | number, TotalsInfo>\n settings: Map<bigint | number, bigint>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type StakingSignatures = keyof StakingTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type StakingNonVoidMethodSignatures = keyof StakingTypes['methods'] extends infer T ? T extends keyof StakingTypes['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 Staking smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends StakingSignatures> = StakingTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Staking smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends StakingSignatures> = StakingTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = StakingTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = StakingTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type StakingCreateCallParams =\n | Expand<CallParams<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & {method: 'create(string,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type StakingDeployParams = 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?: StakingCreateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Staking smart contract\n */\nexport abstract class StakingParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends StakingCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint64)void':\n return StakingParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Staking smart contract using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.akitaDao],\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<StakingArgs['obj']['init()void'] | StakingArgs['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\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['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 stake(pay,uint8,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stake(params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stake(pay,uint8,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.type, params.args.amount, params.args.expiration],\n }\n }\n /**\n * Constructs a no op call for the stakeAsa(pay,axfer,uint8,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stakeAsa(params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stakeAsa(pay,axfer,uint8,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.type, params.args.amount, params.args.expiration],\n }\n }\n /**\n * Constructs a no op call for the withdraw(uint64,uint8)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static withdraw(params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'withdraw(uint64,uint8)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the createHeartbeat(address,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createHeartbeat(params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createHeartbeat(address,uint64)void' 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 softCheck(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 softCheck(params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'softCheck(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 updateSettings(pay,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateSettings(params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateSettings(pay,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset, params.args.value],\n }\n }\n /**\n * Constructs a no op call for the optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost()uint64' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the stakeCost(uint64,uint8)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stakeCost(params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stakeCost(uint64,uint8)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the getTimeLeft(address,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getTimeLeft(params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getTimeLeft(address,uint64)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 mustGetTimeLeft(address,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mustGetTimeLeft(params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetTimeLeft(address,uint64)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 getInfo(address,(uint64,uint8))(uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getInfo(params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getInfo(address,(uint64,uint8))(uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.stake],\n }\n }\n /**\n * Constructs a no op call for the mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mustGetInfo(params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.stake],\n }\n }\n /**\n * Constructs a no op call for the getEscrowInfo(address,uint64)(uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getEscrowInfo(params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getEscrowInfo(address,uint64)(uint64,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 getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getHeartbeat(params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' 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 mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mustGetHeartbeat(params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]' 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 getHeartbeatAverage(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 getHeartbeatAverage(params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getHeartbeatAverage(address,uint64,bool)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.asset, params.args.includeEscrowed],\n }\n }\n /**\n * Constructs a no op call for the mustGetHeartbeatAverage(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 mustGetHeartbeatAverage(params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetHeartbeatAverage(address,uint64,bool)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.asset, params.args.includeEscrowed],\n }\n }\n /**\n * Constructs a no op call for the getInfoList(address,uint8,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 getInfoList(params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.type, params.args.assets],\n }\n }\n /**\n * Constructs a no op call for the mustGetInfoList(address,uint8,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 mustGetInfoList(params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.type, params.args.assets],\n }\n }\n /**\n * Constructs a no op call for the stakeCheck(address,(uint64,uint64)[],uint8,bool)bool ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static stakeCheck(params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'stakeCheck(address,(uint64,uint64)[],uint8,bool)bool' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.checks, params.args.type, params.args.includeEscrowed],\n }\n }\n /**\n * Constructs a no op call for the getTotals(uint64[])(uint64,uint64)[] ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static getTotals(params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'getTotals(uint64[])(uint64,uint64)[]' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assets],\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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['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<StakingArgs['obj']['opUp()void'] | StakingArgs['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 Staking smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class StakingFactory {\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 `StakingFactory`\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 StakingClient(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 StakingClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Staking 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: StakingDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? StakingParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (StakingCreateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new StakingClient(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 Staking smart contract using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(StakingParamsFactory.create.create(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 Staking smart contract using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(StakingParamsFactory.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 Staking smart contract using an ABI method call using the create(string,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<StakingArgs['obj']['create(string,uint64)void'] | StakingArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(StakingParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | StakingReturns['create(string,uint64)void']) }, appClient: new StakingClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Staking smart contract\n */\nexport class StakingClient {\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 `StakingClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Staking app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `StakingClient`\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 StakingNonVoidMethodSignatures>(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 `StakingClient` 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<StakingClient> {\n return new StakingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `StakingClient` 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<StakingClient> {\n return new StakingClient(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 * Makes a clear_state call to an existing instance of the Staking 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 Staking 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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stake(pay,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n stake: (params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stake(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeAsa(pay,axfer,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n stakeAsa: (params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stakeAsa(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `withdraw(uint64,uint8)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n withdraw: (params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `createHeartbeat(address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createHeartbeat: (params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.createHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `softCheck(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n softCheck: (params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.softCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `updateSettings(pay,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateSettings: (params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.updateSettings(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost: (params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stakeCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call params\n */\n getTimeLeft: (params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call params\n */\n mustGetTimeLeft: (params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n getInfo: (params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n mustGetInfo: (params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n getEscrowInfo: (params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getEscrowInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat: (params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat: (params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage: (params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage: (params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n getInfoList: (params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n mustGetInfoList: (params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.mustGetInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n stakeCheck: (params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.stakeCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTotals(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\n */\n getTotals: (params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.getTotals(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(StakingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(StakingParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Makes a clear_state call to an existing instance of the Staking 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 Staking 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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.init(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stake(pay,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n stake: (params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stake(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeAsa(pay,axfer,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n stakeAsa: (params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stakeAsa(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `withdraw(uint64,uint8)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n withdraw: (params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `createHeartbeat(address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createHeartbeat: (params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.createHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `softCheck(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n softCheck: (params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.softCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `updateSettings(pay,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateSettings: (params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.updateSettings(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost: (params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stakeCost(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call transaction\n */\n getTimeLeft: (params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call transaction\n */\n mustGetTimeLeft: (params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetTimeLeft(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n getInfo: (params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n mustGetInfo: (params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n getEscrowInfo: (params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getEscrowInfo(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat: (params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat: (params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetHeartbeat(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage: (params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage: (params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n getInfoList: (params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n mustGetInfoList: (params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.mustGetInfoList(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n stakeCheck: (params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.stakeCheck(params))\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTotals(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\n */\n getTotals: (params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.getTotals(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(StakingParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Makes a clear_state call to an existing instance of the Staking 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 Staking 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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.init(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['init()void'])}\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stake(pay,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n stake: async (params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stake(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stake(pay,uint8,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeAsa(pay,axfer,uint8,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n stakeAsa: async (params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeAsa(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stakeAsa(pay,axfer,uint8,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `withdraw(uint64,uint8)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n withdraw: async (params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.withdraw(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['withdraw(uint64,uint8)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `createHeartbeat(address,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createHeartbeat: async (params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.createHeartbeat(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['createHeartbeat(address,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `softCheck(address,uint64)(bool,uint64)` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n softCheck: async (params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.softCheck(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['softCheck(address,uint64)(bool,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `updateSettings(pay,uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateSettings: async (params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.updateSettings(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['updateSettings(pay,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['optInCost()uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost: async (params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCost(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stakeCost(uint64,uint8)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n getTimeLeft: async (params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getTimeLeft(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getTimeLeft(address,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n mustGetTimeLeft: async (params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetTimeLeft(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetTimeLeft(address,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n getInfo: async (params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfo(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n mustGetInfo: async (params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfo(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n getEscrowInfo: async (params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getEscrowInfo(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat: async (params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeat(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat: async (params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeat(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage: async (params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeatAverage(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage: async (params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n getInfoList: async (params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfoList(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n mustGetInfoList: async (params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfoList(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n stakeCheck: async (params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCheck(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'])}\n },\n\n /**\n * Makes a call to the Staking smart contract using the `getTotals(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\n */\n getTotals: async (params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.getTotals(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['getTotals(uint64[])(uint64,uint64)[]'])}\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Staking 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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(StakingParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | StakingReturns['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 StakingClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> = {args: []}) {\n const result = await this.appClient.send.call(StakingParamsFactory.optInCost(params))\n return result.return as unknown as StakingReturns['optInCost()uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `stakeCost(uint64,uint8)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 stakeCost(params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCost(params))\n return result.return as unknown as StakingReturns['stakeCost(uint64,uint8)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n async getTimeLeft(params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getTimeLeft(params))\n return result.return as unknown as StakingReturns['getTimeLeft(address,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetTimeLeft(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 * @param params The params for the smart contract call\n * @returns The call result\n */\n async mustGetTimeLeft(params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetTimeLeft(params))\n return result.return as unknown as StakingReturns['mustGetTimeLeft(address,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getInfo(address,(uint64,uint8))(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\n */\n async getInfo(params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfo(params))\n return result.return as unknown as StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetInfo(address,(uint64,uint8))(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\n */\n async mustGetInfo(params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfo(params))\n return result.return as unknown as StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getEscrowInfo(address,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\n */\n async getEscrowInfo(params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getEscrowInfo(params))\n return result.return as unknown as StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 getHeartbeat(params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeat(params))\n return result.return as unknown as StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]` 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 mustGetHeartbeat(params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeat(params))\n return result.return as unknown as StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getHeartbeatAverage(address,uint64,bool)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 getHeartbeatAverage(params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getHeartbeatAverage(params))\n return result.return as unknown as StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetHeartbeatAverage(address,uint64,bool)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 mustGetHeartbeatAverage(params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetHeartbeatAverage(params))\n return result.return as unknown as StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getInfoList(address,uint8,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\n */\n async getInfoList(params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getInfoList(params))\n return result.return as unknown as StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `mustGetInfoList(address,uint8,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\n */\n async mustGetInfoList(params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.mustGetInfoList(params))\n return result.return as unknown as StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `stakeCheck(address,(uint64,uint64)[],uint8,bool)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\n */\n async stakeCheck(params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.stakeCheck(params))\n return result.return as unknown as StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']\n }\n\n /**\n * Makes a readonly (simulated) call to the Staking smart contract using the `getTotals(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\n */\n async getTotals(params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']>) {\n const result = await this.appClient.send.call(StakingParamsFactory.getTotals(params))\n return result.return as unknown as StakingReturns['getTotals(uint64[])(uint64,uint64)[]']\n }\n\n /**\n * Methods to access state for the current Staking app\n */\n state = {\n /**\n * Methods to access global state for the current Staking 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 heartbeatManagerAddress: result.heartbeatManagerAddress,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the heartbeatManagerAddress key in global state\n */\n heartbeatManagerAddress: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"heartbeatManagerAddress\")) as string | 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 Staking 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 stakes map in box state\n */\n stakes: {\n /**\n * Get all current values of the stakes map in box state\n */\n getMap: async (): Promise<Map<StakeKey, Stake>> => { return (await this.appClient.state.box.getMap(\"stakes\")) as Map<StakeKey, Stake> },\n /**\n * Get a current value of the stakes map by key from box state\n */\n value: async (key: StakeKey): Promise<Stake | undefined> => { return await this.appClient.state.box.getMapValue(\"stakes\", key) as Stake | undefined },\n },\n /**\n * Get values from the heartbeats map in box state\n */\n heartbeats: {\n /**\n * Get all current values of the heartbeats map in box state\n */\n getMap: async (): Promise<Map<HeartbeatKey, [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]>> => { return (await this.appClient.state.box.getMap(\"heartbeats\")) as Map<HeartbeatKey, [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]]> },\n /**\n * Get a current value of the heartbeats map by key from box state\n */\n value: async (key: HeartbeatKey): Promise<[[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]] | undefined> => { return await this.appClient.state.box.getMapValue(\"heartbeats\", key) as [[bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint], [bigint, bigint, bigint, bigint]] | undefined },\n },\n /**\n * Get values from the totals map in box state\n */\n totals: {\n /**\n * Get all current values of the totals map in box state\n */\n getMap: async (): Promise<Map<bigint, TotalsInfo>> => { return (await this.appClient.state.box.getMap(\"totals\")) as Map<bigint, TotalsInfo> },\n /**\n * Get a current value of the totals map by key from box state\n */\n value: async (key: bigint | number): Promise<TotalsInfo | undefined> => { return await this.appClient.state.box.getMapValue(\"totals\", key) as TotalsInfo | undefined },\n },\n /**\n * Get values from the settings map in box state\n */\n settings: {\n /**\n * Get all current values of the settings map in box state\n */\n getMap: async (): Promise<Map<bigint, bigint>> => { return (await this.appClient.state.box.getMap(\"settings\")) as Map<bigint, bigint> },\n /**\n * Get a current value of the settings map by key from box state\n */\n value: async (key: bigint | number): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"settings\", key) as bigint | undefined },\n },\n },\n }\n\n public newGroup(): StakingComposer {\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 Staking contract\n */\n init(params: CallParams<StakingArgs['obj']['init()void'] | StakingArgs['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 Staking contract\n */\n optIn(params: CallParams<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['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 stake(pay,uint8,uint64,uint64)void method call against the Staking contract\n */\n stake(params: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stake(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a stakeAsa(pay,axfer,uint8,uint64,uint64)void method call against the Staking contract\n */\n stakeAsa(params: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a withdraw(uint64,uint8)void method call against the Staking contract\n */\n withdraw(params: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdraw(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a createHeartbeat(address,uint64)void method call against the Staking contract\n */\n createHeartbeat(params: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createHeartbeat(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a softCheck(address,uint64)(bool,uint64) method call against the Staking contract\n */\n softCheck(params: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.softCheck(params)))\n resultMappers.push((v) => client.decodeReturnValue('softCheck(address,uint64)(bool,uint64)', v))\n return this\n },\n /**\n * Add a updateSettings(pay,uint64,uint64)void method call against the Staking contract\n */\n updateSettings(params: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateSettings(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optInCost()uint64 method call against the Staking contract\n */\n optInCost(params: CallParams<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost()uint64', v))\n return this\n },\n /**\n * Add a stakeCost(uint64,uint8)uint64 method call against the Staking contract\n */\n stakeCost(params: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('stakeCost(uint64,uint8)uint64', v))\n return this\n },\n /**\n * Add a getTimeLeft(address,uint64)uint64 method call against the Staking contract\n */\n getTimeLeft(params: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTimeLeft(params)))\n resultMappers.push((v) => client.decodeReturnValue('getTimeLeft(address,uint64)uint64', v))\n return this\n },\n /**\n * Add a mustGetTimeLeft(address,uint64)uint64 method call against the Staking contract\n */\n mustGetTimeLeft(params: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetTimeLeft(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetTimeLeft(address,uint64)uint64', v))\n return this\n },\n /**\n * Add a getInfo(address,(uint64,uint8))(uint64,uint64,uint64) method call against the Staking contract\n */\n getInfo(params: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getInfo(params)))\n resultMappers.push((v) => client.decodeReturnValue('getInfo(address,(uint64,uint8))(uint64,uint64,uint64)', v))\n return this\n },\n /**\n * Add a mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64) method call against the Staking contract\n */\n mustGetInfo(params: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetInfo(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)', v))\n return this\n },\n /**\n * Add a getEscrowInfo(address,uint64)(uint64,uint64) method call against the Staking contract\n */\n getEscrowInfo(params: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getEscrowInfo(params)))\n resultMappers.push((v) => client.decodeReturnValue('getEscrowInfo(address,uint64)(uint64,uint64)', v))\n return this\n },\n /**\n * Add a getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] method call against the Staking contract\n */\n getHeartbeat(params: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getHeartbeat(params)))\n resultMappers.push((v) => client.decodeReturnValue('getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]', v))\n return this\n },\n /**\n * Add a mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] method call against the Staking contract\n */\n mustGetHeartbeat(params: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetHeartbeat(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]', v))\n return this\n },\n /**\n * Add a getHeartbeatAverage(address,uint64,bool)uint64 method call against the Staking contract\n */\n getHeartbeatAverage(params: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getHeartbeatAverage(params)))\n resultMappers.push((v) => client.decodeReturnValue('getHeartbeatAverage(address,uint64,bool)uint64', v))\n return this\n },\n /**\n * Add a mustGetHeartbeatAverage(address,uint64,bool)uint64 method call against the Staking contract\n */\n mustGetHeartbeatAverage(params: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetHeartbeatAverage(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetHeartbeatAverage(address,uint64,bool)uint64', v))\n return this\n },\n /**\n * Add a getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[] method call against the Staking contract\n */\n getInfoList(params: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getInfoList(params)))\n resultMappers.push((v) => client.decodeReturnValue('getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]', v))\n return this\n },\n /**\n * Add a mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[] method call against the Staking contract\n */\n mustGetInfoList(params: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mustGetInfoList(params)))\n resultMappers.push((v) => client.decodeReturnValue('mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]', v))\n return this\n },\n /**\n * Add a stakeCheck(address,(uint64,uint64)[],uint8,bool)bool method call against the Staking contract\n */\n stakeCheck(params: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeCheck(params)))\n resultMappers.push((v) => client.decodeReturnValue('stakeCheck(address,(uint64,uint64)[],uint8,bool)bool', v))\n return this\n },\n /**\n * Add a getTotals(uint64[])(uint64,uint64)[] method call against the Staking contract\n */\n getTotals(params: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTotals(params)))\n resultMappers.push((v) => client.decodeReturnValue('getTotals(uint64[])(uint64,uint64)[]', v))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Staking contract\n */\n updateAkitaDao(params: CallParams<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['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 Staking contract\n */\n opUp(params: CallParams<StakingArgs['obj']['opUp()void'] | StakingArgs['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 clear state call to the Staking 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 StakingComposer\n }\n}\nexport type StakingComposer<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<StakingArgs['obj']['init()void'] | StakingArgs['tuple']['init()void']>): StakingComposer<[...TReturns, StakingReturns['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\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<StakingArgs['obj']['optIn(pay,uint64)void'] | StakingArgs['tuple']['optIn(pay,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the stake(pay,uint8,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 stake(params?: CallParams<StakingArgs['obj']['stake(pay,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stake(pay,uint8,uint64,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['stake(pay,uint8,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the stakeAsa(pay,axfer,uint8,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 stakeAsa(params?: CallParams<StakingArgs['obj']['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | StakingArgs['tuple']['stakeAsa(pay,axfer,uint8,uint64,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['stakeAsa(pay,axfer,uint8,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the withdraw(uint64,uint8)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 withdraw(params?: CallParams<StakingArgs['obj']['withdraw(uint64,uint8)void'] | StakingArgs['tuple']['withdraw(uint64,uint8)void']>): StakingComposer<[...TReturns, StakingReturns['withdraw(uint64,uint8)void'] | undefined]>\n\n /**\n * Calls the createHeartbeat(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 createHeartbeat(params?: CallParams<StakingArgs['obj']['createHeartbeat(address,uint64)void'] | StakingArgs['tuple']['createHeartbeat(address,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['createHeartbeat(address,uint64)void'] | undefined]>\n\n /**\n * Calls the softCheck(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 softCheck(params?: CallParams<StakingArgs['obj']['softCheck(address,uint64)(bool,uint64)'] | StakingArgs['tuple']['softCheck(address,uint64)(bool,uint64)']>): StakingComposer<[...TReturns, StakingReturns['softCheck(address,uint64)(bool,uint64)'] | undefined]>\n\n /**\n * Calls the updateSettings(pay,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 updateSettings(params?: CallParams<StakingArgs['obj']['updateSettings(pay,uint64,uint64)void'] | StakingArgs['tuple']['updateSettings(pay,uint64,uint64)void']>): StakingComposer<[...TReturns, StakingReturns['updateSettings(pay,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost()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<StakingArgs['obj']['optInCost()uint64'] | StakingArgs['tuple']['optInCost()uint64']>): StakingComposer<[...TReturns, StakingReturns['optInCost()uint64'] | undefined]>\n\n /**\n * Calls the stakeCost(uint64,uint8)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 stakeCost(params?: CallParams<StakingArgs['obj']['stakeCost(uint64,uint8)uint64'] | StakingArgs['tuple']['stakeCost(uint64,uint8)uint64']>): StakingComposer<[...TReturns, StakingReturns['stakeCost(uint64,uint8)uint64'] | undefined]>\n\n /**\n * Calls the getTimeLeft(address,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 getTimeLeft(params?: CallParams<StakingArgs['obj']['getTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['getTimeLeft(address,uint64)uint64']>): StakingComposer<[...TReturns, StakingReturns['getTimeLeft(address,uint64)uint64'] | undefined]>\n\n /**\n * Calls the mustGetTimeLeft(address,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 mustGetTimeLeft(params?: CallParams<StakingArgs['obj']['mustGetTimeLeft(address,uint64)uint64'] | StakingArgs['tuple']['mustGetTimeLeft(address,uint64)uint64']>): StakingComposer<[...TReturns, StakingReturns['mustGetTimeLeft(address,uint64)uint64'] | undefined]>\n\n /**\n * Calls the getInfo(address,(uint64,uint8))(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 getInfo(params?: CallParams<StakingArgs['obj']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>): StakingComposer<[...TReturns, StakingReturns['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Calls the mustGetInfo(address,(uint64,uint8))(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 mustGetInfo(params?: CallParams<StakingArgs['obj']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | StakingArgs['tuple']['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)']>): StakingComposer<[...TReturns, StakingReturns['mustGetInfo(address,(uint64,uint8))(uint64,uint64,uint64)'] | undefined]>\n\n /**\n * Calls the getEscrowInfo(address,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 getEscrowInfo(params?: CallParams<StakingArgs['obj']['getEscrowInfo(address,uint64)(uint64,uint64)'] | StakingArgs['tuple']['getEscrowInfo(address,uint64)(uint64,uint64)']>): StakingComposer<[...TReturns, StakingReturns['getEscrowInfo(address,uint64)(uint64,uint64)'] | undefined]>\n\n /**\n * Calls the getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] 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 getHeartbeat(params?: CallParams<StakingArgs['obj']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>): StakingComposer<[...TReturns, StakingReturns['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | undefined]>\n\n /**\n * Calls the mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4] 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 mustGetHeartbeat(params?: CallParams<StakingArgs['obj']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | StakingArgs['tuple']['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]']>): StakingComposer<[...TReturns, StakingReturns['mustGetHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'] | undefined]>\n\n /**\n * Calls the getHeartbeatAverage(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 getHeartbeatAverage(params?: CallParams<StakingArgs['obj']['getHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['getHeartbeatAverage(address,uint64,bool)uint64']>): StakingComposer<[...TReturns, StakingReturns['getHeartbeatAverage(address,uint64,bool)uint64'] | undefined]>\n\n /**\n * Calls the mustGetHeartbeatAverage(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 mustGetHeartbeatAverage(params?: CallParams<StakingArgs['obj']['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | StakingArgs['tuple']['mustGetHeartbeatAverage(address,uint64,bool)uint64']>): StakingComposer<[...TReturns, StakingReturns['mustGetHeartbeatAverage(address,uint64,bool)uint64'] | undefined]>\n\n /**\n * Calls the getInfoList(address,uint8,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 getInfoList(params?: CallParams<StakingArgs['obj']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>): StakingComposer<[...TReturns, StakingReturns['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | undefined]>\n\n /**\n * Calls the mustGetInfoList(address,uint8,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 mustGetInfoList(params?: CallParams<StakingArgs['obj']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | StakingArgs['tuple']['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]']>): StakingComposer<[...TReturns, StakingReturns['mustGetInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'] | undefined]>\n\n /**\n * Calls the stakeCheck(address,(uint64,uint64)[],uint8,bool)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 stakeCheck(params?: CallParams<StakingArgs['obj']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | StakingArgs['tuple']['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool']>): StakingComposer<[...TReturns, StakingReturns['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'] | undefined]>\n\n /**\n * Calls the getTotals(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 getTotals(params?: CallParams<StakingArgs['obj']['getTotals(uint64[])(uint64,uint64)[]'] | StakingArgs['tuple']['getTotals(uint64[])(uint64,uint64)[]']>): StakingComposer<[...TReturns, StakingReturns['getTotals(uint64[])(uint64,uint64)[]'] | 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<StakingArgs['obj']['updateAkitaDAO(uint64)void'] | StakingArgs['tuple']['updateAkitaDAO(uint64)void']>): StakingComposer<[...TReturns, StakingReturns['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<StakingArgs['obj']['opUp()void'] | StakingArgs['tuple']['opUp()void']>): StakingComposer<[...TReturns, StakingReturns['opUp()void'] | undefined]>\n\n /**\n * Makes a clear_state call to an existing instance of the Staking 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): StakingComposer<[...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): StakingComposer<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<StakingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<StakingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<StakingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<StakingComposerResults<TReturns>>\n}\nexport type StakingComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { MaybeSigner } from \"../types\";\nimport {\n StakingArgs,\n Stake,\n Escrow,\n StakeInfo,\n StakeKey\n} from '../generated/StakingClient';\n\n// Re-export types from generated client\nexport { Stake, Escrow, StakeInfo, StakeKey };\n\ntype ContractArgs = StakingArgs[\"obj\"];\n\n/** Staking type enum matching contract values */\nexport enum StakingType {\n Heartbeat = 10,\n Soft = 20,\n Hard = 30,\n Lock = 40,\n}\n\nexport type OptInArgs = MaybeSigner & ContractArgs['optIn(pay,uint64)void'];\n\n/** Stake parameters for ALGO staking */\nexport type StakeArgs = MaybeSigner & Omit<ContractArgs['stake(pay,uint8,uint64,uint64)void'], 'payment' | 'amount' | 'expiration'> & {\n /** The asset ID to stake */\n asset: bigint;\n amount: bigint;\n} & (\n | { type: StakingType.Hard | StakingType.Lock, expiration: bigint }\n | { type: StakingType.Soft | StakingType.Heartbeat }\n);\n\n/** Withdraw parameters */\nexport type WithdrawArgs = MaybeSigner & ContractArgs['withdraw(uint64,uint8)void'];\n\n/** Create heartbeat parameters */\nexport type CreateHeartbeatArgs = MaybeSigner & ContractArgs['createHeartbeat(address,uint64)void'];\n\n/** Update settings parameters */\nexport type UpdateSettingsArgs = MaybeSigner & Omit<ContractArgs['updateSettings(pay,uint64,uint64)void'], 'payment'>;\n\n/** Soft check parameters */\nexport type SoftCheckArgs = ContractArgs['softCheck(address,uint64)(bool,uint64)'];\n\n/** Get time left parameters */\nexport type GetTimeLeftArgs = ContractArgs['getTimeLeft(address,uint64)uint64'];\n\n/** Get info parameters */\nexport type GetInfoArgs = ContractArgs['getInfo(address,(uint64,uint8))(uint64,uint64,uint64)'];\n\n/** Get escrow info parameters */\nexport type GetEscrowInfoArgs = ContractArgs['getEscrowInfo(address,uint64)(uint64,uint64)'];\n\n/** Get heartbeat parameters */\nexport type GetHeartbeatArgs = ContractArgs['getHeartbeat(address,uint64)(uint64,uint64,uint64,uint64)[4]'];\n\n/** Get heartbeat average parameters */\nexport type GetHeartbeatAverageArgs = ContractArgs['getHeartbeatAverage(address,uint64,bool)uint64'];\n\n/** Get info list parameters */\nexport type GetInfoListArgs = ContractArgs['getInfoList(address,uint8,uint64[])(uint64,uint64,uint64)[]'];\n\n/** Stake check parameters */\nexport type StakeCheckArgs = ContractArgs['stakeCheck(address,(uint64,uint64)[],uint8,bool)bool'];\n\n/** Heartbeat entry - tuple of [timestamp, balance, escrowed, average] */\nexport type HeartbeatEntry = {\n timestamp: bigint;\n balance: bigint;\n escrowed: bigint;\n average: bigint;\n};\n\nexport type AssetCheck = {\n asset: bigint;\n amount: bigint;\n}\n"]}