@akta/sdk 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auction/index.js +5 -5
- package/dist/auction/index.mjs +4 -4
- package/dist/{chunk-C3Q3DYPD.mjs → chunk-2AR3LS5J.mjs} +3 -3
- package/dist/{chunk-C3Q3DYPD.mjs.map → chunk-2AR3LS5J.mjs.map} +1 -1
- package/dist/{chunk-IZTB6YOJ.js → chunk-2WOYNNPV.js} +8 -8
- package/dist/{chunk-IZTB6YOJ.js.map → chunk-2WOYNNPV.js.map} +1 -1
- package/dist/{chunk-WPATZWNC.mjs → chunk-4ANINCSI.mjs} +3 -3
- package/dist/{chunk-BP23PXOA.js → chunk-5M6DY6Q7.js} +7 -7
- package/dist/{chunk-BP23PXOA.js.map → chunk-5M6DY6Q7.js.map} +1 -1
- package/dist/{chunk-N4PQF2XF.mjs → chunk-6MGMITC7.mjs} +3 -3
- package/dist/{chunk-IOSDIJTT.mjs → chunk-6PHYDWAI.mjs} +3 -3
- package/dist/{chunk-I2AH4XA6.js → chunk-76JFN4TN.js} +6 -6
- package/dist/{chunk-I2AH4XA6.js.map → chunk-76JFN4TN.js.map} +1 -1
- package/dist/{chunk-VARI5DBW.js → chunk-B3ANVNAW.js} +31 -31
- package/dist/{chunk-VARI5DBW.js.map → chunk-B3ANVNAW.js.map} +1 -1
- package/dist/{chunk-APOVSDCN.mjs → chunk-CPU7YHCB.mjs} +2 -2
- package/dist/{chunk-BTVZKNNI.js → chunk-FQEKBA3B.js} +5 -5
- package/dist/{chunk-BTVZKNNI.js.map → chunk-FQEKBA3B.js.map} +1 -1
- package/dist/{chunk-ZABE6CV7.mjs → chunk-FZXOT7SC.mjs} +3 -3
- package/dist/{chunk-TGH7PFXC.mjs → chunk-GRR6MUNV.mjs} +3 -3
- package/dist/{chunk-M5QOSPKZ.js → chunk-GVPFBZMF.js} +5 -5
- package/dist/{chunk-M5QOSPKZ.js.map → chunk-GVPFBZMF.js.map} +1 -1
- package/dist/{chunk-MATDF7EM.mjs → chunk-H76YCOUY.mjs} +4 -4
- package/dist/{chunk-LW57YWGF.js → chunk-HHXP4XDJ.js} +5 -5
- package/dist/{chunk-LW57YWGF.js.map → chunk-HHXP4XDJ.js.map} +1 -1
- package/dist/{chunk-5CPWIJNS.js → chunk-HIDVSX3C.js} +7 -7
- package/dist/{chunk-5CPWIJNS.js.map → chunk-HIDVSX3C.js.map} +1 -1
- package/dist/{chunk-7C2J3XNH.js → chunk-HT2LVEDG.js} +5 -5
- package/dist/{chunk-7C2J3XNH.js.map → chunk-HT2LVEDG.js.map} +1 -1
- package/dist/{chunk-VNBPUJXA.mjs → chunk-IERRX2GS.mjs} +3 -3
- package/dist/{chunk-QZWXM2GR.mjs → chunk-IWPVSICN.mjs} +3 -3
- package/dist/{chunk-LAANYMUP.mjs → chunk-JMZYQMSW.mjs} +3 -3
- package/dist/{chunk-HXF3JLNE.js → chunk-JPV3DVL6.js} +10 -10
- package/dist/{chunk-HXF3JLNE.js.map → chunk-JPV3DVL6.js.map} +1 -1
- package/dist/{chunk-5F5IFJ2J.mjs → chunk-KPXE4SEJ.mjs} +2 -2
- package/dist/{chunk-FVFLY5A6.js → chunk-LYG4MDFV.js} +6 -6
- package/dist/{chunk-FVFLY5A6.js.map → chunk-LYG4MDFV.js.map} +1 -1
- package/dist/{chunk-XASWHIKG.js → chunk-MDSBD67B.js} +6 -6
- package/dist/{chunk-XASWHIKG.js.map → chunk-MDSBD67B.js.map} +1 -1
- package/dist/{chunk-WEGE45N2.mjs → chunk-MOHS2K45.mjs} +3 -3
- package/dist/{chunk-CC6LCTVW.mjs → chunk-NANBUL67.mjs} +2 -2
- package/dist/{chunk-C7GS6GJZ.mjs → chunk-OYSHMZRR.mjs} +4 -4
- package/dist/{chunk-ZHFTRBE6.mjs → chunk-SGXO2K4C.mjs} +3 -3
- package/dist/{chunk-RZUZCM44.js → chunk-SQH64QTI.js} +4 -4
- package/dist/{chunk-RZUZCM44.js.map → chunk-SQH64QTI.js.map} +1 -1
- package/dist/{chunk-4M6IGGNM.js → chunk-UWAIIBII.js} +3 -3
- package/dist/{chunk-4M6IGGNM.js.map → chunk-UWAIIBII.js.map} +1 -1
- package/dist/{chunk-MGXVNKUX.js → chunk-V2TNS6B5.js} +8 -8
- package/dist/{chunk-MGXVNKUX.js.map → chunk-V2TNS6B5.js.map} +1 -1
- package/dist/{chunk-S7HZC5RM.js → chunk-VL2UI54Z.js} +5 -5
- package/dist/{chunk-S7HZC5RM.js.map → chunk-VL2UI54Z.js.map} +1 -1
- package/dist/{chunk-SXS2YREI.mjs → chunk-VVRQI5IY.mjs} +4 -4
- package/dist/{chunk-B54US4TN.mjs → chunk-XNWIPDFE.mjs} +4 -4
- package/dist/{chunk-ZW5I4BM7.js → chunk-YHMGRIY5.js} +8 -8
- package/dist/{chunk-ZW5I4BM7.js.map → chunk-YHMGRIY5.js.map} +1 -1
- package/dist/{chunk-KMVWSUUI.js → chunk-ZBVJPS4Y.js} +10 -10
- package/dist/{chunk-KMVWSUUI.js.map → chunk-ZBVJPS4Y.js.map} +1 -1
- package/dist/dao/index.js +5 -5
- package/dist/dao/index.mjs +4 -4
- package/dist/dao-deployable/index.js +7 -7
- package/dist/dao-deployable/index.mjs +4 -4
- package/dist/escrow/index.js +4 -4
- package/dist/escrow/index.mjs +3 -3
- package/dist/gates/index.js +4 -4
- package/dist/gates/index.mjs +3 -3
- package/dist/hyper-swap/index.js +4 -4
- package/dist/hyper-swap/index.mjs +3 -3
- package/dist/index.js +19 -19
- package/dist/index.mjs +18 -18
- package/dist/marketplace/index.js +5 -5
- package/dist/marketplace/index.mjs +4 -4
- package/dist/meta-merkles/index.js +4 -4
- package/dist/meta-merkles/index.mjs +3 -3
- package/dist/poll/index.js +4 -4
- package/dist/poll/index.mjs +3 -3
- package/dist/prize-box/index.js +4 -4
- package/dist/prize-box/index.mjs +3 -3
- package/dist/raffle/index.js +5 -5
- package/dist/raffle/index.mjs +4 -4
- package/dist/rewards/index.js +4 -4
- package/dist/rewards/index.mjs +3 -3
- package/dist/social/index.js +3 -3
- package/dist/social/index.mjs +2 -2
- package/dist/staking/index.js +4 -4
- package/dist/staking/index.mjs +3 -3
- package/dist/staking-pool/index.js +4 -4
- package/dist/staking-pool/index.mjs +3 -3
- package/dist/subscriptions/index.js +4 -4
- package/dist/subscriptions/index.mjs +3 -3
- package/dist/wallet/index.js +4 -4
- package/dist/wallet/index.mjs +3 -3
- package/package.json +1 -1
- /package/dist/{chunk-WPATZWNC.mjs.map → chunk-4ANINCSI.mjs.map} +0 -0
- /package/dist/{chunk-N4PQF2XF.mjs.map → chunk-6MGMITC7.mjs.map} +0 -0
- /package/dist/{chunk-IOSDIJTT.mjs.map → chunk-6PHYDWAI.mjs.map} +0 -0
- /package/dist/{chunk-APOVSDCN.mjs.map → chunk-CPU7YHCB.mjs.map} +0 -0
- /package/dist/{chunk-ZABE6CV7.mjs.map → chunk-FZXOT7SC.mjs.map} +0 -0
- /package/dist/{chunk-TGH7PFXC.mjs.map → chunk-GRR6MUNV.mjs.map} +0 -0
- /package/dist/{chunk-MATDF7EM.mjs.map → chunk-H76YCOUY.mjs.map} +0 -0
- /package/dist/{chunk-VNBPUJXA.mjs.map → chunk-IERRX2GS.mjs.map} +0 -0
- /package/dist/{chunk-QZWXM2GR.mjs.map → chunk-IWPVSICN.mjs.map} +0 -0
- /package/dist/{chunk-LAANYMUP.mjs.map → chunk-JMZYQMSW.mjs.map} +0 -0
- /package/dist/{chunk-5F5IFJ2J.mjs.map → chunk-KPXE4SEJ.mjs.map} +0 -0
- /package/dist/{chunk-WEGE45N2.mjs.map → chunk-MOHS2K45.mjs.map} +0 -0
- /package/dist/{chunk-CC6LCTVW.mjs.map → chunk-NANBUL67.mjs.map} +0 -0
- /package/dist/{chunk-C7GS6GJZ.mjs.map → chunk-OYSHMZRR.mjs.map} +0 -0
- /package/dist/{chunk-ZHFTRBE6.mjs.map → chunk-SGXO2K4C.mjs.map} +0 -0
- /package/dist/{chunk-SXS2YREI.mjs.map → chunk-VVRQI5IY.mjs.map} +0 -0
- /package/dist/{chunk-B54US4TN.mjs.map → chunk-XNWIPDFE.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-IZTB6YOJ.js","../src/marketplace/index.ts","../src/generated/MarketplaceClient.ts","../src/generated/ListingClient.ts","../src/marketplace/listing.ts"],"names":["APP_SPEC","_AppFactory","_AppClient"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-IZTB6YOJ.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport algosdk from \"algosdk\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n MarketplaceClient,\n MarketplaceFactory,\n MarketplaceArgs,\n} from '../generated/MarketplaceClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport { ListingSDK } from \"./listing\";\nimport {\n ListParams,\n PurchaseParams,\n DelistParams,\n} from \"./types\";\nimport { PrizeBoxFactorySDK } from \"../prize-box\";\n\nexport * from \"./listing\";\nexport * from \"./types\";\n\nexport type MarketplaceContractArgs = MarketplaceArgs[\"obj\"];\n\n/**\n * SDK for interacting with the Marketplace contract.\n * Use this to create listings, purchase items, and delist items.\n */\nexport class MarketplaceSDK extends BaseSDK<MarketplaceClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: MarketplaceFactory, ...params }, ENV_VAR_NAMES.MARKETPLACE_APP_ID);\n }\n\n // ========== Factory/Listing Methods ==========\n\n /**\n * Creates a new listing and returns a ListingSDK instance.\n * Can list either an ASA or a PrizeBox based on the `isPrizeBox` flag.\n * @returns ListingSDK for the newly created listing\n */\n async list({\n sender,\n signer,\n isPrizeBox = false,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n ...rest\n }: ListParams): Promise<ListingSDK> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get the cost for creating a new listing, dynamically querying rewards opt-in state\n const isAlgoPayment = BigInt(paymentAsset) === 0n;\n const prizeId = isPrizeBox ? 0n : BigInt((rest as { asset: bigint | number }).asset);\n const [prizeRewardsOptInCost, paymentRewardsOptInCost] = await Promise.all([\n this.getRewardsOptInCost(prizeId),\n this.getRewardsOptInCost(BigInt(paymentAsset)),\n ]);\n const cost = this.listCost({ isPrizeBox, isAlgoPayment, prizeRewardsOptInCost, paymentRewardsOptInCost });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n let appId: bigint | undefined;\n\n if (isPrizeBox) {\n const { prizeBoxId } = rest as Extract<ListParams, { isPrizeBox: true }>;\n\n const prizeBoxSDK = new PrizeBoxFactorySDK({ algorand: this.algorand, factoryParams: {}}).get({ appId: BigInt(prizeBoxId) })\n const prizeBoxTransferTxn = (await prizeBoxSDK.client.createTransaction.transfer({\n sender,\n signer,\n args: {\n newOwner: this.client.appAddress.toString()\n }\n })).transactions[0];\n\n ({ return: appId } = await this.client.send.listPrizeBox({\n ...sendParams,\n args: {\n prizeBoxTransferTxn,\n payment,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n },\n }));\n } else {\n const { asset, amount, name, proof } = rest as Exclude<ListParams, { isPrizeBox: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n ({ return: appId } = await this.client.send.list({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n name,\n proof,\n },\n }));\n }\n\n if (appId === undefined) {\n throw new Error('Failed to create new listing');\n }\n\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: sendParams.sender,\n defaultSigner: sendParams.signer,\n },\n });\n }\n\n /**\n * Gets a ListingSDK instance for an existing listing.\n * @param appId - The app ID of the listing\n * @returns ListingSDK for the specified listing\n */\n getListing({ appId }: { appId: bigint }): ListingSDK {\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: this.sendParams.sender,\n defaultSigner: this.sendParams.signer,\n },\n });\n }\n\n /**\n * Checks if the rewards app is already opted into the given asset.\n * Returns 0n if opted in (no cost needed), 100_000n if not.\n */\n private async getRewardsOptInCost(assetId: bigint | number): Promise<bigint> {\n const asset = BigInt(assetId);\n if (asset === 0n) return 0n;\n\n try {\n const akitaDaoAppId = await this.client.state.global.akitaDao();\n if (!akitaDaoAppId) return 100_000n;\n\n const algod = this.algorand.client.algod;\n const daoApp = await algod.getApplicationByID(akitaDaoAppId).do();\n const globalState = daoApp.params.globalState;\n if (!globalState) return 100_000n;\n\n // Find the 'aal' (akitaAppList) key in AkitaDAO global state\n const aalKey = new TextEncoder().encode('aal');\n const aalEntry = globalState.find(\n (kv) => kv.key.length === aalKey.length && kv.key.every((b, i) => b === aalKey[i])\n );\n if (!aalEntry || aalEntry.value.type !== 1) return 100_000n;\n\n // Extract rewards app ID (2nd uint64 in ABI-encoded AkitaAppList, bytes 8-15)\n const aalBytes = aalEntry.value.bytes;\n if (aalBytes.length < 16) return 100_000n;\n const view = new DataView(aalBytes.buffer, aalBytes.byteOffset, aalBytes.byteLength);\n const rewardsAppId = view.getBigUint64(8);\n if (rewardsAppId === 0n) return 100_000n;\n\n // Check if rewards app address is already opted into the asset\n const rewardsAddress = algosdk.getApplicationAddress(rewardsAppId).toString();\n const response = await algod.accountAssetInformation(rewardsAddress, asset).do();\n return response.assetHolding ? 0n : 100_000n;\n } catch {\n // If any lookup fails (e.g. 404 not opted in), assume cost is needed\n return 100_000n;\n }\n }\n\n /**\n * Gets the cost to create a new listing.\n * @param isPrizeBox - Whether the prize is a PrizeBox\n * @param isAlgoPayment - Whether the listing will accept ALGO as payment\n * @param prizeRewardsOptInCost - Rewards app opt-in cost for the prize asset (default: 100,000, pass 0 if already opted in)\n * @param paymentRewardsOptInCost - Rewards app opt-in cost for the payment asset (default: 100,000, pass 0 if already opted in)\n */\n listCost({ isPrizeBox = false, isAlgoPayment = true, prizeRewardsOptInCost = 100_000n, paymentRewardsOptInCost = 100_000n, escrowOptInCost = 0n }: { isPrizeBox?: boolean, isAlgoPayment?: boolean, prizeRewardsOptInCost?: bigint, paymentRewardsOptInCost?: bigint, escrowOptInCost?: bigint } = {}): bigint {\n // Base cost: MIN_PROGRAM_PAGES + (GLOBAL_STATE_KEY_UINT_COST * globalUints) + (GLOBAL_STATE_KEY_BYTES_COST * globalBytes)\n const baseCost = 635_000n;\n const minBalance = 100_000n;\n const assetOptInMinBalance = 100_000n;\n const perDisbursement = 60_600n; // MinDisbursementsMBR + UserAllocationMBR\n\n // Asset opt-in MBR for the child contract\n const optinMbr = isPrizeBox\n ? (isAlgoPayment ? 0n : assetOptInMinBalance)\n : (isAlgoPayment ? assetOptInMinBalance : assetOptInMinBalance * 2n);\n\n // Disbursement MBR\n let disbursementMbr = 0n;\n if (!isPrizeBox) {\n // 1 prize + 1 referral + (4 ASA payments if ASA)\n disbursementMbr += perDisbursement + prizeRewardsOptInCost; // prize\n if (isAlgoPayment) {\n disbursementMbr += perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr += perDisbursement * 5n + paymentRewardsOptInCost; // referral + 4 ASA payments\n }\n } else {\n // 1 referral + (3 ASA payments if ASA)\n if (isAlgoPayment) {\n disbursementMbr = perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr = perDisbursement * 4n + paymentRewardsOptInCost; // referral + 3 ASA payments\n }\n }\n\n // Escrow opt-in cost for ASA payments (factory opts escrow into payment asset)\n const escrowCost = isAlgoPayment ? 0n : escrowOptInCost;\n\n return baseCost + minBalance + optinMbr + disbursementMbr + escrowCost;\n }\n\n // ========== Purchase Methods ==========\n\n /**\n * Purchases a listing.\n * Use `isAsa: true` with `paymentAsset` and `paymentAmount` for ASA payments, otherwise ALGO is used.\n * Provide `gateTxn` for gated listings.\n */\n async purchase({\n sender,\n signer,\n listingAppId,\n marketplace,\n isAsa = false,\n gateTxn,\n ...rest\n }: PurchaseParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Use opUps to handle app reference limits (royalty distribution, DAO access, etc.)\n const group = this.client.newGroup();\n\n if (isAsa) {\n const { paymentAsset, paymentAmount } = rest as Extract<PurchaseParams, { isAsa: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(paymentAmount),\n assetId: BigInt(paymentAsset),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n } else {\n // Get listing to determine price for ALGO purchases\n const listing = this.getListing({ appId: BigInt(listingAppId) });\n const listingState = await listing.state();\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(listingState.price),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchase({\n ...sendParams,\n args: {\n payment,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchase({\n ...sendParams,\n args: {\n payment,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n }\n\n // Add opUps to increase app reference limit\n // purchase + payment (and possibly assetXfer) = 2-3 transactions, so we can add up to 13-14 opUps\n for (let i = 0; i < 10; i++) {\n group.opUp({ ...sendParams, args: {}, note: i > 0 ? `opUp-${i}` : undefined });\n }\n\n await group.send(sendParams);\n }\n\n // ========== Delist Methods ==========\n\n /**\n * Removes a listing and returns the asset to the seller.\n * Can only be called by the seller.\n */\n async delist({ sender, signer, appId }: DelistParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.delist({\n ...sendParams,\n args: { appId },\n });\n }\n\n // ========== Admin Methods ==========\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDAO({ sender, signer, akitaDao }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAO(uint64)void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao },\n });\n }\n\n /**\n * Updates the Akita DAO Escrow reference.\n */\n async updateAkitaDAOEscrow({ sender, signer, app }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAOEscrow(uint64)void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDaoEscrow({\n ...sendParams,\n args: { app },\n });\n }\n}\n\n/**\n * Convenience function to create a new listing and return the SDK.\n * Creates a marketplace SDK, creates the listing, and returns the listing SDK.\n */\nexport async function newListing({\n factoryParams,\n algorand,\n readerAccount,\n sendParams,\n ...listParams\n}: NewContractSDKParams & ListParams): Promise<ListingSDK> {\n const marketplace = new MarketplaceSDK({ factoryParams, algorand, readerAccount, sendParams });\n return await marketplace.list(listParams);\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\":\"Marketplace\",\"structs\":{},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"string\",\"name\":\"childVersion\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"list\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"byte[32][]\",\"name\":\"proof\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"listPrizeBox\",\"args\":[{\"type\":\"appl\",\"name\":\"prizeBoxTransferTxn\"},{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"uint64\",\"name\":\"appId\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"initBoxedContract\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"size\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"loadBoxedContract\",\"args\":[{\"type\":\"uint64\",\"name\":\"offset\"},{\"type\":\"byte[]\",\"name\":\"data\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deleteBoxedContract\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"uint64\",\"name\":\"app\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":2},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"childContractVersion\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==\",\"desc\":\"the current version of the child contract\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow to use\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{\"boxedContract\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"YmM=\"}}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[1546],\"errorMessage\":\"Bad method prize box transfer needed\"},{\"pc\":[945,1648],\"errorMessage\":\"Box must have value\"},{\"pc\":[417,1329,3148],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[824,1528,2809],\"errorMessage\":\"Contract not set\"},{\"pc\":[3168],\"errorMessage\":\"Escrow does not exist\"},{\"pc\":[3030],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[2804],\"errorMessage\":\"Invalid call order\"},{\"pc\":[899,923,1645,2046,2175,2896],\"errorMessage\":\"Invalid payment\"},{\"pc\":[2349,2491],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[819,1523],\"errorMessage\":\"Lowest price is 4 units for divisibility\"},{\"pc\":[2017,2159,2312,2467,2588],\"errorMessage\":\"Not a listing contract\"},{\"pc\":[1575],\"errorMessage\":\"Not a prize box\"},{\"pc\":[1588],\"errorMessage\":\"Not prize box owner\"},{\"pc\":[179],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[321],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[2687,2707,2835,2980,3019,3059],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2167,2475],\"errorMessage\":\"This has a gate\"},{\"pc\":[3177],\"errorMessage\":\"Wrong escrow for this operation\"},{\"pc\":[552,1090,1111,1148,1177,1217,1382,1561,1573,1790,1810,1837,1877,1918,2013,2066,2155,2195,2308,2369,2463,2511,2584,2705,2833,2870,2937,2978,3015,3057,3230,3252,3330],\"errorMessage\":\"application exists\"},{\"pc\":[1261],\"errorMessage\":\"asset exists\"},{\"pc\":[835,930,975,987,992,1214,1375,1379,1395,1550,1677,1689,1694,1874,1911,1915,1931,2000,2027,2295,2322,2699,2827,2863,2867,2930,2934,2972,3008,3051,3071,3172,3249,3327],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[3161],\"errorMessage\":\"invalid number of bytes for (len+(uint64,bool1)[])\"},{\"pc\":[814],\"errorMessage\":\"invalid number of bytes for (len+uint8[32][])\"},{\"pc\":[427,2737],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[625,642,792,1339,2657,2999],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[653,662,718,730,744,765,1462,1474,1487,1508,1986,2140,2281,2448,2579,2668,2721,2858,2925,2965,3044],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[755,776,1498,1519,1996,2150,2291,2458],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[1439,1978,2273],\"errorMessage\":\"transaction type is appl\"},{\"pc\":[709,2263,2440],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[698,1451,1968,2132,2850],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNiA2MDYwMCA5MzUwMDAgNTAwMDAKICAgIGJ5dGVjYmxvY2sgImFraXRhX2RhbyIgImFraXRhX2VzY3JvdyIgImJjIiAid2FsbGV0IiAweDE1MWY3Yzc1ICJmdW5kZXIiICJhYWwiICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIiAiZ2F0ZV9pZCIgMHgzZWExMTgzMiAweDgwIDB4YzUzYjMyY2MgInZlcnNpb24iIDB4ZDZmMTFlYTUgYmFzZTY0KEM0RUJRdz09KSAicmV2X21hcmtldHBsYWNlIiAweGFkZjkyYWU0IDB4NmExNjM5M2QgMHgxNzFjOWY4OCAicGFsIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBNYXJrZXRwbGFjZSBleHRlbmRzIEZhY3RvcnlDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHhlYTkxODBkZCAvLyBtZXRob2QgInVwZGF0ZShzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlX3JvdXRlQDIKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBNYXJrZXRwbGFjZSBleHRlbmRzIEZhY3RvcnlDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjEKICAgIHB1c2hieXRlc3MgMHhlMmZhOWUyMSAweDgxZGM1MTZhIDB4NmU5MDM1Y2MgMHg1ZDdhNjE3NyAweGRhYTk3NTE2IDB4MDJjZmIxY2YgMHhjOTdkYmIyZSAvLyBtZXRob2QgImxpc3QocGF5LGF4ZmVyLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdW10pdWludDY0IiwgbWV0aG9kICJsaXN0UHJpemVCb3goYXBwbCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdhdGVkUHVyY2hhc2UocGF5LGFwcGwsdWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAicHVyY2hhc2UocGF5LHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImdhdGVkUHVyY2hhc2VBc2EoYXhmZXIsYXBwbCx1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJwdXJjaGFzZUFzYShheGZlcix1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJkZWxpc3QodWludDY0KXZvaWQiCiAgICBieXRlYyAxMSAvLyBtZXRob2QgImluaXRCb3hlZENvbnRyYWN0KHN0cmluZyx1aW50NjQpdm9pZCIKICAgIHB1c2hieXRlc3MgMHhkY2EyZDg2MiAweGQzNDZiMWE0IDB4Mzk0ZWFlYjIgMHgzM2Y3ODgwOCAweDFlYWQyMGE5IDB4MzNlOTJjOTQgMHg4NTRkZWRlMCAvLyBtZXRob2QgImxvYWRCb3hlZENvbnRyYWN0KHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAiZGVsZXRlQm94ZWRDb250cmFjdCgpdm9pZCIsIG1ldGhvZCAib3B0SW4ocGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcHRJbkNvc3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU9Fc2Nyb3codWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbGlzdCBsaXN0UHJpemVCb3ggZ2F0ZWRQdXJjaGFzZSBwdXJjaGFzZSBnYXRlZFB1cmNoYXNlQXNhIHB1cmNoYXNlQXNhIGRlbGlzdCBpbml0Qm94ZWRDb250cmFjdCBsb2FkQm94ZWRDb250cmFjdCBkZWxldGVCb3hlZENvbnRyYWN0IG9wdEluIG9wdEluQ29zdCB1cGRhdGVBa2l0YURBT0VzY3JvdyB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVAMTkKICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOAogICAgLy8gZXhwb3J0IGNsYXNzIE1hcmtldHBsYWNlIGV4dGVuZHMgRmFjdG9yeUNvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweGM0MjZmNGJhIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fdXBkYXRlX3JvdXRlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBVcGRhdGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIHVwZGF0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yVHhuU2VuZGVyKHdhbGxldElEOiB1aW50NjQpIC0+IGJ5dGVzOgpvcmlnaW5PclR4blNlbmRlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTQ5CiAgICAvLyBleHBvcnQgZnVuY3Rpb24gb3JpZ2luT3JUeG5TZW5kZXIod2FsbGV0SUQ6IEFwcGxpY2F0aW9uKTogQWNjb3VudCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0MwogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBvcmlnaW5PclR4blNlbmRlcl9hZnRlcl9pZl9lbHNlQDMKICAgIGZyYW1lX2RpZyAwCgpvcmlnaW5PclR4blNlbmRlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE1MAogICAgLy8gcmV0dXJuIG9yaWdpbk9yKHdhbGxldElELCBUeG4uc2VuZGVyKQogICAgc3dhcAogICAgcmV0c3ViCgpvcmlnaW5PclR4blNlbmRlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY3CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIHB1c2hieXRlcyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTAKICAgIC8vIHJldHVybiBvcmlnaW5Pcih3YWxsZXRJRCwgVHhuLnNlbmRlcikKICAgIGIgb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA0CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiB1aW50NjQsIGFkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFdhbGxldElEVXNpbmdBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYWRkcmVzczogQWNjb3VudCk6IEFwcGxpY2F0aW9uIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OQogICAgLy8gY29uc3QgW290aGVyQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c090aGVyQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hieXRlcyAib2FsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2NAogICAgLy8gcmV0dXJuIGdldE90aGVyQXBwTGlzdChha2l0YURBTykuZXNjcm93CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODYtMTg5CiAgICAvLyBjb25zdCBkYXRhID0gYWJpQ2FsbDx0eXBlb2YgRXNjcm93RmFjdG9yeS5wcm90b3R5cGUuZ2V0Pih7CiAgICAvLyAgIGFwcElkOiBlc2Nyb3dGYWN0b3J5LAogICAgLy8gICBhcmdzOiBbYWRkcmVzc10KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4W10pCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MQogICAgLy8gaWYgKEJ5dGVzKGRhdGEpLmxlbmd0aCA9PT0gMCB8fCBCeXRlcyhkYXRhKS5sZW5ndGggIT09IDgpIHsKICAgIGxlbgogICAgZHVwCiAgICBieiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9faWZfYm9keUA2CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDgKICAgICE9CiAgICBieiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaWZfZWxzZUA3CgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9faWZfYm9keUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTIKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAoKZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgyCiAgICAvLyByZXR1cm4gQXBwbGljYXRpb24oZ2V0V2FsbGV0SUQoZXNjcm93RmFjdG9yeSwgYWRkcmVzcykpCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTk1CiAgICAvLyByZXR1cm4gYnRvaShkYXRhKQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgyCiAgICAvLyByZXR1cm4gQXBwbGljYXRpb24oZ2V0V2FsbGV0SUQoZXNjcm93RmFjdG9yeSwgYWRkcmVzcykpCiAgICBiIGdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDgKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnYXRlQ2hlY2soZ2F0ZVR4bjogdWludDY0LCBha2l0YURBTzogdWludDY0LCBjYWxsZXI6IGJ5dGVzLCBpZDogdWludDY0KSAtPiB1aW50NjQ6CmdhdGVDaGVjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2F0ZUNoZWNrKGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLCBha2l0YURBTzogQXBwbGljYXRpb24sIGNhbGxlcjogQWNjb3VudCwgaWQ6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMwogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzQKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzQKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGJueiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzNQogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM1CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM2CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHg0MzkyMjY1NSAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNgogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM3CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18xIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzcKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM4CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBmcmFtZV9kaWcgLTQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM4CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzItMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyAgIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vICAgZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgLy8gKQogICAgcmV0c3ViCgpnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMyLTIzOQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gICBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyAgIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJld2FyZHNPcHRJbkNvc3QoYWtpdGFEQU86IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0OgpyZXdhcmRzT3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZXdhcmRzT3B0SW5Db3N0KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTA5CiAgICAvLyBpZiAoYXNzZXQgIT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogcmV3YXJkc09wdEluQ29zdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTEKICAgIC8vIGlmICghQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSkgewogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IHJld2FyZHNPcHRJbkNvc3RfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUxMgogICAgLy8gcmV0dXJuIEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICByZXRzdWIKCnJld2FyZHNPcHRJbkNvc3RfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTUKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKc3BsaXRPcHRJbkNvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBzcGxpdE9wdEluQ291bnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBlc2Nyb3c6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIyCiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyNAogICAgLy8gaWYgKCFlc2Nyb3cuaXNPcHRlZEluKGFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDMKICAgIC8vIGNvbnN0IFtzcGxpdHNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNSZXZlbnVlU3BsaXRzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJyZXZlbnVlX3NwbGl0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI4CiAgICAvLyBjb3VudCArPSBzcGxpdHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTIgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNgogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzQKICAgIC8vIGNoaWxkQ29udHJhY3RWZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogQmFzZUZhY3RvcnlHbG9iYWxTdGF0ZUtleUNoaWxkQ29udHJhY3RWZXJzaW9uIH0pCiAgICBieXRlYyA3IC8vICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjcKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUgPSBjaGlsZFZlcnNpb24KICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFraXRhREFPRXNjcm93CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmxpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpsaXN0OgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNC00NQogICAgLy8gbGlzdCgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsIC8vIDAgfCBBc3NldAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDcKICAgIC8vIGFzc2VydChwcmljZSA+PSA0LCBFUlJfUFJJQ0VfVE9PX0xPVykKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA+PQogICAgYXNzZXJ0IC8vIExvd2VzdCBwcmljZSBpcyA0IHVuaXRzIGZvciBkaXZpc2liaWxpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ29udHJhY3Qgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NTEtNTMKICAgIC8vIGNvbnN0IG9wdGluTUJSOiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogMgogICAgYm56IGxpc3RfdGVybmFyeV9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo1MgogICAgLy8gPyBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgYnVyeSAxNQoKbGlzdF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo2MgogICAgLy8gbGV0IGRpc2J1cnNlbWVudE1CUjogdWludDY0ID0gZGlzYnVyc2VtZW50Q29zdCgxKSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjYyCiAgICAvLyBsZXQgZGlzYnVyc2VtZW50TUJSOiB1aW50NjQgPSBkaXNidXJzZW1lbnRDb3N0KDEpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LmlkKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIGNhbGxzdWIgcmV3YXJkc09wdEluQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBpbnRjIDQgLy8gNjA2MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjYyCiAgICAvLyBsZXQgZGlzYnVyc2VtZW50TUJSOiB1aW50NjQgPSBkaXNidXJzZW1lbnRDb3N0KDEpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LmlkKQogICAgKwogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjMKICAgIC8vIGlmIChpc0FsZ29QYXltZW50KSB7CiAgICBkaWcgNwogICAgYm56IGxpc3RfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY0CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCgxKQogICAgZGlnIDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUwMQogICAgLy8gcmV0dXJuIChNaW5EaXNidXJzZW1lbnRzTUJSICsgVXNlckFsbG9jYXRpb25NQlIpICogY291bnQKICAgIGludGMgNCAvLyA2MDYwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjQKICAgIC8vIGRpc2J1cnNlbWVudE1CUiArPSBkaXNidXJzZW1lbnRDb3N0KDEpCiAgICArCiAgICBidXJ5IDE3CgpsaXN0X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcwLTcyCiAgICAvLyBjb25zdCBlc2Nyb3dPcHRJbkNvc3Q6IHVpbnQ2NCA9IGlzQWxnb1BheW1lbnQKICAgIC8vICAgPyAwCiAgICAvLyAgIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGRpZyA3CiAgICBibnogbGlzdF90ZXJuYXJ5X2ZhbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcxCiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0X3Rlcm5hcnlfbWVyZ2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3NAogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTYKICAgICsKICAgIGRpZyAxOAogICAgKwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzYtNzgKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBsaXN0aW5nLmdsb2JhbEJ5dGVzKSArCiAgICBpbnRjIDUgLy8gOTM1MDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3Ni03OQogICAgLy8gTUFYX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogbGlzdGluZy5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIGNoaWxkQXBwTUJSCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjgzLTkwCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRvdGFsTUJSCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAxMgogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6ODYKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo4My05MAogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0b3RhbE1CUgogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTMtMTAxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7IGdyZWF0ZXJUaGFuOiAwIH0sCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAxMAogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk2CiAgICAvLyBzZW5kZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5My0xMDEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBzZW5kZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHsgZ3JlYXRlclRoYW46IDAgfSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5NwogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTMtMTAxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7IGdyZWF0ZXJUaGFuOiAwIH0sCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYnVyeSAxNgogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgY3JlYXRvclJveWFsdHkgPSByb3lhbHRpZXModGhpcy5ha2l0YURBTy52YWx1ZSwgYXNzZXRYZmVyLnhmZXJBc3NldCwgbmFtZSwgcHJvb2YpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGNyZWF0b3JSb3lhbHR5ID0gcm95YWx0aWVzKHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQsIG5hbWUsIHByb29mKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMjEKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDE4CiAgICAvLyBsZXQgY3JlYXRvclJveWFsdHk6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQyMAogICAgLy8gaWYgKCEocHJvb2YubGVuZ3RoID4gMCkpIHsKICAgIGR1cAogICAgYm56IGxpc3RfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjEKICAgIC8vIHJldHVybiBDcmVhdG9yUm95YWx0eURlZmF1bHQKICAgIHB1c2hpbnQgNTAwMCAvLyA1MDAwCiAgICBidXJ5IDE4CgpsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwNgogICAgLy8gY29uc3QgYXBwcm92YWxQcm9ncmFtID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoMCwgdGhpcy5ib3hlZENvbnRyYWN0Lmxlbmd0aCkKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA2CiAgICAvLyBjb25zdCBhcHByb3ZhbFByb2dyYW0gPSB0aGlzLmJveGVkQ29udHJhY3QuZXh0cmFjdCgwLCB0aGlzLmJveGVkQ29udHJhY3QubGVuZ3RoKQogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwOS0xMjkKICAgIC8vIGNvbnN0IGxpc3RpbmdBcHAgPSBsaXN0aW5nLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIC8vICAgICAgIGZhbHNlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgY3JlYXRvclJveWFsdHksCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTIKICAgIC8vIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICBkaWcgMTkKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE3CiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE4CiAgICAvLyB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICBkaWcgMTUKICAgIGd0eG5zIFNlbmRlcgogICAgZGlnIDE3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyMAogICAgLy8gY3JlYXRvclJveWFsdHksCiAgICBkaWcgMjIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyMwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozNAogICAgLy8gY2hpbGRDb250cmFjdFZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBCYXNlRmFjdG9yeUdsb2JhbFN0YXRlS2V5Q2hpbGRDb250cmFjdFZlcnNpb24gfSkKICAgIGJ5dGVjIDcgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjMKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyNAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyNAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjUKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjUKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA5LTEyOQogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsKGFkZHJlc3MsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTEzCiAgICAvLyBmYWxzZSwKICAgIHB1c2hieXRlcyAweDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCBsaXN0aW5nID0gY29tcGlsZUFyYzQoTGlzdGluZykKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBwdXNoaW50IDUgLy8gNQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA5LTEyOQogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IGxpc3RpbmcgPSBjb21waWxlQXJjNChMaXN0aW5nKQogICAgYnl0ZWMgMTQgLy8gYmFzZTY0KEM0RUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDktMTI5CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgICAgICBmYWxzZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIGNyZWF0b3JSb3lhbHR5LAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwOS0xMzEKICAgIC8vIGNvbnN0IGxpc3RpbmdBcHAgPSBsaXN0aW5nLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIC8vICAgICAgIGZhbHNlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgY3JlYXRvclJveWFsdHksCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzNC0xMzkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzNgogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTM3CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgZGlnIDIxCiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTM0LTEzOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMzQtMTM5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQyLTE1MQogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ2CiAgICAvLyByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNDcKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ1LTE0OAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE0Mi0xNTEKICAgIC8vIGxpc3RpbmcuY2FsbC5vcHRpbih7CiAgICAvLyAgIGFwcElkOiBsaXN0aW5nQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWMgOSAvLyBtZXRob2QgIm9wdGluKHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE1NC0xNjAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNTYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgMTQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTU0LTE1OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTU0LTE2MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjIKICAgIC8vIGlmICghaXNBbGdvUGF5bWVudCkgewogICAgZGlnIDcKICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTY0LTE3MwogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE2OAogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxNQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjctMTcwCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjQtMTczCiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBieXRlYyA5IC8vIG1ldGhvZCAib3B0aW4ocGF5LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNzYKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihBc3NldChwYXltZW50QXNzZXQpKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTc2CiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQocGF5bWVudEFzc2V0KSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0X2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE3NwogICAgLy8gdGhpcy5vcHRBa2l0YUVzY3Jvd0luQW5kU2VuZChBa2l0YURBT0VzY3Jvd0FjY291bnRNYXJrZXRwbGFjZSwgQXNzZXQocGF5bWVudEFzc2V0KSwgMCkKICAgIGJ5dGVjIDE1IC8vICJyZXZfbWFya2V0cGxhY2UiCiAgICBkaWcgOAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQKICAgIHBvcAoKbGlzdF9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQtNDUKICAgIC8vIGxpc3QoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHByaWNlOiB1aW50NjQsCiAgICAvLyAgIHBheW1lbnRBc3NldDogdWludDY0LCAvLyAwIHwgQXNzZXQKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0LAogICAgLy8gICByZXNlcnZlZEZvcjogQWNjb3VudCwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHByb29mOiBQcm9vZgogICAgLy8gKTogdWludDY0IHsKICAgIGRpZyAxNQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbGlzdF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgZGlnIDE5CiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQyNgogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjgKICAgIC8vIGFzc2V0LmNyZWF0b3IsCiAgICBkaWcgMTkKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDMwCiAgICAvLyBzaGEyNTYoc2hhMjU2KGl0b2IoYXNzZXQuaWQpKSksCiAgICBzd2FwCiAgICBpdG9iCiAgICBzaGEyNTYKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MzIKICAgIC8vIDEsCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MGNmMWI5Y2YgLy8gbWV0aG9kICJ2ZXJpZmllZFJlYWQoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQsc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzMwogICAgLy8gJ3JveWFsdHknLAogICAgcHVzaGJ5dGVzIDB4MDAwNzcyNmY3OTYxNmM3NDc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQyNS00MzUKICAgIC8vIGNvbnN0IGNyZWF0b3JSb3lhbHR5U3RyaW5nID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmaWVkUmVhZD4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGFzc2V0LmNyZWF0b3IsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBzaGEyNTYoc2hhMjU2KGl0b2IoYXNzZXQuaWQpKSksCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgMSwKICAgIC8vICAgICAncm95YWx0eScsCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICBidXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzNwogICAgLy8gaWYgKEJ5dGVzKGNyZWF0b3JSb3lhbHR5U3RyaW5nKS5sZW5ndGggPiAwKSB7CiAgICBsZW4KICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MzgKICAgIC8vIGNyZWF0b3JSb3lhbHR5ID0gYnRvaShCeXRlcyhjcmVhdG9yUm95YWx0eVN0cmluZykpCiAgICBkaWcgMjAKICAgIGJ0b2kKICAgIGJ1cnkgMTgKCmxpc3RfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQxCiAgICAvLyBpZiAoY3JlYXRvclJveWFsdHkgPiBDcmVhdG9yUm95YWx0eU1heGltdW1TaW5nbGUpIHsKICAgIGRpZyAxNwogICAgaW50YyA2IC8vIDUwMDAwCiAgICA+CiAgICBieiBsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0MgogICAgLy8gcmV0dXJuIENyZWF0b3JSb3lhbHR5TWF4aW11bVNpbmdsZQogICAgaW50YyA2IC8vIDUwMDAwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGNyZWF0b3JSb3lhbHR5ID0gcm95YWx0aWVzKHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQsIG5hbWUsIHByb29mKQogICAgYiBsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDI5CgpsaXN0X3Rlcm5hcnlfZmFsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzIKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAqCiAgICBiIGxpc3RfdGVybmFyeV9tZXJnZUAxMAoKbGlzdF9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY2CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjYKICAgIC8vIGRpc2J1cnNlbWVudE1CUiArPSBkaXNidXJzZW1lbnRDb3N0KDUpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBwYXltZW50QXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDgKICAgIGNhbGxzdWIgcmV3YXJkc09wdEluQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBwdXNoaW50IDMwMzAwMCAvLyAzMDMwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY2CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgZGlnIDE3CiAgICArCiAgICBidXJ5IDE3CiAgICBiIGxpc3RfYWZ0ZXJfaWZfZWxzZUA3CgpsaXN0X3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjUzCiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIDIKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGJ1cnkgMTUKICAgIGIgbGlzdF90ZXJuYXJ5X21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UubGlzdFByaXplQm94W3JvdXRpbmddKCkgLT4gdm9pZDoKbGlzdFByaXplQm94OgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4NC0xOTMKICAgIC8vIGxpc3RQcml6ZUJveCgKICAgIC8vICAgcHJpemVCb3hUcmFuc2ZlclR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgcmVzZXJ2ZWRGb3I6IEFjY291bnQsCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cG4gMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NAogICAgLy8gYXNzZXJ0KHByaWNlID49IDQsIEVSUl9QUklDRV9UT09fTE9XKQogICAgcHVzaGludCA0IC8vIDQKICAgID49CiAgICBhc3NlcnQgLy8gTG93ZXN0IHByaWNlIGlzIDQgdW5pdHMgZm9yIGRpdmlzaWJpbGl0eQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gYXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ29udHJhY3Qgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk4CiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KCkgJiYKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJ0cmFuc2ZlcihhZGRyZXNzKXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk4LTE5OQogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPigpICYmCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBieiBsaXN0UHJpemVCb3hfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOTkKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGRpZyA4CiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5OC0xOTkKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oKSAmJgogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxpc3RQcml6ZUJveF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpsaXN0UHJpemVCb3hfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk3LTIwMAogICAgLy8gYXNzZXJ0KCgKICAgIC8vICAgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPigpICYmCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICksIEVSUl9CQURfTUVUSE9EX1BSSVpFX0JPWF9UUkFOU0ZFUl9ORUVERUQpCiAgICBhc3NlcnQgLy8gQmFkIG1ldGhvZCBwcml6ZSBib3ggdHJhbnNmZXIgbmVlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDEKICAgIC8vIGFzc2VydChnZXRQcml6ZUJveE93bmVyKHRoaXMuYWtpdGFEQU8udmFsdWUsIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQpID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9QUklaRV9CT1hfT1dORVIpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDEKICAgIC8vIGFzc2VydChnZXRQcml6ZUJveE93bmVyKHRoaXMuYWtpdGFEQU8udmFsdWUsIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQpID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9QUklaRV9CT1hfT1dORVIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDkKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NDkKICAgIC8vIGFzc2VydChwcml6ZUJveC5jcmVhdG9yID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnByaXplQm94KS5hZGRyZXNzLCBFUlJfTk9UX0FfUFJJWkVfQk9YKQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQ5CiAgICAvLyBhc3NlcnQocHJpemVCb3guY3JlYXRvciA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5wcml6ZUJveCkuYWRkcmVzcywgRVJSX05PVF9BX1BSSVpFX0JPWCkKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIHByaXplIGJveAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTAKICAgIC8vIGNvbnN0IFtvd25lckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHByaXplQm94LCBCeXRlcyhQcml6ZUJveEdsb2JhbFN0YXRlS2V5T3duZXIpKQogICAgcHVzaGJ5dGVzICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwMQogICAgLy8gYXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBwcml6ZSBib3ggb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwNC0yMDYKICAgIC8vIGNvbnN0IG9wdGluTUJSOiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDUKICAgIC8vID8gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKCmxpc3RQcml6ZUJveF90ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMTYKICAgIC8vIGlmIChpc0FsZ29QYXltZW50KSB7CiAgICBkaWcgNAogICAgYm56IGxpc3RQcml6ZUJveF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTAxCiAgICAvLyByZXR1cm4gKE1pbkRpc2J1cnNlbWVudHNNQlIgKyBVc2VyQWxsb2NhdGlvbk1CUikgKiBjb3VudAogICAgaW50YyA0IC8vIDYwNjAwCiAgICBidXJ5IDEzCgpsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIGNvbnN0IGVzY3Jvd09wdEluQ29zdDogdWludDY0ID0gaXNBbGdvUGF5bWVudAogICAgLy8gICA/IDAKICAgIC8vICAgOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjI0CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyNwogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTIKICAgICsKICAgIGRpZyAxNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyOS0yMzEKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBsaXN0aW5nLmdsb2JhbEJ5dGVzKSArCiAgICBpbnRjIDUgLy8gOTM1MDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMjktMjMyCiAgICAvLyBNQVhfUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBsaXN0aW5nLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogbGlzdGluZy5nbG9iYWxCeXRlcykgKwogICAgLy8gY2hpbGRBcHBNQlIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzNS0yNDIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdG90YWxNQlIKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDkKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzOAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzNS0yNDIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdG90YWxNQlIKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGRpZyAzCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDUKICAgIC8vIGNvbnN0IGFwcHJvdmFsUHJvZ3JhbSA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDAsIHRoaXMuYm94ZWRDb250cmFjdC5sZW5ndGgpCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI0NQogICAgLy8gY29uc3QgYXBwcm92YWxQcm9ncmFtID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoMCwgdGhpcy5ib3hlZENvbnRyYWN0Lmxlbmd0aCkKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDgtMjY4CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQuaWQsCiAgICAvLyAgICAgICB0cnVlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgMCwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI1MQogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZC5pZCwKICAgIGRpZyAxMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTYKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTcKICAgIC8vIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIHVuY292ZXIgMwogICAgZ3R4bnMgU2VuZGVyCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjU5CiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MgogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozNAogICAgLy8gY2hpbGRDb250cmFjdFZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBCYXNlRmFjdG9yeUdsb2JhbFN0YXRlS2V5Q2hpbGRDb250cmFjdFZlcnNpb24gfSkKICAgIGJ5dGVjIDcgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjIKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjQKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjQKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQ4LTI2OAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBieXRlYyAxMyAvLyBtZXRob2QgImNyZWF0ZSh1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLChhZGRyZXNzLHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3Msc3RyaW5nLHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTIKICAgIC8vIHRydWUsCiAgICBieXRlYyAxMCAvLyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDgKICAgIC8vIGNvbnN0IGxpc3RpbmcgPSBjb21waWxlQXJjNChMaXN0aW5nKQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAxMCAvLyAxMAogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDgtMjY4CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQuaWQsCiAgICAvLyAgICAgICB0cnVlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgMCwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjA4CiAgICAvLyBjb25zdCBsaXN0aW5nID0gY29tcGlsZUFyYzQoTGlzdGluZykKICAgIGJ5dGVjIDE0IC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQ4LTI2OAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQ4LTI3MAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI3My0yNzgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI3NQogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjc2CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgdW5jb3ZlciA0CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjczLTI3NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzMtMjc4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjgxLTI4NAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLAogICAgLy8gICBhcmdzOiBbbGlzdGluZ0FwcC5hZGRyZXNzXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyODMKICAgIC8vIGFyZ3M6IFtsaXN0aW5nQXBwLmFkZHJlc3NdLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjgxLTI4NAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLAogICAgLy8gICBhcmdzOiBbbGlzdGluZ0FwcC5hZGRyZXNzXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNiAvLyBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg2CiAgICAvLyBpZiAoIWlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA0CiAgICBieiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg4LTI5NwogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI5MgogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxMQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyOTEtMjk0CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyODgtMjk3CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBieXRlYyA5IC8vIG1ldGhvZCAib3B0aW4ocGF5LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMDAKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihBc3NldChwYXltZW50QXNzZXQpKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAwCiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQocGF5bWVudEFzc2V0KSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgNQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAxCiAgICAvLyB0aGlzLm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKEFraXRhREFPRXNjcm93QWNjb3VudE1hcmtldHBsYWNlLCBBc3NldChwYXltZW50QXNzZXQpLCAwKQogICAgYnl0ZWMgMTUgLy8gInJldl9tYXJrZXRwbGFjZSIKICAgIGRpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBvcHRBa2l0YUVzY3Jvd0luQW5kU2VuZAogICAgcG9wCgpsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4NC0xOTMKICAgIC8vIGxpc3RQcml6ZUJveCgKICAgIC8vICAgcHJpemVCb3hUcmFuc2ZlclR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgcmVzZXJ2ZWRGb3I6IEFjY291bnQsCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkaWcgMTEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmxpc3RQcml6ZUJveF90ZXJuYXJ5X2ZhbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjI1CiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyNQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyNQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyA3CiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgKgogICAgYiBsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAxNAoKbGlzdFByaXplQm94X2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxOQogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE5CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgPSBkaXNidXJzZW1lbnRDb3N0KDQpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBwYXltZW50QXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDUKICAgIGNhbGxzdWIgcmV3YXJkc09wdEluQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBwdXNoaW50IDI0MjQwMCAvLyAyNDI0MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxOQogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgYnVyeSAxMwogICAgYiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAxMQoKbGlzdFByaXplQm94X3Rlcm5hcnlfZmFsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwNgogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgYnVyeSAxMQogICAgYiBsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUA4CgpsaXN0UHJpemVCb3hfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgbGlzdFByaXplQm94X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjpNYXJrZXRwbGFjZS5nYXRlZFB1cmNoYXNlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2F0ZWRQdXJjaGFzZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwOC0zMTMKICAgIC8vIGdhdGVkUHVyY2hhc2UoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTQKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyh0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE1CiAgICAvLyBjb25zdCBvcmlnaW4gPSBvcmlnaW5PclR4blNlbmRlcih3YWxsZXQpCiAgICBjYWxsc3ViIG9yaWdpbk9yVHhuU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTcKICAgIC8vIGFzc2VydChhcHBJZC5jcmVhdG9yID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9BX0xJU1RJTkcpCiAgICBkaWcgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgbGlzdGluZyBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE4CiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMgogICAgYnl0ZWMgOCAvLyAiZ2F0ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMxOQogICAgLy8gYXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIGdhdGVJRCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTkKICAgIC8vIGFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZ2F0ZUNoZWNrCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMyMC0zMjQKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMyMgogICAgLy8geyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgfSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjAtMzI0CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgeyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDU1CiAgICAvLyBjb25zdCBbZnVuZGVyQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYXBwSWQsIEJ5dGVzKEdsb2JhbFN0YXRlS2V5RnVuZGVyKSkKICAgIGRpZyAxCiAgICBieXRlYyA1IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjcKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogY3JlYXRvciwgYW1vdW50IH0gPSBnZXRGdW5kZXIoYXBwSWQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzMC0zNDAKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzM0CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMzUKICAgIC8vIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICB1bmNvdmVyIDUKICAgIGd0eG5zIEFtb3VudAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzMy0zMzYKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMzAtMzQwCiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzM3CiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzMwLTM0MAogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNyAvLyBtZXRob2QgInB1cmNoYXNlKHBheSxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA1IC8vIDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM0Mi0zNDcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQyLTM0NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQyLTM0NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMDgtMzEzCiAgICAvLyBnYXRlZFB1cmNoYXNlKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLnB1cmNoYXNlW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVyY2hhc2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNTAtMzU0CiAgICAvLyBwdXJjaGFzZSgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNTUKICAgIC8vIGFzc2VydChhcHBJZC5jcmVhdG9yID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9BX0xJU1RJTkcpCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgbGlzdGluZyBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzU2CiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMQogICAgYnl0ZWMgOCAvLyAiZ2F0ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1NwogICAgLy8gYXNzZXJ0KGdhdGVJRCA9PT0gMCwgRVJSX0hBU19HQVRFKQogICAgIQogICAgYXNzZXJ0IC8vIFRoaXMgaGFzIGEgZ2F0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzU4LTM2MgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzYwCiAgICAvLyB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyB9LAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1OC0zNjIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDEKICAgIGJ5dGVjIDUgLy8gImZ1bmRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM2NQogICAgLy8gY29uc3QgeyBhY2NvdW50OiBjcmVhdG9yLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzY4LTM3OAogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzIKICAgIC8vIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM3MwogICAgLy8gYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIHVuY292ZXIgNQogICAgZ3R4bnMgQW1vdW50CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzcxLTM3NAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM2OC0zNzgKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzUKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNjgtMzc4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE3IC8vIG1ldGhvZCAicHVyY2hhc2UocGF5LGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDUgLy8gNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzgwLTM4NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODAtMzg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODAtMzg1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1MC0zNTQKICAgIC8vIHB1cmNoYXNlKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UuZ2F0ZWRQdXJjaGFzZUFzYVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdhdGVkUHVyY2hhc2VBc2E6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODgtMzkzCiAgICAvLyBnYXRlZFB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzk0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5NAogICAgLy8gY29uc3Qgd2FsbGV0ID0gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5NQogICAgLy8gY29uc3Qgb3JpZ2luID0gb3JpZ2luT3JUeG5TZW5kZXIod2FsbGV0KQogICAgY2FsbHN1YiBvcmlnaW5PclR4blNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzk3CiAgICAvLyBhc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgZGlnIDIKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIGxpc3RpbmcgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5OAogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KGFwcElkLCBCeXRlcyhMaXN0aW5nR2xvYmFsU3RhdGVLZXlHYXRlSUQpKVswXQogICAgZGlnIDIKICAgIGJ5dGVjIDggLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozOTkKICAgIC8vIGFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzk5CiAgICAvLyBhc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIG9yaWdpbiwgZ2F0ZUlEKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDUKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGdhdGVDaGVjawogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDAtNDA3CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHsgZ3JlYXRlclRoYW46IDAgfSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwMC00MDcKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogeyBncmVhdGVyVGhhbjogMCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgPT0KICAgIGRpZyAzCiAgICBndHhucyBBc3NldEFtb3VudAogICAgc3dhcAogICAgZGlnIDEKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDIKICAgIGJ5dGVjIDUgLy8gImZ1bmRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMAogICAgLy8gY29uc3QgeyBhY2NvdW50OiByZWNlaXZlciwgYW1vdW50IH0gPSBnZXRGdW5kZXIoYXBwSWQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMy00MjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTcKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgNAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDE5CiAgICAvLyB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICB1bmNvdmVyIDYKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTYtNDIwCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMy00MjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQyMQogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMy00MjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBieXRlYyAxOCAvLyBtZXRob2QgInB1cmNoYXNlQXNhKGF4ZmVyLGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDI2LTQyOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDI2LTQyNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQyNi00MjgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM4OC0zOTMKICAgIC8vIGdhdGVkUHVyY2hhc2VBc2EoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBnYXRlVHhuOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjpNYXJrZXRwbGFjZS5wdXJjaGFzZUFzYVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnB1cmNoYXNlQXNhOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMxLTQzNQogICAgLy8gcHVyY2hhc2VBc2EoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDM2CiAgICAvLyBhc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIGxpc3RpbmcgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzNwogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KGFwcElkLCBCeXRlcyhMaXN0aW5nR2xvYmFsU3RhdGVLZXlHYXRlSUQpKVswXQogICAgZGlnIDEKICAgIGJ5dGVjIDggLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MzgKICAgIC8vIGFzc2VydChnYXRlSUQgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgICEKICAgIGFzc2VydCAvLyBUaGlzIGhhcyBhIGdhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzOS00NDYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogeyBncmVhdGVyVGhhbjogMCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgZGlnIDIKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ0MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDM5LTQ0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIGFzc2V0WGZlciwKICAgIC8vICAgewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7IGdyZWF0ZXJUaGFuOiAwIH0sCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICA9PQogICAgZGlnIDMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBkaWcgMQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkaWcgMgogICAgYnl0ZWMgNSAvLyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDQ5CiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUyLTQ2MwogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ1NgogICAgLy8gYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyA0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NTgKICAgIC8vIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIHVuY292ZXIgNgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ1NS00NTkKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vIH0pLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUyLTQ2MwogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDYwCiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUyLTQ2MwogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAicHVyY2hhc2VBc2EoYXhmZXIsYWRkcmVzcyxhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NjUtNDY3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NjUtNDY2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDY1LTQ2NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMxLTQzNQogICAgLy8gcHVyY2hhc2VBc2EoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmRlbGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGlzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ3MAogICAgLy8gZGVsaXN0KGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ3MQogICAgLy8gYXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0FfTElTVElORykKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgbGlzdGluZyBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZHVwCiAgICBieXRlYyA1IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzQKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogcmVjZWl2ZXIsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzctNDgwCiAgICAvLyBsaXN0aW5nLmNhbGwuZGVsaXN0KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzkKICAgIC8vIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ3Ny00ODAKICAgIC8vIGxpc3RpbmcuY2FsbC5kZWxpc3QoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4ZTg2MzQzIC8vIG1ldGhvZCAiZGVsaXN0KGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA1IC8vIDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ4Mi00ODQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ4Mi00ODMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0ODItNDg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzAKICAgIC8vIGRlbGlzdChhcHBJZDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmluaXRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgNyAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQzCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0NAogICAgLy8gaWYgKCF0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKCmluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQyCiAgICAvLyBpbml0Qm94ZWRDb250cmFjdCh2ZXJzaW9uOiBzdHJpbmcsIHNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgc3dhcAogICAgYm94X3Jlc2l6ZQogICAgYiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmxvYWRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKbG9hZEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1MwogICAgLy8gbG9hZEJveGVkQ29udHJhY3Qob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1NAogICAgLy8gY29uc3QgZXhwZWN0ZWRQcmV2aW91c0NhbGxzOiB1aW50NjQgPSBvZmZzZXQgLyAyMDMyCiAgICBwdXNoaW50IDIwMzIgLy8gMjAzMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTUKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSBleHBlY3RlZFByZXZpb3VzQ2FsbHMgLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny01OQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MAogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkdXAKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjAKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjEKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDExIC8vIG1ldGhvZCAiaW5pdEJveGVkQ29udHJhY3Qoc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYxCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MgogICAgLy8gJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny02MgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgaW50Y18xIC8vIDEKCmxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU2LTYzCiAgICAvLyBhc3NlcnQoKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICAvLyAgICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIC8vICksIEVSUl9JTlZBTElEX0NBTExfT1JERVIpCiAgICBhc3NlcnQgLy8gSW52YWxpZCBjYWxsIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjQKICAgIC8vIGFzc2VydCh0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzLCBFUlJfQ09OVFJBQ1RfTk9UX1NFVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENvbnRyYWN0IG5vdCBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlcGxhY2Uob2Zmc2V0LCBkYXRhKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5kZWxldGVCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZWRDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjXzMgLy8gIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjcwCiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjgKICAgIC8vIGRlbGV0ZUJveGVkQ29udHJhY3QoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTIKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTQtMTYxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NwogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NC0xNjEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU4CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA0CiAgICArCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTQtMTYxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2My0xNjkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjUKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjYKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTYzLTE2OAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTYzLTE2OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTAKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5Db3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTcyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzQKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzQKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTc0CiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3NQogICAgLy8gcmV0dXJuIEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDIKICAgICsKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0LnVwZGF0ZUFraXRhREFPRXNjcm93W3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU9Fc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzcKICAgIC8vIHVwZGF0ZUFraXRhREFPRXNjcm93KGFwcDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzkKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUgPSBhcHAKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzcKICAgIC8vIHVwZGF0ZUFraXRhREFPRXNjcm93KGFwcDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6VXBncmFkZWFibGVBa2l0YUJhc2VDb250cmFjdC51cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjUwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQKICAgIC8vIGNvbnN0IFtwbHVnaW5BcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUGx1Z2luQXBwTGlzdCkpCiAgICBieXRlYyAxOSAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTIKICAgIC8vIGFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhcHAgdXBncmFkZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDEyIC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTMKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IG5ld1ZlcnNpb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0Lm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKG5hbWU6IGJ5dGVzLCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpvcHRBa2l0YUVzY3Jvd0luQW5kU2VuZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgwCiAgICAvLyBwcm90ZWN0ZWQgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQobmFtZTogc3RyaW5nLCBhc3NldDogQXNzZXQsIGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIGR1cAogICAgYnl0ZWMgMTkgLy8gInBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgzCiAgICAvLyBjb25zdCB7IHJldmVudWVNYW5hZ2VyIH0gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGRpZyAyCiAgICBieXRlY18zIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3MC03MwogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjcyCiAgICAvLyBhcmdzOiBbW25hbWVdXSwKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDEwMDAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3MC03MwogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuKyh1aW50NjQsYm9vbDEpW10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3NQogICAgLy8gYXNzZXJ0KGVzY3Jvdy5pZCAhPT0gMCwgRVJSX0VTQ1JPV19ET0VTX05PVF9FWElTVCkKICAgIGV4dHJhY3QgNiA5CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYXNzZXJ0IC8vIEVzY3JvdyBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODYKICAgIC8vIGFzc2VydChpZCA9PT0gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5pZCwgRVJSX1dST05HX0VTQ1JPV19GT1JfT1BFUkFUSU9OKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODYKICAgIC8vIGFzc2VydChpZCA9PT0gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5pZCwgRVJSX1dST05HX0VTQ1JPV19GT1JfT1BFUkFUSU9OKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGVzY3JvdyBmb3IgdGhpcyBvcGVyYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg4LTk3CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHg1ODJmZjM4MiAvLyBtZXRob2QgImFyYzU4X3Jla2V5VG9QbHVnaW4odWludDY0LGJvb2wsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OTIKICAgIC8vIHRydWUsCiAgICBieXRlYyAxMCAvLyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk0CiAgICAvLyBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk1CiAgICAvLyBbXQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg4LTk3CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMDEKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk5LTEwMwogICAgLy8gY29uc3Qgb3B0SW5Db3VudCA9IHNwbGl0T3B0SW5Db3VudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhc3NldAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMDUKICAgIC8vIGNvbnN0IG1ickFtb3VudDogdWludDY0ID0gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogb3B0SW5Db3VudAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMTMtMTE2CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG1ickFtb3VudAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEwCiAgICAvLyB3YWxsZXQsCiAgICBkaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEyCiAgICAvLyBbYXNzZXQuaWRdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjkyCiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTAgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7IGFwcElkOiB3YWxsZXQgfSkKICAgIGl0eG5fbmV4dAogICAgcHVzaGJ5dGVzIDB4NmNjM2Y2MDYgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMgogICAgLy8gaWYgKGFtb3VudCA+IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjMtMTI5CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0KAogICAgLy8gICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyNQogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTI1CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyNC0xMjgKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCgpvcHRBa2l0YUVzY3Jvd0luQW5kU2VuZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzIKICAgIC8vIGl0eG5Db21wb3NlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM0CiAgICAvLyByZXR1cm4gbWJyQW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCg==\",\"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/**\n * The argument types for the Marketplace contract\n */\nexport type MarketplaceArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,string,uint64,uint64)void': {\n version: string\n childVersion: string\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n name: string\n proof: Uint8Array[]\n }\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': {\n prizeBoxTransferTxn: AppMethodCallTransactionArgument\n payment: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n }\n 'gatedPurchase(pay,appl,uint64,address)void': {\n payment?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchase(pay,uint64,address)void': {\n payment: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': {\n assetXfer?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchaseAsa(axfer,uint64,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'delist(uint64)void': {\n appId: bigint | number\n }\n 'initBoxedContract(string,uint64)void': {\n version: string\n size: bigint | number\n }\n 'loadBoxedContract(uint64,byte[])void': {\n offset: bigint | number\n data: Uint8Array\n }\n 'deleteBoxedContract()void': Record<string, never>\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'updateAkitaDAOEscrow(uint64)void': {\n app: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,string,uint64,uint64)void': [version: string, childVersion: string, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string, name: string, proof: Uint8Array[]]\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': [prizeBoxTransferTxn: AppMethodCallTransactionArgument, payment: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string]\n 'gatedPurchase(pay,appl,uint64,address)void': [payment: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchase(pay,uint64,address)void': [payment: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchaseAsa(axfer,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'delist(uint64)void': [appId: bigint | number]\n 'initBoxedContract(string,uint64)void': [version: string, size: bigint | number]\n 'loadBoxedContract(uint64,byte[])void': [offset: bigint | number, data: Uint8Array]\n 'deleteBoxedContract()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'updateAkitaDAOEscrow(uint64)void': [app: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type MarketplaceReturns = {\n 'create(string,string,uint64,uint64)void': void\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': bigint\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': bigint\n 'gatedPurchase(pay,appl,uint64,address)void': void\n 'purchase(pay,uint64,address)void': void\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': void\n 'purchaseAsa(axfer,uint64,address)void': void\n 'delist(uint64)void': void\n 'initBoxedContract(string,uint64)void': void\n 'loadBoxedContract(uint64,byte[])void': void\n 'deleteBoxedContract()void': void\n 'optIn(pay,uint64)void': void\n 'optInCost(uint64)uint64': bigint\n 'updateAkitaDAOEscrow(uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the Marketplace smart contract.\n */\nexport type MarketplaceTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,string,uint64,uint64)void' | 'create', {\n argsObj: MarketplaceArgs['obj']['create(string,string,uint64,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']\n returns: MarketplaceReturns['create(string,string,uint64,uint64)void']\n }>\n & Record<'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' | 'list', {\n argsObj: MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n argsTuple: MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n returns: MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n }>\n & Record<'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' | 'listPrizeBox', {\n argsObj: MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n argsTuple: MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n returns: MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n }>\n & Record<'gatedPurchase(pay,appl,uint64,address)void' | 'gatedPurchase', {\n argsObj: MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void']\n }>\n & Record<'purchase(pay,uint64,address)void' | 'purchase', {\n argsObj: MarketplaceArgs['obj']['purchase(pay,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']\n returns: MarketplaceReturns['purchase(pay,uint64,address)void']\n }>\n & Record<'gatedPurchaseAsa(axfer,appl,uint64,address)void' | 'gatedPurchaseAsa', {\n argsObj: MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n }>\n & Record<'purchaseAsa(axfer,uint64,address)void' | 'purchaseAsa', {\n argsObj: MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']\n returns: MarketplaceReturns['purchaseAsa(axfer,uint64,address)void']\n }>\n & Record<'delist(uint64)void' | 'delist', {\n argsObj: MarketplaceArgs['obj']['delist(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['delist(uint64)void']\n returns: MarketplaceReturns['delist(uint64)void']\n }>\n & Record<'initBoxedContract(string,uint64)void' | 'initBoxedContract', {\n argsObj: MarketplaceArgs['obj']['initBoxedContract(string,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']\n returns: MarketplaceReturns['initBoxedContract(string,uint64)void']\n }>\n & Record<'loadBoxedContract(uint64,byte[])void' | 'loadBoxedContract', {\n argsObj: MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void']\n argsTuple: MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']\n returns: MarketplaceReturns['loadBoxedContract(uint64,byte[])void']\n }>\n & Record<'deleteBoxedContract()void' | 'deleteBoxedContract', {\n argsObj: MarketplaceArgs['obj']['deleteBoxedContract()void']\n argsTuple: MarketplaceArgs['tuple']['deleteBoxedContract()void']\n returns: MarketplaceReturns['deleteBoxedContract()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: MarketplaceArgs['obj']['optIn(pay,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['optIn(pay,uint64)void']\n returns: MarketplaceReturns['optIn(pay,uint64)void']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: MarketplaceArgs['obj']['optInCost(uint64)uint64']\n argsTuple: MarketplaceArgs['tuple']['optInCost(uint64)uint64']\n returns: MarketplaceReturns['optInCost(uint64)uint64']\n }>\n & Record<'updateAkitaDAOEscrow(uint64)void' | 'updateAkitaDAOEscrow', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']\n returns: MarketplaceReturns['updateAkitaDAOEscrow(uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: MarketplaceArgs['obj']['update(string)void']\n argsTuple: MarketplaceArgs['tuple']['update(string)void']\n returns: MarketplaceReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: MarketplaceReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: MarketplaceArgs['obj']['opUp()void']\n argsTuple: MarketplaceArgs['tuple']['opUp()void']\n returns: MarketplaceReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the current version of the child contract\n */\n childContractVersion: string\n /**\n * the app ID for the akita DAO escrow to use\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {\n boxedContract: BinaryState\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type MarketplaceSignatures = keyof MarketplaceTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type MarketplaceNonVoidMethodSignatures = keyof MarketplaceTypes['methods'] extends infer T ? T extends keyof MarketplaceTypes['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 Marketplace smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Marketplace smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = MarketplaceTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = MarketplaceTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type MarketplaceCreateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create(string,string,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type MarketplaceUpdateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type MarketplaceDeployParams = 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?: MarketplaceCreateCallParams\n /**\n * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n updateParams?: MarketplaceUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Marketplace smart contract\n */\nexport abstract class MarketplaceParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends MarketplaceCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,string,uint64,uint64)void':\n return MarketplaceParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Marketplace smart contract using the create(string,string,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,string,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends MarketplaceUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return MarketplaceParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the Marketplace smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace, params.args.name, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prizeBoxTransferTxn, params.args.payment, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchase(pay,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchase(pay,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchase(pay,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchase(pay,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchaseAsa(axfer,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchaseAsa(axfer,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchaseAsa(axfer,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the delist(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'delist(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.appId],\n }\n }\n /**\n * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'initBoxedContract(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size],\n }\n }\n /**\n * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'loadBoxedContract(uint64,byte[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data],\n }\n }\n /**\n * Constructs a no op call for the deleteBoxedContract()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteBoxedContract()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.app],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['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 Marketplace smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class MarketplaceFactory {\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 `MarketplaceFactory`\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 MarketplaceClient(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 MarketplaceClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Marketplace 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: MarketplaceDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? MarketplaceParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (MarketplaceCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? MarketplaceParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (MarketplaceUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new MarketplaceClient(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 Marketplace smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(MarketplaceParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(MarketplaceParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(MarketplaceParamsFactory.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 Marketplace smart contract using an ABI method call using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(MarketplaceParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | MarketplaceReturns['create(string,string,uint64,uint64)void']) }, appClient: new MarketplaceClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Marketplace smart contract\n */\nexport class MarketplaceClient {\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 `MarketplaceClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Marketplace app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `MarketplaceClient`\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 MarketplaceNonVoidMethodSignatures>(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 `MarketplaceClient` 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<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `MarketplaceClient` 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<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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 Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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 Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(MarketplaceParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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 Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n list: async (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.list(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n listPrizeBox: async (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.listPrizeBox(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchase: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchase: async (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchase(pay,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n delist: async (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.delist(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['delist(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n initBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.initBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['initBoxedContract(string,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n loadBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.loadBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['loadBoxedContract(uint64,byte[])void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['deleteBoxedContract()void'])}\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAOEscrow(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['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 MarketplaceClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return result.return as unknown as MarketplaceReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Methods to access state for the current Marketplace app\n */\n state = {\n /**\n * Methods to access global state for the current Marketplace app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n childContractVersion: result.childContractVersion,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the childContractVersion key in global state\n */\n childContractVersion: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"childContractVersion\")) as string | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current Marketplace app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n boxedContract: new BinaryStateValue(result.boxedContract),\n }\n },\n /**\n * Get the current value of the boxedContract key in box state\n */\n boxedContract: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.box.getValue(\"boxedContract\")) as Uint8Array | undefined) },\n },\n }\n\n public newGroup(): MarketplaceComposer {\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 list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 method call against the Marketplace contract\n */\n list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.list(params)))\n resultMappers.push((v) => client.decodeReturnValue('list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64', v))\n return this\n },\n /**\n * Add a listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 method call against the Marketplace contract\n */\n listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.listPrizeBox(params)))\n resultMappers.push((v) => client.decodeReturnValue('listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64', v))\n return this\n },\n /**\n * Add a gatedPurchase(pay,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchase(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a purchase(pay,uint64,address)void method call against the Marketplace contract\n */\n purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchase(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a gatedPurchaseAsa(axfer,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchaseAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a purchaseAsa(axfer,uint64,address)void method call against the Marketplace contract\n */\n purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a delist(uint64)void method call against the Marketplace contract\n */\n delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.delist(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a initBoxedContract(string,uint64)void method call against the Marketplace contract\n */\n initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a loadBoxedContract(uint64,byte[])void method call against the Marketplace contract\n */\n loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteBoxedContract()void method call against the Marketplace contract\n */\n deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the Marketplace contract\n */\n optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the Marketplace contract\n */\n optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost(uint64)uint64', v))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow(uint64)void method call against the Marketplace contract\n */\n updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Marketplace contract\n */\n updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['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 Marketplace contract\n */\n opUp(params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n get update() {\n return {\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Marketplace 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 MarketplaceComposer\n }\n}\nexport type MarketplaceComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])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 list(params?: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | undefined]>\n\n /**\n * Calls the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)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 listPrizeBox(params?: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | undefined]>\n\n /**\n * Calls the gatedPurchase(pay,appl,uint64,address)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 gatedPurchase(params?: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchase(pay,uint64,address)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 purchase(params?: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchase(pay,uint64,address)void'] | undefined]>\n\n /**\n * Calls the gatedPurchaseAsa(axfer,appl,uint64,address)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 gatedPurchaseAsa(params?: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchaseAsa(axfer,uint64,address)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 purchaseAsa(params?: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'] | undefined]>\n\n /**\n * Calls the delist(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 delist(params?: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['delist(uint64)void'] | undefined]>\n\n /**\n * Calls the initBoxedContract(string,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n initBoxedContract(params?: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['initBoxedContract(string,uint64)void'] | undefined]>\n\n /**\n * Calls the loadBoxedContract(uint64,byte[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n loadBoxedContract(params?: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['loadBoxedContract(uint64,byte[])void'] | undefined]>\n\n /**\n * Calls the deleteBoxedContract()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteBoxedContract(params?: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['deleteBoxedContract()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['updateAkitaDAOEscrow(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['opUp()void'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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): MarketplaceComposer<[...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): MarketplaceComposer<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<MarketplaceComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<MarketplaceComposerResults<TReturns>>\n}\nexport type MarketplaceComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Listing\",\"structs\":{\"FunderInfo\":[{\"name\":\"account\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"uint64\",\"name\":\"prize\"},{\"type\":\"bool\",\"name\":\"isPrizeBox\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"seller\"},{\"type\":\"(address,uint64)\",\"struct\":\"FunderInfo\",\"name\":\"funder\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"creatorRoyalty\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"desc\":\"create the listing application\",\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"- the payment for purchasing the asset\"},{\"type\":\"address\",\"name\":\"buyer\",\"desc\":\"- the buyer of the asset\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"address\",\"name\":\"buyer\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"address\",\"name\":\"caller\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"desc\":\"Deletes the app and returns the asset/mbr to the seller\",\"events\":[],\"recommendations\":{}},{\"name\":\"changePrice\",\"args\":[{\"type\":\"uint64\",\"name\":\"price\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"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\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":10,\"bytes\":5},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"prize\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpemU=\",\"desc\":\"the asset for sale: Asset | Application ( Prize Box )\"},\"isPrizeBox\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"aXNfcHJpemVfYm94\",\"desc\":\"whether or not the prize is an asset or a prize box\"},\"price\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpY2U=\",\"desc\":\"the price of the asset\"},\"paymentAsset\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cGF5bWVudF9hc3NldA==\",\"desc\":\"the asset to use for payment\"},\"expiration\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZXhwaXJhdGlvbg==\",\"desc\":\"the timestamp the listing expires on, once this passes all that can be done is delist\"},\"seller\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"c2VsbGVy\",\"desc\":\"the address selling the asset\"},\"reservedFor\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"cmVzZXJ2ZWRfZm9y\",\"desc\":\"the address the sale is reserved for\"},\"creatorRoyalty\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Y3JlYXRvcl9yb3lhbHR5\",\"desc\":\"the amount the creator will get for the sale\"},\"gateID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9pZA==\",\"desc\":\"the gate ID to use to check if the user is qualified to buy\"},\"marketplace\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"bWFya2V0cGxhY2U=\",\"desc\":\"The address of the marketplace that listed the asset to send the fee to\\n\\nIMPORTANT: this is a double sided marketplace fee contract\\nthe marketplace referred to internally in the contract\\nis the listing side marketplace.\\nthe buyer side marketplace provides their address at\\nthe time of purchase\"},\"marketplaceRoyalties\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWFya2V0cGxhY2Vfcm95YWx0aWVz\",\"desc\":\"the amount the marketplaces will get for the sale\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"},\"funder\":{\"keyType\":\"AVMString\",\"valueType\":\"FunderInfo\",\"key\":\"ZnVuZGVy\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[425,584,712,2483],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[320],\"errorMessage\":\"Close out of algo forbidden\"},{\"pc\":[1288,2352],\"errorMessage\":\"Invalid payment\"},{\"pc\":[791,2389,2520,2550],\"errorMessage\":\"Invalid percentage\"},{\"pc\":[1591],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[284,296],\"errorMessage\":\"OnCompletion must be DeleteApplication && can only call when not creating\"},{\"pc\":[211],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[2306],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2702,2718],\"errorMessage\":\"account opted into asset\"},{\"pc\":[361,448,469,482,493,611,1331,1637,2304],\"errorMessage\":\"application exists\"},{\"pc\":[1439,1459,1673,1688,1991],\"errorMessage\":\"asset exists\"},{\"pc\":[1162,1218,1225,1233,1246,1257,1285,1298,1314,1328,1353,1384,1397,1426,1471,1530,1536,1544,1557,1568,1588,1601,1617,1621,1634,1641,1659,1670,1677,1696,1714,1718,1731,1740,1757,1777,1795,1799,1811,1815,1844,1848,1852,1891,1895,1934,1938,1943,1982,1986,2054,2060,2066,2073,2080,2085,2093,2097,2182,2190,2194,2268,2291,2384,2404,2419,2437,2545,2567,2628,2636,2663,2692],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[1090],\"errorMessage\":\"invalid expiration\"},{\"pc\":[722],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[1029],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[971],\"errorMessage\":\"invalid number of bytes for (uint8[32],uint64)\"},{\"pc\":[917],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[430,589,908,927,936,945,990,1001,1042,1053,2261,2284,2329,2488],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[960,982,1015,1199,1208,1511,1520,2038],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[1241,1552],\"errorMessage\":\"listing expired\"},{\"pc\":[1059,1214,1526,2044],\"errorMessage\":\"must be called from the factory\"},{\"pc\":[2270],\"errorMessage\":\"must be the seller\"},{\"pc\":[2056],\"errorMessage\":\"only the seller can delist\"},{\"pc\":[1220],\"errorMessage\":\"payment asset must be algo\"},{\"pc\":[1531],\"errorMessage\":\"payment asset must not be algo\"},{\"pc\":[1261,1572],\"errorMessage\":\"reserved for different address\"},{\"pc\":[1502],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[1190,2321],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMDAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIGJ5dGVjYmxvY2sgInBheW1lbnRfYXNzZXQiICJzZWxsZXIiICJha2l0YV9kYW8iICJwcml6ZSIgMHgwMDAxICJpc19wcml6ZV9ib3giICJwcmljZSIgImV4cGlyYXRpb24iICJyZXNlcnZlZF9mb3IiICJtYXJrZXRwbGFjZSIgMHgxNTFmN2M3NSAiY3JlYXRvcl9yb3lhbHR5IiAiYWtpdGFfZXNjcm93IiAibWFya2V0cGxhY2Vfcm95YWx0aWVzIiAweGFkZjkyYWU0ICJuZnRfZmVlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTgtMjIKICAgIC8vIGV4cG9ydCBjbGFzcyBMaXN0aW5nIGV4dGVuZHMgY2xhc3NlcygKICAgIC8vICAgQWtpdGFCYXNlQ29udHJhY3QsCiAgICAvLyAgIENvbnRyYWN0V2l0aENyZWF0b3JPbmx5T3B0SW4sCiAgICAvLyAgIENoaWxkQ29udHJhY3QKICAgIC8vICkgewogICAgcHVzaGJ5dGVzcyAweDZhMTYzOTNkIDB4NjhlODYzNDMgLy8gbWV0aG9kICJwdXJjaGFzZShwYXksYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImRlbGlzdChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3B1cmNoYXNlX3JvdXRlQDQgbWFpbl9kZWxpc3Rfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4LTIyCiAgICAvLyBleHBvcnQgY2xhc3MgTGlzdGluZyBleHRlbmRzIGNsYXNzZXMoCiAgICAvLyAgIEFraXRhQmFzZUNvbnRyYWN0LAogICAgLy8gICBDb250cmFjdFdpdGhDcmVhdG9yT25seU9wdEluLAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNAogICAgcHVzaGJ5dGVzcyAweDE3MWM5Zjg4IDB4MTkzOTZjNGEgMHgzM2U5MmM5NCAweDg1NGRlZGUwIDB4M2VhMTE4MzIgLy8gbWV0aG9kICJwdXJjaGFzZUFzYShheGZlcixhZGRyZXNzLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiY2hhbmdlUHJpY2UodWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJvcHRpbihwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBwdXJjaGFzZUFzYSBjaGFuZ2VQcmljZSB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVAMTEgb3B0aW4KICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4LTIyCiAgICAvLyBleHBvcnQgY2xhc3MgTGlzdGluZyBleHRlbmRzIGNsYXNzZXMoCiAgICAvLyAgIEFraXRhQmFzZUNvbnRyYWN0LAogICAgLy8gICBDb250cmFjdFdpdGhDcmVhdG9yT25seU9wdEluLAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHB1c2hieXRlcyAweGQ2ZjExZWE1IC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsKGFkZHJlc3MsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fZGVsaXN0X3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxNAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgRGVsZXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBkZWxpc3QKCm1haW5fcHVyY2hhc2Vfcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQ0CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIHB1cmNoYXNlCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Y3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChha2l0YURBTzogdWludDY0LCBhc3NldDogdWludDY0LCB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwgZXhwaXJhdGlvbjogdWludDY0LCBhbGxvY2F0aW9uczogYnl0ZXMsIHN1bTogdWludDY0LCBjbG9zZU91dDogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUxOAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBhc3NldDogdWludDY0LCB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwgZXhwaXJhdGlvbjogdWludDY0LCBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSwgc3VtOiB1aW50NjQsIGNsb3NlT3V0OiBib29sZWFuKTogeyBpZDogdWludDY0LCBjb3N0OiB1aW50NjQgfSB7CiAgICBwcm90byA3IDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTE5CiAgICAvLyBhc3NlcnQoYXNzZXQgIT09IDAgfHwgY2xvc2VPdXQgPT09IGZhbHNlLCBFUlJfQ0FOTk9UX0NMT1NFX09VVF9PRl9BTEdPX0ZPUkJJRERFTikKICAgIGZyYW1lX2RpZyAtNgogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF90cnVlQDIKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9mYWxzZUAzCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUAyOgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTkKICAgIC8vIGFzc2VydChhc3NldCAhPT0gMCB8fCBjbG9zZU91dCA9PT0gZmFsc2UsIEVSUl9DQU5OT1RfQ0xPU0VfT1VUX09GX0FMR09fRk9SQklEREVOKQogICAgYXNzZXJ0IC8vIENsb3NlIG91dCBvZiBhbGdvIGZvcmJpZGRlbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgZnJhbWVfZGlnIC03CiAgICBwdXNoYnl0ZXMgImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTIwCiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5yZXdhcmRzCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjMKICAgIC8vIGxldCBjb3N0OiB1aW50NjQgPSBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMjUzMDAgLy8gMjUzMDAKICAgICoKICAgIHB1c2hpbnQgMzUzMDAgLy8gMzUzMDAKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjQKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC02CiAgICBibnogY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI5CiAgICAvLyByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTMwCiAgICAvLyBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjgtNTMxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyNS01MzYKICAgIC8vIGlkID0gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICBhbGxvY2F0aW9ucwogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMgogICAgLy8gdGltZVRvVW5sb2NrLAogICAgZnJhbWVfZGlnIC01CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMwogICAgLy8gZXhwaXJhdGlvbiwKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDdiN2RjNWZjIC8vIG1ldGhvZCAiY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChwYXksdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzcKICAgIC8vIHJldHVybiB7IGlkLCBjb3N0IH0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTM4CiAgICAvLyBpZiAoIUFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2lmX2JvZHlAOQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU1MgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTgKICAgIC8vIGlmIChjbG9zZU91dCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTU5CiAgICAvLyB0cmFuc2ZlclR4bi5zZXQoeyBhc3NldENsb3NlVG86IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MgfSkKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDUKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NgogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NS01NjgKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTY5CiAgICAvLyB0cmFuc2ZlclR4biwKICAgIGl0eG5fbmV4dAogICAgZnJhbWVfZGlnIDQKICAgIGJ6IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfbmV4dF9maWVsZEAxNwogICAgZnJhbWVfZGlnIDUKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X25leHRfZmllbGRAMTc6CiAgICBmcmFtZV9kaWcgLTYKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTUyLTU1NgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogc3VtLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NjItNTc0CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdHJhbnNmZXJUeG4sCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzAKICAgIC8vIHRpbWVUb1VubG9jaywKICAgIGZyYW1lX2RpZyAtNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzEKICAgIC8vIGV4cGlyYXRpb24sCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhhZjFhMTRmMiAvLyBtZXRob2QgImNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQocGF5LGF4ZmVyLHVpbnQ2NCx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBnaXR4biAyIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMAoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9pZl9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzOQogICAgLy8gY29zdCArPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAxCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NDAtNTQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NAogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NQogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQzLTU0NgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQwLTU0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NwogICAgLy8gQXNzZXQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQwLTU0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4Mzk0ZWFlYjIgLy8gbWV0aG9kICJvcHRJbihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c2VuZFJlZmVycmFsUGF5bWVudChha2l0YURBTzogdWludDY0LCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnNlbmRSZWZlcnJhbFBheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5MQogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNlbmRSZWZlcnJhbFBheW1lbnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IFJlZmVycmFsUGF5bWVudEluZm8gewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTIKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTywgVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4M2MxYTZmMzMgLy8gbWV0aG9kICJnZXQoYWRkcmVzcylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4W10pCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MQogICAgLy8gaWYgKEJ5dGVzKGRhdGEpLmxlbmd0aCA9PT0gMCB8fCBCeXRlcyhkYXRhKS5sZW5ndGggIT09IDgpIHsKICAgIGxlbgogICAgZHVwCiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzIgLy8gOAogICAgIT0KICAgIGJ6IHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAxMgoKc2VuZFJlZmVycmFsUGF5bWVudF9pZl9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTIKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2MQogICAgLy8gcmV0dXJuIHJlZmVycmVyT3Iod2FsbGV0SUQsIEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE1NAogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMwogICAgYm56IHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJlZmVycmVyT3JAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5NgogICAgLy8gaWYgKGFtb3VudCA+IDAgJiYgcmVmZXJyZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjY4CiAgICAvLyBjb25zdCBbd2FsbGV0RmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldEZlZXMpKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgIndhbGxldF9mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTgKICAgIC8vIGNvbnN0IHsgcmVmZXJyZXJQZXJjZW50YWdlIH0gPSBnZXRXYWxsZXRGZWVzKGFraXRhREFPKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDEKICAgIC8vIGlmIChyZWZlcnJhbEZlZSA9PT0gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDUKICAgIGZyYW1lX2RpZyAtMQogICAgYnogc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjAyCiAgICAvLyByZWZlcnJhbEZlZSA9IDEKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDIKCnNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDgKICAgIC8vIEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwOQogICAgLy8gKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfV0VFSyksCiAgICBkdXAKICAgIHB1c2hpbnQgNjA0ODAwIC8vIDYwNDgwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MTAKICAgIC8vIFt7IGFkZHJlc3M6IHJlZmVycmVyLCBhbW91bnQ6IHJlZmVycmFsRmVlIH1dLAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDUtNjEzCiAgICAvLyBjb25zdCB7IGNvc3Q6IHJlZmVycmFsTWJyIH0gPSBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICBha2l0YURBTywKICAgIC8vICAgYXNzZXQsCiAgICAvLyAgIEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgT05FX1dFRUspLAogICAgLy8gICBbeyBhZGRyZXNzOiByZWZlcnJlciwgYW1vdW50OiByZWZlcnJhbEZlZSB9XSwKICAgIC8vICAgcmVmZXJyYWxGZWUsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgZGlnIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjEyCiAgICAvLyBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA1LTYxMwogICAgLy8gY29uc3QgeyBjb3N0OiByZWZlcnJhbE1iciB9ID0gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgYWtpdGFEQU8sCiAgICAvLyAgIGFzc2V0LAogICAgLy8gICBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCArIE9ORV9XRUVLKSwKICAgIC8vICAgW3sgYWRkcmVzczogcmVmZXJyZXIsIGFtb3VudDogcmVmZXJyYWxGZWUgfV0sCiAgICAvLyAgIHJlZmVycmFsRmVlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3AKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxNQogICAgLy8gcmV0dXJuIHsgbGVmdG92ZXI6IChhbW91bnQgLSByZWZlcnJhbEZlZSksIHJlZmVycmFsTWJyIH0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjE4CiAgICAvLyByZXR1cm4geyBsZWZ0b3ZlcjogYW1vdW50LCByZWZlcnJhbE1icjogMCB9CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3My0xNzYKICAgIC8vIGNvbnN0IFtyZWZlcnJlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzUKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgcHVzaGJ5dGVzICJyZWZlcnJlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTczLTE3NgogICAgLy8gY29uc3QgW3JlZmVycmVyQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlcikKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjEKICAgIC8vIHJldHVybiByZWZlcnJlck9yKHdhbGxldElELCBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBiIHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWZlcnJlck9yQDE4CgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5NQogICAgLy8gcmV0dXJuIGJ0b2koZGF0YSkKICAgIGZyYW1lX2RpZyA0CiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgyCiAgICAvLyByZXR1cm4gQXBwbGljYXRpb24oZ2V0V2FsbGV0SUQoZXNjcm93RmFjdG9yeSwgYWRkcmVzcykpCiAgICBiIHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOTQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCA0MCAvLyA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ4WzMyXSx1aW50NjQpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZHVwCiAgICBjb3ZlciA2CiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgY292ZXIgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzExCiAgICAvLyBhc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgIT09IDAsIEVSUl9NVVNUX0JFX0NBTExFRF9GUk9NX0ZBQ1RPUlkpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGZhY3RvcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTMKICAgIC8vIHRoaXMucHJpemUudmFsdWUgPSBwcml6ZQogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOQogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy5pc1ByaXplQm94LnZhbHVlID0gaXNQcml6ZUJveAogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMQogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNQogICAgLy8gdGhpcy5wcmljZS52YWx1ZSA9IHByaWNlCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE2CiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSA9IEFzc2V0KHBheW1lbnRBc3NldCkKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE3CiAgICAvLyBhc3NlcnQoZXhwaXJhdGlvbiA9PT0gMCB8fCBleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0lOVkFMSURfRVhQSVJBVElPTikKICAgIGJ6IGNyZWF0ZV9ib29sX3RydWVAMwogICAgZGlnIDkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJ6IGNyZWF0ZV9ib29sX2ZhbHNlQDQKCmNyZWF0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpjcmVhdGVfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTcKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID09PSAwIHx8IGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfSU5WQUxJRF9FWFBJUkFUSU9OKQogICAgYXNzZXJ0IC8vIGludmFsaWQgZXhwaXJhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNQogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxOAogICAgLy8gdGhpcy5leHBpcmF0aW9uLnZhbHVlID0gZXhwaXJhdGlvbgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTkKICAgIC8vIHRoaXMuc2VsbGVyLnZhbHVlID0gc2VsbGVyCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9jaGlsZC50czoxMQogICAgLy8gZnVuZGVyID0gR2xvYmFsU3RhdGU8RnVuZGVySW5mbz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5RnVuZGVyIH0pCiAgICBwdXNoYnl0ZXMgImZ1bmRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIwCiAgICAvLyB0aGlzLmZ1bmRlci52YWx1ZSA9IGNsb25lKGZ1bmRlcikKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOQogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIxCiAgICAvLyB0aGlzLnJlc2VydmVkRm9yLnZhbHVlID0gcmVzZXJ2ZWRGb3IKICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MQogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIyCiAgICAvLyB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlID0gY3JlYXRvclJveWFsdHkKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBwdXNoYnl0ZXMgImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyMwogICAgLy8gdGhpcy5nYXRlSUQudmFsdWUgPSBnYXRlSUQKICAgIGRpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NAogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjQKICAgIC8vIHRoaXMubWFya2V0cGxhY2UudmFsdWUgPSBtYXJrZXRwbGFjZQogICAgZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjUKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyNgogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTgKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzI3CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gYWtpdGFEQU9Fc2Nyb3cKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMzAKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMwCiAgICAvLyB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKS5tYXJrZXRwbGFjZUNvbXBvc2FibGVQZXJjZW50YWdlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo5MwogICAgLy8gY29uc3QgW25mdEZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNORlRGZWVzKSkKICAgIGJ5dGVjIDE1IC8vICJuZnRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMwCiAgICAvLyB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKS5tYXJrZXRwbGFjZUNvbXBvc2FibGVQZXJjZW50YWdlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NgogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTMgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMwCiAgICAvLyB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKS5tYXJrZXRwbGFjZUNvbXBvc2FibGVQZXJjZW50YWdlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOTQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjcmVhdGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcucHVyY2hhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0NAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgRVJSX01VU1RfQkVfQ0FMTEVEX0ZST01fRkFDVE9SWSkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBmYWN0b3J5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MQogICAgLy8gYXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MQogICAgLy8gYXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHBheW1lbnQgYXNzZXQgbXVzdCBiZSBhbGdvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MgogICAgLy8gYXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTIKICAgIC8vIGFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBwdXJjaGFzZV9ib29sX3RydWVAMwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTIKICAgIC8vIGFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBwdXJjaGFzZV9ib29sX2ZhbHNlQDQKCnB1cmNoYXNlX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCnB1cmNoYXNlX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUyCiAgICAvLyBhc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBhc3NlcnQgLy8gbGlzdGluZyBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gaWYgKHRoaXMucmVzZXJ2ZWRGb3IudmFsdWUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkKICAgIC8vIHJlc2VydmVkRm9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVJlc2VydmVkRm9yIH0pCiAgICBieXRlYyA4IC8vICJyZXNlcnZlZF9mb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gaWYgKHRoaXMucmVzZXJ2ZWRGb3IudmFsdWUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTUKICAgIC8vIGFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5CiAgICAvLyByZXNlcnZlZEZvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlSZXNlcnZlZEZvciB9KQogICAgYnl0ZWMgOCAvLyAicmVzZXJ2ZWRfZm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTUKICAgIC8vIGFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyByZXNlcnZlZCBmb3IgZGlmZmVyZW50IGFkZHJlc3MKCnB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzU4LTM2NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnByaWNlLnZhbHVlLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgMgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYxCiAgICAvLyBzZW5kZXI6IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTgtMzY2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYyCiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTgtMzY2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2MwogICAgLy8gYW1vdW50OiB0aGlzLnByaWNlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzEKICAgIC8vIHByaWNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpY2UgfSkKICAgIGJ5dGVjIDYgLy8gInByaWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjMKICAgIC8vIGFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1OC0zNjYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2OAogICAgLy8gdGhpcy50cmFuc2ZlclB1cmNoYXNlVG9CdXllcihidXllcikKICAgIGRpZyAxCiAgICBjYWxsc3ViIHRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEyNAogICAgLy8gY29uc3QgYW1vdW50cyA9IHRoaXMuZ2V0QW1vdW50cyh0aGlzLnByaWNlLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzEKICAgIC8vIHByaWNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpY2UgfSkKICAgIGJ5dGVjIDYgLy8gInByaWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjQKICAgIC8vIGNvbnN0IGFtb3VudHMgPSB0aGlzLmdldEFtb3VudHModGhpcy5wcmljZS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIGdldEFtb3VudHMKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEyNwogICAgLy8gbGV0IGxlZnRvdmVyOiB1aW50NjQgPSBhbW91bnRzLmFraXRhCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjgKICAgIC8vIGlmIChhbW91bnRzLmFraXRhID4gMCkgewogICAgYnogcHVyY2hhc2VfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjkKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGFtb3VudHMuYWtpdGEpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjkKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGFtb3VudHMuYWtpdGEpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc2VuZFJlZmVycmFsUGF5bWVudAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CgpwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzItMTM3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1OAogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUFraXRhREFPRXNjcm93IH0pCiAgICBieXRlYyAxMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTMyLTEzNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzItMTM3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQwLTE0NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQyCiAgICAvLyBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICBkaWcgMwogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQzCiAgICAvLyByZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU0CiAgICAvLyBtYXJrZXRwbGFjZSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZSB9KQogICAgYnl0ZWMgOSAvLyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MwogICAgLy8gcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDAtMTQ0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MC0xNDUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDgtMTUzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IG1hcmtldHBsYWNlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDgtMTUyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IG1hcmtldHBsYWNlLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDgtMTUzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IG1hcmtldHBsYWNlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1NgogICAgLy8gaWYgKHRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjkKICAgIC8vIGlzUHJpemVCb3ggPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5SXNQcml6ZUJveCB9KQogICAgYnl0ZWMgNSAvLyAiaXNfcHJpemVfYm94IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTYKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBwdXJjaGFzZV9lbHNlX2JvZHlAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU3LTE2MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTkKICAgIC8vIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICBkaWcgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTYwCiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjAKICAgIC8vIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTctMTYxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU3LTE2MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3MC0zNzIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3MQogICAgLy8gLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3MC0zNzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcwLTM3MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0NAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHVyY2hhc2VfZWxzZV9ib2R5QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGFzc2V0UHJpemUgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGFzc2V0UHJpemUgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTY3LTE3MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE2OQogICAgLy8gYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTcwCiAgICAvLyByZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgZGlnIDEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjctMTcxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICByZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjctMTcyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICByZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NS0xODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NwogICAgLy8gYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIHN3YXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3OAogICAgLy8gbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgc3dhcAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAiIFNvbGQiCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTc5CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzkKICAgIC8vIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NS0xODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTc1LTE4MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICBub3RlOiBTdHJpbmcoYXNzZXRQcml6ZS5uYW1lKSArICcgU29sZCcsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMTMKCnB1cmNoYXNlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIHB1cmNoYXNlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcucHVyY2hhc2VBc2Fbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZUFzYToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4MwogICAgLy8gQGFiaW1ldGhvZCh7IE9uQ29tcGxldGVBY3Rpb246ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTVVTVF9CRV9DQUxMRURfRlJPTV9GQUNUT1JZKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGZhY3RvcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkwCiAgICAvLyBhc3NlcnQodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgIT09IDAsIEVSUl9QQVlNRU5UX0FTU0VUX01VU1RfTk9UX0JFX0FMR08pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MAogICAgLy8gYXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkICE9PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX05PVF9CRV9BTEdPKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2VydCAvLyBwYXltZW50IGFzc2V0IG11c3Qgbm90IGJlIGFsZ28KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkxCiAgICAvLyBhc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNQogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MQogICAgLy8gYXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IHB1cmNoYXNlQXNhX2Jvb2xfdHJ1ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNQogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MQogICAgLy8gYXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJ6IHB1cmNoYXNlQXNhX2Jvb2xfZmFsc2VANAoKcHVyY2hhc2VBc2FfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQoKcHVyY2hhc2VBc2FfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTEKICAgIC8vIGFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFzc2VydCAvLyBsaXN0aW5nIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkzCiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOQogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkzCiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5NAogICAgLy8gYXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkKICAgIC8vIHJlc2VydmVkRm9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVJlc2VydmVkRm9yIH0pCiAgICBieXRlYyA4IC8vICJyZXNlcnZlZF9mb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5NAogICAgLy8gYXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlc2VydmVkIGZvciBkaWZmZXJlbnQgYWRkcmVzcwoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTctNDA0CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICBkaWcgMgogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQwMAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTctNDA0CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxCiAgICAvLyBwcmljZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaWNlIH0pCiAgICBieXRlYyA2IC8vICJwcmljZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5Ny00MDQKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDA2CiAgICAvLyB0aGlzLnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTg3CiAgICAvLyBjb25zdCBhbW91bnRzID0gdGhpcy5nZXRBbW91bnRzKHRoaXMucHJpY2UudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMQogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4NwogICAgLy8gY29uc3QgYW1vdW50cyA9IHRoaXMuZ2V0QW1vdW50cyh0aGlzLnByaWNlLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgZ2V0QW1vdW50cwogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTkwCiAgICAvLyBsZXQgbGVmdG92ZXI6IHVpbnQ2NCA9IGFtb3VudHMuYWtpdGEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MQogICAgLy8gaWYgKGFtb3VudHMuYWtpdGEgPiAwKSB7CiAgICBieiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MgogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTIKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLCBhbW91bnRzLmFraXRhKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MgogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kUmVmZXJyYWxQYXltZW50CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKCnB1cmNoYXNlQXNhX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NS0yMDEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NwogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTgKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk3CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTkKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5OQogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NS0yMDAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk1LTIwMQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNAogICAgLy8gaWYgKCF0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI5CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA0CiAgICAvLyBpZiAoIXRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNwogICAgLy8gcHJpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcml6ZSB9KQogICAgYnl0ZWNfMyAvLyAicHJpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA3CiAgICAvLyBpZiAoYXNzZXRQcml6ZS5jcmVhdG9yLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNwogICAgLy8gaWYgKGFzc2V0UHJpemUuY3JlYXRvci5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMDgtMjE0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjEwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTEKICAgIC8vIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxMgogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjEyCiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA4LTIxMwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA4LTIxNAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI5CiAgICAvLyBpZiAodGhpcy5tYXJrZXRwbGFjZS52YWx1ZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NAogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjkKICAgIC8vIGlmICh0aGlzLm1hcmtldHBsYWNlLnZhbHVlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyOQogICAgLy8gaWYgKHRoaXMubWFya2V0cGxhY2UudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMwLTIzNgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMyCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTQKICAgIC8vIG1hcmtldHBsYWNlID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlIH0pCiAgICBieXRlYyA5IC8vICJtYXJrZXRwbGFjZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMyCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMzCiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzQKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzNAogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzMC0yMzUKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMwLTIzNgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTAKICAgIC8vIGlmIChtYXJrZXRwbGFjZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1MAogICAgLy8gaWYgKG1hcmtldHBsYWNlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTEtMjU3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjU0CiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyAzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1NQogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUxLTI1NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUxLTI1NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcyLTI3NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc0CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc0CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc1CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3Mi0yNzYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcyLTI3NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDgtNDEwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDkKICAgIC8vIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDgtNDA5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQwOC00MTAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODMKICAgIC8vIEBhYmltZXRob2QoeyBPbkNvbXBsZXRlQWN0aW9uOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgxCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgxCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4NAogICAgLy8gW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODQKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMuc2VsbGVyLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMuc2VsbGVyIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzktMjg3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgyCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgzCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3OS0yODcKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLnNlbGxlci52YWx1ZSwgYW1vdW50OiBhbW91bnRzLnNlbGxlciB9XSwKICAgIC8vICAgYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODYKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzktMjg3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMwoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNjAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNjQKICAgIC8vIFt7IGFkZHJlc3M6IG1hcmtldHBsYWNlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICBkaWcgNQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTktMjY3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MgogICAgLy8gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MwogICAgLy8gTUFYX1VJTlQ2NCwKICAgIGludGMgNSAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTktMjY3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2NgogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1OS0yNjcKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBtYXJrZXRwbGFjZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMAoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzkKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDMKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU0CiAgICAvLyBtYXJrZXRwbGFjZSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZSB9KQogICAgYnl0ZWMgOSAvLyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MwogICAgLy8gW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzgtMjQ2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQxCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQyCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOC0yNDYKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICAvLyAgIGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDUKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzgtMjQ2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNwoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTcKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjEKICAgIC8vIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICB1bmNvdmVyIDIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNi0yMjQKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTkKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjAKICAgIC8vIE1BWF9VSU5UNjQsCiAgICBpbnRjIDUgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjE2LTIyNAogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICAvLyAgIGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyMwogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNi0yMjQKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICBjYWxsc3ViIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQKICAgIHBvcG4gMgogICAgYiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE0CgpwdXJjaGFzZUFzYV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwdXJjaGFzZUFzYV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmRlbGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGlzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE0CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxNgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgRVJSX01VU1RfQkVfQ0FMTEVEX0ZST01fRkFDVE9SWSkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBmYWN0b3J5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxNwogICAgLy8gYXNzZXJ0KHRoaXMuc2VsbGVyLnZhbHVlID09PSBjYWxsZXIsIEVSUl9PTkxZX1NFTExFUl9DQU5fREVMSVNUKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE3CiAgICAvLyBhc3NlcnQodGhpcy5zZWxsZXIudmFsdWUgPT09IGNhbGxlciwgRVJSX09OTFlfU0VMTEVSX0NBTl9ERUxJU1QpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIHNlbGxlciBjYW4gZGVsaXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyMQogICAgLy8geGZlckFzc2V0OiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjEKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyNQogICAgLy8gY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyOAogICAgLy8gaWYgKCEodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgPT09IDApKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyOAogICAgLy8gaWYgKCEodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgPT09IDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVsaXN0X2Vsc2VfYm9keUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzEKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzEKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzIKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzMgogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzNQogICAgLy8gaWYgKHRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjkKICAgIC8vIGlzUHJpemVCb3ggPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5SXNQcml6ZUJveCB9KQogICAgYnl0ZWMgNSAvLyAiaXNfcHJpemVfYm94IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzUKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBkZWxpc3RfZWxzZV9ib2R5QDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM2LTQzOQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM3CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM3CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOAogICAgLy8gYXJnczogW3RoaXMuc2VsbGVyLnZhbHVlXSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5U2VsbGVyIH0pCiAgICBieXRlY18xIC8vICJzZWxsZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOAogICAgLy8gYXJnczogW3RoaXMuc2VsbGVyLnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzNi00MzkKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oewogICAgLy8gICBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMuc2VsbGVyLnZhbHVlXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNCAvLyBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDAKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMwLTQzMwogICAgLy8gY29uc3QgcGF5bWVudEFzc2V0VHJhbnNmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQtNDI2CiAgICAvLyBjb25zdCBwYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9zdWJtaXQKCmRlbGlzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTQKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmRlbGlzdF9lbHNlX2JvZHlANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQyCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9iZWdpbgogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE5LTQyMgogICAgLy8gY29uc3QgYXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fbmV4dAogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzMC00MzMKICAgIC8vIGNvbnN0IHBheW1lbnRBc3NldFRyYW5zZmVyID0gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fbmV4dAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI0LTQyNgogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGRlbGlzdF9hZnRlcl9pZl9lbHNlQDIwCgpkZWxpc3RfZWxzZV9ib2R5QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDUKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI5CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ1CiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVsaXN0X2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDYtNDQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDcKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDcKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ4CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ4CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ2LTQ0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MAogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI0LTQyNgogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MAogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgZGVsaXN0X2FmdGVyX2lmX2Vsc2VAMjAKCmRlbGlzdF9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE5LTQyMgogICAgLy8gY29uc3QgYXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQtNDI2CiAgICAvLyBjb25zdCBwYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDUyCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkZWxpc3RfYWZ0ZXJfaWZfZWxzZUAyMAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcuY2hhbmdlUHJpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgpjaGFuZ2VQcmljZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDU3CiAgICAvLyBjaGFuZ2VQcmljZShwcmljZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NTgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLnNlbGxlci52YWx1ZSwgRVJSX01VU1RfQkVfU0VMTEVSKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDU4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5zZWxsZXIudmFsdWUsIEVSUl9NVVNUX0JFX1NFTExFUikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG11c3QgYmUgdGhlIHNlbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMQogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1OQogICAgLy8gdGhpcy5wcmljZS52YWx1ZSA9IHByaWNlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NTcKICAgIC8vIGNoYW5nZVByaWNlKHByaWNlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo6Q29udHJhY3RXaXRoQ3JlYXRvck9ubHlPcHRJbi5vcHRpbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdGluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUzCiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo1NAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjU2LTYzCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTkKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTYtNjMKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgdW5jb3ZlciAyCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo2MAogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo1Ni02MwogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjY1LTY5CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NjYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NjcKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjY1LTY5CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUzCiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmdldEFtb3VudHMoYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRBbW91bnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MgogICAgLy8gcHJpdmF0ZSBnZXRBbW91bnRzKGFtb3VudDogdWludDY0KTogUm95YWx0eUFtb3VudHMgewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MwogICAgLy8gbGV0IGNyZWF0b3JBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MQogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjMKICAgIC8vIGxldCBjcmVhdG9yQW1vdW50ID0gY2FsY1BlcmNlbnQoYW1vdW50LCB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGVyY2VudGFnZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBmcmFtZV9kaWcgLTEKICAgIG11bHcKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIGRpdncKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2NAogICAgLy8gaWYgKGNyZWF0b3JBbW91bnQgPT09IDAgJiYgdGhpcy5jcmVhdG9yUm95YWx0eS52YWx1ZSA+IDAgJiYgYW1vdW50ID4gMCkgewogICAgYm56IGdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MQogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjQKICAgIC8vIGlmIChjcmVhdG9yQW1vdW50ID09PSAwICYmIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANAogICAgZnJhbWVfZGlnIC0xCiAgICBieiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2NQogICAgLy8gY3JlYXRvckFtb3VudCA9IDEKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDUKCmdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2OAogICAgLy8gY29uc3QgeyBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWluOiBtaW4sIG1hcmtldHBsYWNlU2FsZVBlcmNlbnRhZ2VNYXg6IG1heCB9ID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2OAogICAgLy8gY29uc3QgeyBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWluOiBtaW4sIG1hcmtldHBsYWNlU2FsZVBlcmNlbnRhZ2VNYXg6IG1heCB9ID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OTMKICAgIC8vIGNvbnN0IFtuZnRGZWVzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzTkZURmVlcykpCiAgICBkdXAKICAgIGJ5dGVjIDE1IC8vICJuZnRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjgKICAgIC8vIGNvbnN0IHsgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1pbjogbWluLCBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWF4OiBtYXggfSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjY5CiAgICAvLyBjb25zdCBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuc2VsbGVyLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjkKICAgIC8vIGNvbnN0IGltcGFjdCA9IGdldFVzZXJJbXBhY3QodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5zZWxsZXIudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ5CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhU29jaWFsQXBwTGlzdCkpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgInNhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM3CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhkNTc0YmIxMCAvLyBtZXRob2QgImdldFVzZXJJbXBhY3QoYWRkcmVzcyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDEwIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMQogICAgLy8gY29uc3QgbWluSW1wYWN0OiB1aW50NjQgPSAoaW1wYWN0ID4gMSkgPyBpbXBhY3QgLSAxIDogMQogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGdldEFtb3VudHNfdGVybmFyeV9mYWxzZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtCgpnZXRBbW91bnRzX3Rlcm5hcnlfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMgogICAgLy8gcmV0dXJuIG1heCAtICgoKG1heCAtIG1pbikgKiBtaW5JbXBhY3QpIC8gSU1QQUNUX0RJVklTT1IpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgNAogICAgLQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgLwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDgKICAgIC8vIGFzc2VydChwIDw9IERJVklTT1IsIEVSUl9JTlZBTElEX1BFUkNFTlRBR0UpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwZXJjZW50YWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzMKICAgIC8vIGlmIChha2l0YUFtb3VudCA9PT0gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzQKICAgIC8vIGFraXRhQW1vdW50ID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAoKZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjc3CiAgICAvLyBsZXQgbWFya2V0cGxhY2VBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NgogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTMgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzcKICAgIC8vIGxldCBtYXJrZXRwbGFjZUFtb3VudCA9IGNhbGNQZXJjZW50KGFtb3VudCwgdGhpcy5tYXJrZXRwbGFjZVJveWFsdGllcy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo3OAogICAgLy8gaWYgKG1hcmtldHBsYWNlQW1vdW50ID09PSAwICYmIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGJueiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU2CiAgICAvLyBtYXJrZXRwbGFjZVJveWFsdGllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlUm95YWx0aWVzIH0pCiAgICBieXRlYyAxMyAvLyAibWFya2V0cGxhY2Vfcm95YWx0aWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo3OAogICAgLy8gaWYgKG1hcmtldHBsYWNlQW1vdW50ID09PSAwICYmIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjc5CiAgICAvLyBtYXJrZXRwbGFjZUFtb3VudCA9IDEKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDIKCmdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6ODIKICAgIC8vIGNvbnN0IHNlbGxlckFtb3VudDogdWludDY0ID0gYW1vdW50IC0gKGNyZWF0b3JBbW91bnQgKyBha2l0YUFtb3VudCArICgyICogbWFya2V0cGxhY2VBbW91bnQpKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgcHVzaGludCAyIC8vIDIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDUKICAgICoKICAgICsKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo4NC04OQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgY3JlYXRvcjogY3JlYXRvckFtb3VudCwKICAgIC8vICAgYWtpdGE6IGFraXRhQW1vdW50LAogICAgLy8gICBtYXJrZXRwbGFjZTogbWFya2V0cGxhY2VBbW91bnQsCiAgICAvLyAgIHNlbGxlcjogc2VsbGVyQW1vdW50LAogICAgLy8gfQogICAgc3dhcAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRBbW91bnRzX3Rlcm5hcnlfZmFsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMQogICAgLy8gY29uc3QgbWluSW1wYWN0OiB1aW50NjQgPSAoaW1wYWN0ID4gMSkgPyBpbXBhY3QgLSAxIDogMQogICAgaW50Y18xIC8vIDEKICAgIGIgZ2V0QW1vdW50c190ZXJuYXJ5X21lcmdlQDE3CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo6TGlzdGluZy50cmFuc2ZlclB1cmNoYXNlVG9CdXllcihidXllcjogYnl0ZXMpIC0+IHZvaWQ6CnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5MgogICAgLy8gcHJpdmF0ZSB0cmFuc2ZlclB1cmNoYXNlVG9CdXllcihidXllcjogQWNjb3VudCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjkzCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOQogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjkzCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk0LTk3CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtidXllcl0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5NQogICAgLy8gYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNwogICAgLy8gcHJpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcml6ZSB9KQogICAgYnl0ZWNfMyAvLyAicHJpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk1CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk0LTk3CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtidXllcl0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJ0cmFuc2ZlcihhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTAxCiAgICAvLyBjb25zdCBwcml6ZUFzc2V0ID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTAxCiAgICAvLyBjb25zdCBwcml6ZUFzc2V0ID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMDMKICAgIC8vIGlmIChidXllci5pc09wdGVkSW4ocHJpemVBc3NldCkpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyX2Vsc2VfYm9keUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEwNS0xMDgKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogYnV5ZXIsCiAgICAvLyAgIHhmZXJBc3NldDogcHJpemVBc3NldCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTExCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTE1CiAgICAvLyBbeyBhZGRyZXNzOiBidXllciwgYW1vdW50OiBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIH1dLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExNgogICAgLy8gcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMC0xMTgKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHByaXplQXNzZXQuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICAvLyAgIHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIHRydWUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMwogICAgLy8gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExNAogICAgLy8gTUFYX1VJTlQ2NCwKICAgIGludGMgNSAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTAtMTE4CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICBwcml6ZUFzc2V0LmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBidXllciwgYW1vdW50OiBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIH1dLAogICAgLy8gICBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLAogICAgLy8gICB0cnVlCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTcKICAgIC8vIHRydWUKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMC0xMTgKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHByaXplQXNzZXQuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICAvLyAgIHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIHRydWUKICAgIC8vICkKICAgIGNhbGxzdWIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudAogICAgcG9wbiAyCiAgICByZXRzdWIK\",\"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 FunderInfo = {\n account: string,\n amount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a FunderInfo to the struct representation\n */\nexport function FunderInfoFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.FunderInfo, APP_SPEC.structs) as FunderInfo\n}\n\n/**\n * The argument types for the Listing contract\n */\nexport type ListingArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void': {\n prize: bigint | number\n isPrizeBox: boolean\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n seller: string\n funder: FunderInfo\n reservedFor: string\n creatorRoyalty: bigint | number\n gateId: bigint | number\n marketplace: string\n version: string\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'purchase(pay,address,address)void': {\n /**\n * - the payment for purchasing the asset\n */\n payment: AppMethodCallTransactionArgument\n /**\n * - the buyer of the asset\n */\n buyer: string\n marketplace: string\n }\n 'purchaseAsa(axfer,address,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n buyer: string\n marketplace: string\n }\n 'delist(address)void': {\n caller: string\n }\n 'changePrice(uint64)void': {\n price: bigint | number\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()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 }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void': [prize: bigint | number, isPrizeBox: boolean, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, seller: string, funder: FunderInfo, reservedFor: string, creatorRoyalty: bigint | number, gateId: bigint | number, marketplace: string, version: string, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'purchase(pay,address,address)void': [payment: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'purchaseAsa(axfer,address,address)void': [assetXfer: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'delist(address)void': [caller: string]\n 'changePrice(uint64)void': [price: bigint | number]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'optin(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type ListingReturns = {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void': void\n 'purchase(pay,address,address)void': void\n 'purchaseAsa(axfer,address,address)void': void\n 'delist(address)void': void\n 'changePrice(uint64)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'optin(pay,uint64)void': void\n}\n\n/**\n * Defines the types of available calls and state of the Listing smart contract.\n */\nexport type ListingTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void' | 'create', {\n argsObj: ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']\n argsTuple: ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']\n returns: ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']\n }>\n & Record<'purchase(pay,address,address)void' | 'purchase', {\n argsObj: ListingArgs['obj']['purchase(pay,address,address)void']\n argsTuple: ListingArgs['tuple']['purchase(pay,address,address)void']\n returns: ListingReturns['purchase(pay,address,address)void']\n }>\n & Record<'purchaseAsa(axfer,address,address)void' | 'purchaseAsa', {\n argsObj: ListingArgs['obj']['purchaseAsa(axfer,address,address)void']\n argsTuple: ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']\n returns: ListingReturns['purchaseAsa(axfer,address,address)void']\n }>\n & Record<'delist(address)void' | 'delist', {\n argsObj: ListingArgs['obj']['delist(address)void']\n argsTuple: ListingArgs['tuple']['delist(address)void']\n returns: ListingReturns['delist(address)void']\n }>\n & Record<'changePrice(uint64)void' | 'changePrice', {\n argsObj: ListingArgs['obj']['changePrice(uint64)void']\n argsTuple: ListingArgs['tuple']['changePrice(uint64)void']\n returns: ListingReturns['changePrice(uint64)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: ListingArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: ListingArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: ListingReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: ListingArgs['obj']['opUp()void']\n argsTuple: ListingArgs['tuple']['opUp()void']\n returns: ListingReturns['opUp()void']\n }>\n & Record<'optin(pay,uint64)void' | 'optin', {\n argsObj: ListingArgs['obj']['optin(pay,uint64)void']\n argsTuple: ListingArgs['tuple']['optin(pay,uint64)void']\n returns: ListingReturns['optin(pay,uint64)void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the asset for sale: Asset | Application ( Prize Box )\n */\n prize: bigint\n /**\n * whether or not the prize is an asset or a prize box\n */\n isPrizeBox: bigint\n /**\n * the price of the asset\n */\n price: bigint\n /**\n * the asset to use for payment\n */\n paymentAsset: bigint\n /**\n * the timestamp the listing expires on, once this passes all that can be done is delist\n */\n expiration: bigint\n /**\n * the address selling the asset\n */\n seller: string\n /**\n * the address the sale is reserved for\n */\n reservedFor: string\n /**\n * the amount the creator will get for the sale\n */\n creatorRoyalty: bigint\n /**\n * the gate ID to use to check if the user is qualified to buy\n */\n gateId: bigint\n /**\n * The address of the marketplace that listed the asset to send the fee to\n \n IMPORTANT: this is a double sided marketplace fee contract\n the marketplace referred to internally in the contract\n is the listing side marketplace.\n the buyer side marketplace provides their address at\n the time of purchase\n\n */\n marketplace: string\n /**\n * the amount the marketplaces will get for the sale\n */\n marketplaceRoyalties: bigint\n /**\n * the app ID for the akita DAO escrow\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n funder: FunderInfo\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type ListingSignatures = keyof ListingTypes['methods']\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 Listing smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Listing smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = ListingTypes['state']['global']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type ListingCreateCallParams =\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & {method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported delete method params for this smart contract\n */\nexport type ListingDeleteCallParams =\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase'}>\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase(pay,address,address)void'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist(address)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type ListingDeployParams = 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?: ListingCreateCallParams\n /**\n * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n deleteParams?: ListingDeleteCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Listing smart contract\n */\nexport abstract class ListingParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends ListingCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void':\n return ListingParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prize, params.args.isPrizeBox, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.seller, params.args.funder, params.args.reservedFor, params.args.creatorRoyalty, params.args.gateId, params.args.marketplace, params.args.version, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available delete ABI call param factories\n */\n static get delete() {\n return {\n _resolveByMethod<TParams extends ListingDeleteCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'purchase':\n case 'purchase(pay,address,address)void':\n return ListingParamsFactory.delete.purchase(params)\n case 'delist':\n case 'delist(address)void':\n return ListingParamsFactory.delete.delist(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs delete ABI call params for the Listing smart contract using the purchase(pay,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n purchase(params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'purchase(pay,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.buyer, params.args.marketplace],\n }\n },\n /**\n * Constructs delete ABI call params for the Listing smart contract using the delist(address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n delist(params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'delist(address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.caller],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the purchaseAsa(axfer,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.buyer, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the changePrice(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'changePrice(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.price],\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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['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\n/**\n * A factory to create and deploy one or more instance of the Listing smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class ListingFactory {\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 `ListingFactory`\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 ListingClient(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 ListingClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Listing 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: ListingDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? ListingParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (ListingCreateCallParams & { args: Uint8Array[] }) : undefined,\n deleteParams: params.deleteParams?.method ? ListingParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ListingDeleteCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new ListingClient(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 Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(ListingParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployDelete methods\n */\n deployDelete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.purchase(params))\n },\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.delist(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 Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(ListingParamsFactory.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 Listing smart contract using an ABI method call using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(ListingParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']) }, appClient: new ListingClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Listing smart contract\n */\nexport class ListingClient {\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 `ListingClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Listing app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `ListingClient`\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 * Returns a new `ListingClient` 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<ListingClient> {\n return new ListingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `ListingClient` 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<ListingClient> {\n return new ListingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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 Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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 Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n purchase: async (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & SendParams) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.purchase(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchase(pay,address,address)void'])}\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n delist: async (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & SendParams) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.delist(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['delist(address)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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 Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchaseAsa(axfer,address,address)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n changePrice: async (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.changePrice(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['changePrice(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.optin(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['optin(pay,uint64)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 ListingClient(this.appClient.clone(params))\n }\n\n /**\n * Methods to access state for the current Listing app\n */\n state = {\n /**\n * Methods to access global state for the current Listing 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 prize: result.prize,\n isPrizeBox: result.isPrizeBox,\n price: result.price,\n paymentAsset: result.paymentAsset,\n expiration: result.expiration,\n seller: result.seller,\n reservedFor: result.reservedFor,\n creatorRoyalty: result.creatorRoyalty,\n gateId: result.gateID,\n marketplace: result.marketplace,\n marketplaceRoyalties: result.marketplaceRoyalties,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n funder: result.funder,\n }\n },\n /**\n * Get the current value of the prize key in global state\n */\n prize: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"prize\")) as bigint | undefined },\n /**\n * Get the current value of the isPrizeBox key in global state\n */\n isPrizeBox: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"isPrizeBox\")) as bigint | undefined },\n /**\n * Get the current value of the price key in global state\n */\n price: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"price\")) as bigint | undefined },\n /**\n * Get the current value of the paymentAsset key in global state\n */\n paymentAsset: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"paymentAsset\")) as bigint | undefined },\n /**\n * Get the current value of the expiration key in global state\n */\n expiration: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"expiration\")) as bigint | undefined },\n /**\n * Get the current value of the seller key in global state\n */\n seller: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"seller\")) as string | undefined },\n /**\n * Get the current value of the reservedFor key in global state\n */\n reservedFor: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"reservedFor\")) as string | undefined },\n /**\n * Get the current value of the creatorRoyalty key in global state\n */\n creatorRoyalty: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"creatorRoyalty\")) as bigint | undefined },\n /**\n * Get the current value of the gateID key in global state\n */\n gateId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateID\")) as bigint | undefined },\n /**\n * Get the current value of the marketplace key in global state\n */\n marketplace: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"marketplace\")) as string | undefined },\n /**\n * Get the current value of the marketplaceRoyalties key in global state\n */\n marketplaceRoyalties: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"marketplaceRoyalties\")) as bigint | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n /**\n * Get the current value of the funder key in global state\n */\n funder: async (): Promise<FunderInfo | undefined> => { return (await this.appClient.state.global.getValue(\"funder\")) as FunderInfo | undefined },\n },\n }\n\n public newGroup(): ListingComposer {\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 purchaseAsa(axfer,address,address)void method call against the Listing contract\n */\n purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a changePrice(uint64)void method call against the Listing contract\n */\n changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changePrice(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Listing contract\n */\n updateAkitaDao(params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['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 Listing contract\n */\n opUp(params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['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 optin(pay,uint64)void method call against the Listing contract\n */\n optin(params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['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 get delete() {\n return {\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.purchase(params)))\n resultMappers.push(undefined)\n return this\n },\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delist(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Listing 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 ListingComposer\n }\n}\nexport type ListingComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the purchaseAsa(axfer,address,address)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 purchaseAsa(params?: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchaseAsa(axfer,address,address)void'] | undefined]>\n\n /**\n * Calls the changePrice(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 changePrice(params?: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['changePrice(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']>): ListingComposer<[...TReturns, ListingReturns['opUp()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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']>): ListingComposer<[...TReturns, ListingReturns['optin(pay,uint64)void'] | undefined]>\n\n /**\n * Gets available delete methods\n */\n readonly delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchase(params?: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchase(pay,address,address)void'] | undefined]>\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delist(params?: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): ListingComposer<[...TReturns, ListingReturns['delist(address)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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): ListingComposer<[...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): ListingComposer<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<ListingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<ListingComposerResults<TReturns>>\n}\nexport type ListingComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { BaseSDK } from \"../base\";\nimport {\n ListingClient,\n ListingFactory,\n} from '../generated/ListingClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n ChangePriceParams,\n ListingState,\n} from \"./types\";\n\n/**\n * SDK for interacting with an individual Listing contract.\n * Use this to manage listing state and change prices.\n * Note: Purchases and delisting should be done through the MarketplaceSDK.\n */\nexport class ListingSDK extends BaseSDK<ListingClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: ListingFactory, ...params });\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current state of the listing.\n */\n async state(): Promise<ListingState> {\n const state = await this.client.state.global.getAll();\n\n return {\n prize: state.prize ?? 0n,\n isPrizeBox: state.isPrizeBox as unknown as boolean ?? false,\n price: state.price ?? 0n,\n paymentAsset: state.paymentAsset ?? 0n,\n expiration: state.expiration ?? 0n,\n seller: state.seller?.toString() ?? '',\n reservedFor: state.reservedFor?.toString() ?? '',\n creatorRoyalty: state.creatorRoyalty ?? 0n,\n gateId: state.gateId ?? 0n,\n marketplace: state.marketplace?.toString() ?? '',\n marketplaceRoyalties: state.marketplaceRoyalties ?? 0n,\n };\n }\n\n /**\n * Checks if the listing has expired.\n */\n async isExpired(): Promise<boolean> {\n const listingState = await this.state();\n if (listingState.expiration === 0n) {\n return false; // No expiration set\n }\n const now = BigInt(Math.floor(Date.now() / 1000));\n return now > listingState.expiration;\n }\n\n /**\n * Checks if the listing is reserved for a specific address.\n */\n async isReserved(): Promise<boolean> {\n const listingState = await this.state();\n return listingState.reservedFor !== '' && listingState.reservedFor !== 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ';\n }\n\n // ========== Write Methods ==========\n\n /**\n * Changes the price of the listing.\n * Can only be called by the seller.\n */\n async changePrice({ sender, signer, price }: ChangePriceParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n await this.client.send.changePrice({\n ...sendParams,\n args: { price },\n });\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-2WOYNNPV.js","../src/marketplace/index.ts","../src/generated/MarketplaceClient.ts","../src/generated/ListingClient.ts","../src/marketplace/listing.ts"],"names":["APP_SPEC","_AppFactory","_AppClient"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-2WOYNNPV.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport algosdk from \"algosdk\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n MarketplaceClient,\n MarketplaceFactory,\n MarketplaceArgs,\n} from '../generated/MarketplaceClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport { ListingSDK } from \"./listing\";\nimport {\n ListParams,\n PurchaseParams,\n DelistParams,\n} from \"./types\";\nimport { PrizeBoxFactorySDK } from \"../prize-box\";\n\nexport * from \"./listing\";\nexport * from \"./types\";\n\nexport type MarketplaceContractArgs = MarketplaceArgs[\"obj\"];\n\n/**\n * SDK for interacting with the Marketplace contract.\n * Use this to create listings, purchase items, and delist items.\n */\nexport class MarketplaceSDK extends BaseSDK<MarketplaceClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: MarketplaceFactory, ...params }, ENV_VAR_NAMES.MARKETPLACE_APP_ID);\n }\n\n // ========== Factory/Listing Methods ==========\n\n /**\n * Creates a new listing and returns a ListingSDK instance.\n * Can list either an ASA or a PrizeBox based on the `isPrizeBox` flag.\n * @returns ListingSDK for the newly created listing\n */\n async list({\n sender,\n signer,\n isPrizeBox = false,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n ...rest\n }: ListParams): Promise<ListingSDK> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get the cost for creating a new listing, dynamically querying rewards opt-in state\n const isAlgoPayment = BigInt(paymentAsset) === 0n;\n const prizeId = isPrizeBox ? 0n : BigInt((rest as { asset: bigint | number }).asset);\n const [prizeRewardsOptInCost, paymentRewardsOptInCost] = await Promise.all([\n this.getRewardsOptInCost(prizeId),\n this.getRewardsOptInCost(BigInt(paymentAsset)),\n ]);\n const cost = this.listCost({ isPrizeBox, isAlgoPayment, prizeRewardsOptInCost, paymentRewardsOptInCost });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n let appId: bigint | undefined;\n\n if (isPrizeBox) {\n const { prizeBoxId } = rest as Extract<ListParams, { isPrizeBox: true }>;\n\n const prizeBoxSDK = new PrizeBoxFactorySDK({ algorand: this.algorand, factoryParams: {}}).get({ appId: BigInt(prizeBoxId) })\n const prizeBoxTransferTxn = (await prizeBoxSDK.client.createTransaction.transfer({\n sender,\n signer,\n args: {\n newOwner: this.client.appAddress.toString()\n }\n })).transactions[0];\n\n ({ return: appId } = await this.client.send.listPrizeBox({\n ...sendParams,\n args: {\n prizeBoxTransferTxn,\n payment,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n },\n }));\n } else {\n const { asset, amount, name, proof } = rest as Exclude<ListParams, { isPrizeBox: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n ({ return: appId } = await this.client.send.list({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n name,\n proof,\n },\n }));\n }\n\n if (appId === undefined) {\n throw new Error('Failed to create new listing');\n }\n\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: sendParams.sender,\n defaultSigner: sendParams.signer,\n },\n });\n }\n\n /**\n * Gets a ListingSDK instance for an existing listing.\n * @param appId - The app ID of the listing\n * @returns ListingSDK for the specified listing\n */\n getListing({ appId }: { appId: bigint }): ListingSDK {\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: this.sendParams.sender,\n defaultSigner: this.sendParams.signer,\n },\n });\n }\n\n /**\n * Checks if the rewards app is already opted into the given asset.\n * Returns 0n if opted in (no cost needed), 100_000n if not.\n */\n private async getRewardsOptInCost(assetId: bigint | number): Promise<bigint> {\n const asset = BigInt(assetId);\n if (asset === 0n) return 0n;\n\n try {\n const akitaDaoAppId = await this.client.state.global.akitaDao();\n if (!akitaDaoAppId) return 100_000n;\n\n const algod = this.algorand.client.algod;\n const daoApp = await algod.getApplicationByID(akitaDaoAppId).do();\n const globalState = daoApp.params.globalState;\n if (!globalState) return 100_000n;\n\n // Find the 'aal' (akitaAppList) key in AkitaDAO global state\n const aalKey = new TextEncoder().encode('aal');\n const aalEntry = globalState.find(\n (kv) => kv.key.length === aalKey.length && kv.key.every((b, i) => b === aalKey[i])\n );\n if (!aalEntry || aalEntry.value.type !== 1) return 100_000n;\n\n // Extract rewards app ID (2nd uint64 in ABI-encoded AkitaAppList, bytes 8-15)\n const aalBytes = aalEntry.value.bytes;\n if (aalBytes.length < 16) return 100_000n;\n const view = new DataView(aalBytes.buffer, aalBytes.byteOffset, aalBytes.byteLength);\n const rewardsAppId = view.getBigUint64(8);\n if (rewardsAppId === 0n) return 100_000n;\n\n // Check if rewards app address is already opted into the asset\n const rewardsAddress = algosdk.getApplicationAddress(rewardsAppId).toString();\n const response = await algod.accountAssetInformation(rewardsAddress, asset).do();\n return response.assetHolding ? 0n : 100_000n;\n } catch {\n // If any lookup fails (e.g. 404 not opted in), assume cost is needed\n return 100_000n;\n }\n }\n\n /**\n * Gets the cost to create a new listing.\n * @param isPrizeBox - Whether the prize is a PrizeBox\n * @param isAlgoPayment - Whether the listing will accept ALGO as payment\n * @param prizeRewardsOptInCost - Rewards app opt-in cost for the prize asset (default: 100,000, pass 0 if already opted in)\n * @param paymentRewardsOptInCost - Rewards app opt-in cost for the payment asset (default: 100,000, pass 0 if already opted in)\n */\n listCost({ isPrizeBox = false, isAlgoPayment = true, prizeRewardsOptInCost = 100_000n, paymentRewardsOptInCost = 100_000n, escrowOptInCost = 0n }: { isPrizeBox?: boolean, isAlgoPayment?: boolean, prizeRewardsOptInCost?: bigint, paymentRewardsOptInCost?: bigint, escrowOptInCost?: bigint } = {}): bigint {\n // Base cost: MIN_PROGRAM_PAGES + (GLOBAL_STATE_KEY_UINT_COST * globalUints) + (GLOBAL_STATE_KEY_BYTES_COST * globalBytes)\n const baseCost = 635_000n;\n const minBalance = 100_000n;\n const assetOptInMinBalance = 100_000n;\n const perDisbursement = 60_600n; // MinDisbursementsMBR + UserAllocationMBR\n\n // Asset opt-in MBR for the child contract\n const optinMbr = isPrizeBox\n ? (isAlgoPayment ? 0n : assetOptInMinBalance)\n : (isAlgoPayment ? assetOptInMinBalance : assetOptInMinBalance * 2n);\n\n // Disbursement MBR\n let disbursementMbr = 0n;\n if (!isPrizeBox) {\n // 1 prize + 1 referral + (4 ASA payments if ASA)\n disbursementMbr += perDisbursement + prizeRewardsOptInCost; // prize\n if (isAlgoPayment) {\n disbursementMbr += perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr += perDisbursement * 5n + paymentRewardsOptInCost; // referral + 4 ASA payments\n }\n } else {\n // 1 referral + (3 ASA payments if ASA)\n if (isAlgoPayment) {\n disbursementMbr = perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr = perDisbursement * 4n + paymentRewardsOptInCost; // referral + 3 ASA payments\n }\n }\n\n // Escrow opt-in cost for ASA payments (factory opts escrow into payment asset)\n const escrowCost = isAlgoPayment ? 0n : escrowOptInCost;\n\n return baseCost + minBalance + optinMbr + disbursementMbr + escrowCost;\n }\n\n // ========== Purchase Methods ==========\n\n /**\n * Purchases a listing.\n * Use `isAsa: true` with `paymentAsset` and `paymentAmount` for ASA payments, otherwise ALGO is used.\n * Provide `gateTxn` for gated listings.\n */\n async purchase({\n sender,\n signer,\n listingAppId,\n marketplace,\n isAsa = false,\n gateTxn,\n ...rest\n }: PurchaseParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Use opUps to handle app reference limits (royalty distribution, DAO access, etc.)\n const group = this.client.newGroup();\n\n if (isAsa) {\n const { paymentAsset, paymentAmount } = rest as Extract<PurchaseParams, { isAsa: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(paymentAmount),\n assetId: BigInt(paymentAsset),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n } else {\n // Get listing to determine price for ALGO purchases\n const listing = this.getListing({ appId: BigInt(listingAppId) });\n const listingState = await listing.state();\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(listingState.price),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchase({\n ...sendParams,\n args: {\n payment,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchase({\n ...sendParams,\n args: {\n payment,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n }\n\n // Add opUps to increase app reference limit\n // purchase + payment (and possibly assetXfer) = 2-3 transactions, so we can add up to 13-14 opUps\n for (let i = 0; i < 10; i++) {\n group.opUp({ ...sendParams, args: {}, note: i > 0 ? `opUp-${i}` : undefined });\n }\n\n await group.send(sendParams);\n }\n\n // ========== Delist Methods ==========\n\n /**\n * Removes a listing and returns the asset to the seller.\n * Can only be called by the seller.\n */\n async delist({ sender, signer, appId }: DelistParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.delist({\n ...sendParams,\n args: { appId },\n });\n }\n\n // ========== Admin Methods ==========\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDAO({ sender, signer, akitaDao }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAO(uint64)void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao },\n });\n }\n\n /**\n * Updates the Akita DAO Escrow reference.\n */\n async updateAkitaDAOEscrow({ sender, signer, app }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAOEscrow(uint64)void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDaoEscrow({\n ...sendParams,\n args: { app },\n });\n }\n}\n\n/**\n * Convenience function to create a new listing and return the SDK.\n * Creates a marketplace SDK, creates the listing, and returns the listing SDK.\n */\nexport async function newListing({\n factoryParams,\n algorand,\n readerAccount,\n sendParams,\n ...listParams\n}: NewContractSDKParams & ListParams): Promise<ListingSDK> {\n const marketplace = new MarketplaceSDK({ factoryParams, algorand, readerAccount, sendParams });\n return await marketplace.list(listParams);\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\":\"Marketplace\",\"structs\":{},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"string\",\"name\":\"childVersion\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"list\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"byte[32][]\",\"name\":\"proof\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"listPrizeBox\",\"args\":[{\"type\":\"appl\",\"name\":\"prizeBoxTransferTxn\"},{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"uint64\",\"name\":\"appId\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"initBoxedContract\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"size\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"loadBoxedContract\",\"args\":[{\"type\":\"uint64\",\"name\":\"offset\"},{\"type\":\"byte[]\",\"name\":\"data\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deleteBoxedContract\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"uint64\",\"name\":\"app\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":2},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"childContractVersion\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==\",\"desc\":\"the current version of the child contract\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow to use\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{\"boxedContract\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"YmM=\"}}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[1546],\"errorMessage\":\"Bad method prize box transfer needed\"},{\"pc\":[945,1648],\"errorMessage\":\"Box must have value\"},{\"pc\":[417,1329,3148],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[824,1528,2809],\"errorMessage\":\"Contract not set\"},{\"pc\":[3168],\"errorMessage\":\"Escrow does not exist\"},{\"pc\":[3030],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[2804],\"errorMessage\":\"Invalid call order\"},{\"pc\":[899,923,1645,2046,2175,2896],\"errorMessage\":\"Invalid payment\"},{\"pc\":[2349,2491],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[819,1523],\"errorMessage\":\"Lowest price is 4 units for divisibility\"},{\"pc\":[2017,2159,2312,2467,2588],\"errorMessage\":\"Not a listing contract\"},{\"pc\":[1575],\"errorMessage\":\"Not a prize box\"},{\"pc\":[1588],\"errorMessage\":\"Not prize box owner\"},{\"pc\":[179],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[321],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[2687,2707,2835,2980,3019,3059],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2167,2475],\"errorMessage\":\"This has a gate\"},{\"pc\":[3177],\"errorMessage\":\"Wrong escrow for this operation\"},{\"pc\":[552,1090,1111,1148,1177,1217,1382,1561,1573,1790,1810,1837,1877,1918,2013,2066,2155,2195,2308,2369,2463,2511,2584,2705,2833,2870,2937,2978,3015,3057,3230,3252,3330],\"errorMessage\":\"application exists\"},{\"pc\":[1261],\"errorMessage\":\"asset exists\"},{\"pc\":[835,930,975,987,992,1214,1375,1379,1395,1550,1677,1689,1694,1874,1911,1915,1931,2000,2027,2295,2322,2699,2827,2863,2867,2930,2934,2972,3008,3051,3071,3172,3249,3327],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[3161],\"errorMessage\":\"invalid number of bytes for (len+(uint64,bool1)[])\"},{\"pc\":[814],\"errorMessage\":\"invalid number of bytes for (len+uint8[32][])\"},{\"pc\":[427,2737],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[625,642,792,1339,2657,2999],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[653,662,718,730,744,765,1462,1474,1487,1508,1986,2140,2281,2448,2579,2668,2721,2858,2925,2965,3044],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[755,776,1498,1519,1996,2150,2291,2458],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[1439,1978,2273],\"errorMessage\":\"transaction type is appl\"},{\"pc\":[709,2263,2440],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[698,1451,1968,2132,2850],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNiA2MDYwMCA5MzUwMDAgNTAwMDAKICAgIGJ5dGVjYmxvY2sgImFraXRhX2RhbyIgImFraXRhX2VzY3JvdyIgImJjIiAid2FsbGV0IiAweDE1MWY3Yzc1ICJmdW5kZXIiICJhYWwiICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIiAiZ2F0ZV9pZCIgMHgzZWExMTgzMiAweDgwIDB4YzUzYjMyY2MgInZlcnNpb24iIDB4ZDZmMTFlYTUgYmFzZTY0KEM0RUJRdz09KSAicmV2X21hcmtldHBsYWNlIiAweGFkZjkyYWU0IDB4NmExNjM5M2QgMHgxNzFjOWY4OCAicGFsIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBNYXJrZXRwbGFjZSBleHRlbmRzIEZhY3RvcnlDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHhlYTkxODBkZCAvLyBtZXRob2QgInVwZGF0ZShzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlX3JvdXRlQDIKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBNYXJrZXRwbGFjZSBleHRlbmRzIEZhY3RvcnlDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjEKICAgIHB1c2hieXRlc3MgMHhlMmZhOWUyMSAweDgxZGM1MTZhIDB4NmU5MDM1Y2MgMHg1ZDdhNjE3NyAweGRhYTk3NTE2IDB4MDJjZmIxY2YgMHhjOTdkYmIyZSAvLyBtZXRob2QgImxpc3QocGF5LGF4ZmVyLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdW10pdWludDY0IiwgbWV0aG9kICJsaXN0UHJpemVCb3goYXBwbCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdhdGVkUHVyY2hhc2UocGF5LGFwcGwsdWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAicHVyY2hhc2UocGF5LHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImdhdGVkUHVyY2hhc2VBc2EoYXhmZXIsYXBwbCx1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJwdXJjaGFzZUFzYShheGZlcix1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJkZWxpc3QodWludDY0KXZvaWQiCiAgICBieXRlYyAxMSAvLyBtZXRob2QgImluaXRCb3hlZENvbnRyYWN0KHN0cmluZyx1aW50NjQpdm9pZCIKICAgIHB1c2hieXRlc3MgMHhkY2EyZDg2MiAweGQzNDZiMWE0IDB4Mzk0ZWFlYjIgMHgzM2Y3ODgwOCAweDFlYWQyMGE5IDB4MzNlOTJjOTQgMHg4NTRkZWRlMCAvLyBtZXRob2QgImxvYWRCb3hlZENvbnRyYWN0KHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAiZGVsZXRlQm94ZWRDb250cmFjdCgpdm9pZCIsIG1ldGhvZCAib3B0SW4ocGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcHRJbkNvc3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU9Fc2Nyb3codWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbGlzdCBsaXN0UHJpemVCb3ggZ2F0ZWRQdXJjaGFzZSBwdXJjaGFzZSBnYXRlZFB1cmNoYXNlQXNhIHB1cmNoYXNlQXNhIGRlbGlzdCBpbml0Qm94ZWRDb250cmFjdCBsb2FkQm94ZWRDb250cmFjdCBkZWxldGVCb3hlZENvbnRyYWN0IG9wdEluIG9wdEluQ29zdCB1cGRhdGVBa2l0YURBT0VzY3JvdyB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVAMTkKICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOAogICAgLy8gZXhwb3J0IGNsYXNzIE1hcmtldHBsYWNlIGV4dGVuZHMgRmFjdG9yeUNvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweGM0MjZmNGJhIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fdXBkYXRlX3JvdXRlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBVcGRhdGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIHVwZGF0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yVHhuU2VuZGVyKHdhbGxldElEOiB1aW50NjQpIC0+IGJ5dGVzOgpvcmlnaW5PclR4blNlbmRlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTQ5CiAgICAvLyBleHBvcnQgZnVuY3Rpb24gb3JpZ2luT3JUeG5TZW5kZXIod2FsbGV0SUQ6IEFwcGxpY2F0aW9uKTogQWNjb3VudCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0MwogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBvcmlnaW5PclR4blNlbmRlcl9hZnRlcl9pZl9lbHNlQDMKICAgIGZyYW1lX2RpZyAwCgpvcmlnaW5PclR4blNlbmRlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE1MAogICAgLy8gcmV0dXJuIG9yaWdpbk9yKHdhbGxldElELCBUeG4uc2VuZGVyKQogICAgc3dhcAogICAgcmV0c3ViCgpvcmlnaW5PclR4blNlbmRlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY3CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIHB1c2hieXRlcyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTAKICAgIC8vIHJldHVybiBvcmlnaW5Pcih3YWxsZXRJRCwgVHhuLnNlbmRlcikKICAgIGIgb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA0CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiB1aW50NjQsIGFkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFdhbGxldElEVXNpbmdBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYWRkcmVzczogQWNjb3VudCk6IEFwcGxpY2F0aW9uIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OQogICAgLy8gY29uc3QgW290aGVyQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c090aGVyQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hieXRlcyAib2FsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2NAogICAgLy8gcmV0dXJuIGdldE90aGVyQXBwTGlzdChha2l0YURBTykuZXNjcm93CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODYtMTg5CiAgICAvLyBjb25zdCBkYXRhID0gYWJpQ2FsbDx0eXBlb2YgRXNjcm93RmFjdG9yeS5wcm90b3R5cGUuZ2V0Pih7CiAgICAvLyAgIGFwcElkOiBlc2Nyb3dGYWN0b3J5LAogICAgLy8gICBhcmdzOiBbYWRkcmVzc10KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4W10pCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MQogICAgLy8gaWYgKEJ5dGVzKGRhdGEpLmxlbmd0aCA9PT0gMCB8fCBCeXRlcyhkYXRhKS5sZW5ndGggIT09IDgpIHsKICAgIGxlbgogICAgZHVwCiAgICBieiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9faWZfYm9keUA2CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDgKICAgICE9CiAgICBieiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaWZfZWxzZUA3CgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9faWZfYm9keUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTIKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAoKZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgyCiAgICAvLyByZXR1cm4gQXBwbGljYXRpb24oZ2V0V2FsbGV0SUQoZXNjcm93RmFjdG9yeSwgYWRkcmVzcykpCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTk1CiAgICAvLyByZXR1cm4gYnRvaShkYXRhKQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgyCiAgICAvLyByZXR1cm4gQXBwbGljYXRpb24oZ2V0V2FsbGV0SUQoZXNjcm93RmFjdG9yeSwgYWRkcmVzcykpCiAgICBiIGdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDgKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnYXRlQ2hlY2soZ2F0ZVR4bjogdWludDY0LCBha2l0YURBTzogdWludDY0LCBjYWxsZXI6IGJ5dGVzLCBpZDogdWludDY0KSAtPiB1aW50NjQ6CmdhdGVDaGVjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2F0ZUNoZWNrKGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLCBha2l0YURBTzogQXBwbGljYXRpb24sIGNhbGxlcjogQWNjb3VudCwgaWQ6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMwogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYnogZ2F0ZUNoZWNrX2Jvb2xfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzQKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzQKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGJueiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzNQogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM1CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM2CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHg0MzkyMjY1NSAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNgogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM3CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18xIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzcKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM4CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBmcmFtZV9kaWcgLTQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM4CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzItMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyAgIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vICAgZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgLy8gKQogICAgcmV0c3ViCgpnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMyLTIzOQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gICBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyAgIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJld2FyZHNPcHRJbkNvc3QoYWtpdGFEQU86IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0OgpyZXdhcmRzT3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZXdhcmRzT3B0SW5Db3N0KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTA5CiAgICAvLyBpZiAoYXNzZXQgIT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogcmV3YXJkc09wdEluQ29zdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgNiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTEKICAgIC8vIGlmICghQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSkgewogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IHJld2FyZHNPcHRJbkNvc3RfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUxMgogICAgLy8gcmV0dXJuIEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICByZXRzdWIKCnJld2FyZHNPcHRJbkNvc3RfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTUKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKc3BsaXRPcHRJbkNvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBzcGxpdE9wdEluQ291bnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBlc2Nyb3c6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIyCiAgICAvLyBsZXQgY291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyNAogICAgLy8gaWYgKCFlc2Nyb3cuaXNPcHRlZEluKGFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDMKICAgIC8vIGNvbnN0IFtzcGxpdHNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNSZXZlbnVlU3BsaXRzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJyZXZlbnVlX3NwbGl0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI4CiAgICAvLyBjb3VudCArPSBzcGxpdHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTIgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNgogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzQKICAgIC8vIGNoaWxkQ29udHJhY3RWZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogQmFzZUZhY3RvcnlHbG9iYWxTdGF0ZUtleUNoaWxkQ29udHJhY3RWZXJzaW9uIH0pCiAgICBieXRlYyA3IC8vICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjcKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUgPSBjaGlsZFZlcnNpb24KICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyOQogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGFraXRhREFPRXNjcm93CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmxpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpsaXN0OgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNC00NQogICAgLy8gbGlzdCgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsIC8vIDAgfCBBc3NldAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDcKICAgIC8vIGFzc2VydChwcmljZSA+PSA0LCBFUlJfUFJJQ0VfVE9PX0xPVykKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA+PQogICAgYXNzZXJ0IC8vIExvd2VzdCBwcmljZSBpcyA0IHVuaXRzIGZvciBkaXZpc2liaWxpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ29udHJhY3Qgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NTEtNTMKICAgIC8vIGNvbnN0IG9wdGluTUJSOiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogMgogICAgYm56IGxpc3RfdGVybmFyeV9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo1MgogICAgLy8gPyBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgYnVyeSAxNQoKbGlzdF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo2MgogICAgLy8gbGV0IGRpc2J1cnNlbWVudE1CUjogdWludDY0ID0gZGlzYnVyc2VtZW50Q29zdCgxKSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjYyCiAgICAvLyBsZXQgZGlzYnVyc2VtZW50TUJSOiB1aW50NjQgPSBkaXNidXJzZW1lbnRDb3N0KDEpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LmlkKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIGNhbGxzdWIgcmV3YXJkc09wdEluQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBpbnRjIDQgLy8gNjA2MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjYyCiAgICAvLyBsZXQgZGlzYnVyc2VtZW50TUJSOiB1aW50NjQgPSBkaXNidXJzZW1lbnRDb3N0KDEpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LmlkKQogICAgKwogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjMKICAgIC8vIGlmIChpc0FsZ29QYXltZW50KSB7CiAgICBkaWcgNwogICAgYm56IGxpc3RfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY0CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCgxKQogICAgZGlnIDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUwMQogICAgLy8gcmV0dXJuIChNaW5EaXNidXJzZW1lbnRzTUJSICsgVXNlckFsbG9jYXRpb25NQlIpICogY291bnQKICAgIGludGMgNCAvLyA2MDYwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjQKICAgIC8vIGRpc2J1cnNlbWVudE1CUiArPSBkaXNidXJzZW1lbnRDb3N0KDEpCiAgICArCiAgICBidXJ5IDE3CgpsaXN0X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcwLTcyCiAgICAvLyBjb25zdCBlc2Nyb3dPcHRJbkNvc3Q6IHVpbnQ2NCA9IGlzQWxnb1BheW1lbnQKICAgIC8vICAgPyAwCiAgICAvLyAgIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGRpZyA3CiAgICBibnogbGlzdF90ZXJuYXJ5X2ZhbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcxCiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0X3Rlcm5hcnlfbWVyZ2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3NAogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTYKICAgICsKICAgIGRpZyAxOAogICAgKwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzYtNzgKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBsaXN0aW5nLmdsb2JhbEJ5dGVzKSArCiAgICBpbnRjIDUgLy8gOTM1MDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3Ni03OQogICAgLy8gTUFYX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogbGlzdGluZy5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIGNoaWxkQXBwTUJSCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjgzLTkwCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRvdGFsTUJSCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAxMgogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6ODYKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo4My05MAogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0b3RhbE1CUgogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTMtMTAxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7IGdyZWF0ZXJUaGFuOiAwIH0sCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAxMAogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk2CiAgICAvLyBzZW5kZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5My0xMDEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBzZW5kZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHsgZ3JlYXRlclRoYW46IDAgfSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5NwogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTMtMTAxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7IGdyZWF0ZXJUaGFuOiAwIH0sCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYnVyeSAxNgogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgY3JlYXRvclJveWFsdHkgPSByb3lhbHRpZXModGhpcy5ha2l0YURBTy52YWx1ZSwgYXNzZXRYZmVyLnhmZXJBc3NldCwgbmFtZSwgcHJvb2YpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGNyZWF0b3JSb3lhbHR5ID0gcm95YWx0aWVzKHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQsIG5hbWUsIHByb29mKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMjEKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDE4CiAgICAvLyBsZXQgY3JlYXRvclJveWFsdHk6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQyMAogICAgLy8gaWYgKCEocHJvb2YubGVuZ3RoID4gMCkpIHsKICAgIGR1cAogICAgYm56IGxpc3RfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjEKICAgIC8vIHJldHVybiBDcmVhdG9yUm95YWx0eURlZmF1bHQKICAgIHB1c2hpbnQgNTAwMCAvLyA1MDAwCiAgICBidXJ5IDE4CgpsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwNgogICAgLy8gY29uc3QgYXBwcm92YWxQcm9ncmFtID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoMCwgdGhpcy5ib3hlZENvbnRyYWN0Lmxlbmd0aCkKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA2CiAgICAvLyBjb25zdCBhcHByb3ZhbFByb2dyYW0gPSB0aGlzLmJveGVkQ29udHJhY3QuZXh0cmFjdCgwLCB0aGlzLmJveGVkQ29udHJhY3QubGVuZ3RoKQogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwOS0xMjkKICAgIC8vIGNvbnN0IGxpc3RpbmdBcHAgPSBsaXN0aW5nLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIC8vICAgICAgIGZhbHNlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgY3JlYXRvclJveWFsdHksCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTIKICAgIC8vIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICBkaWcgMTkKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE3CiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE4CiAgICAvLyB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICBkaWcgMTUKICAgIGd0eG5zIFNlbmRlcgogICAgZGlnIDE3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyMAogICAgLy8gY3JlYXRvclJveWFsdHksCiAgICBkaWcgMjIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyMwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozNAogICAgLy8gY2hpbGRDb250cmFjdFZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBCYXNlRmFjdG9yeUdsb2JhbFN0YXRlS2V5Q2hpbGRDb250cmFjdFZlcnNpb24gfSkKICAgIGJ5dGVjIDcgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjMKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyNAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyNAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjUKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjUKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA5LTEyOQogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsKGFkZHJlc3MsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTEzCiAgICAvLyBmYWxzZSwKICAgIHB1c2hieXRlcyAweDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCBsaXN0aW5nID0gY29tcGlsZUFyYzQoTGlzdGluZykKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBwdXNoaW50IDUgLy8gNQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA5LTEyOQogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IGxpc3RpbmcgPSBjb21waWxlQXJjNChMaXN0aW5nKQogICAgYnl0ZWMgMTQgLy8gYmFzZTY0KEM0RUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDktMTI5CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgICAgICBmYWxzZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIGNyZWF0b3JSb3lhbHR5LAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwOS0xMzEKICAgIC8vIGNvbnN0IGxpc3RpbmdBcHAgPSBsaXN0aW5nLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIC8vICAgICAgIGZhbHNlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgY3JlYXRvclJveWFsdHksCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzNC0xMzkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzNgogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTM3CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgZGlnIDIxCiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTM0LTEzOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMzQtMTM5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQyLTE1MQogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ2CiAgICAvLyByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNDcKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ1LTE0OAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE0Mi0xNTEKICAgIC8vIGxpc3RpbmcuY2FsbC5vcHRpbih7CiAgICAvLyAgIGFwcElkOiBsaXN0aW5nQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgYnl0ZWMgOSAvLyBtZXRob2QgIm9wdGluKHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE1NC0xNjAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNTYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgMTQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTU0LTE1OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTU0LTE2MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjIKICAgIC8vIGlmICghaXNBbGdvUGF5bWVudCkgewogICAgZGlnIDcKICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTY0LTE3MwogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE2OAogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxNQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjctMTcwCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjQtMTczCiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBieXRlYyA5IC8vIG1ldGhvZCAib3B0aW4ocGF5LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNzYKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihBc3NldChwYXltZW50QXNzZXQpKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTc2CiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQocGF5bWVudEFzc2V0KSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0X2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE3NwogICAgLy8gdGhpcy5vcHRBa2l0YUVzY3Jvd0luQW5kU2VuZChBa2l0YURBT0VzY3Jvd0FjY291bnRNYXJrZXRwbGFjZSwgQXNzZXQocGF5bWVudEFzc2V0KSwgMCkKICAgIGJ5dGVjIDE1IC8vICJyZXZfbWFya2V0cGxhY2UiCiAgICBkaWcgOAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQKICAgIHBvcAoKbGlzdF9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQtNDUKICAgIC8vIGxpc3QoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHByaWNlOiB1aW50NjQsCiAgICAvLyAgIHBheW1lbnRBc3NldDogdWludDY0LCAvLyAwIHwgQXNzZXQKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0LAogICAgLy8gICByZXNlcnZlZEZvcjogQWNjb3VudCwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHByb29mOiBQcm9vZgogICAgLy8gKTogdWludDY0IHsKICAgIGRpZyAxNQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbGlzdF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgZGlnIDE5CiAgICBieXRlYyA2IC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQyNgogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjgKICAgIC8vIGFzc2V0LmNyZWF0b3IsCiAgICBkaWcgMTkKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDMwCiAgICAvLyBzaGEyNTYoc2hhMjU2KGl0b2IoYXNzZXQuaWQpKSksCiAgICBzd2FwCiAgICBpdG9iCiAgICBzaGEyNTYKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MzIKICAgIC8vIDEsCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MGNmMWI5Y2YgLy8gbWV0aG9kICJ2ZXJpZmllZFJlYWQoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQsc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzMwogICAgLy8gJ3JveWFsdHknLAogICAgcHVzaGJ5dGVzIDB4MDAwNzcyNmY3OTYxNmM3NDc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQyNS00MzUKICAgIC8vIGNvbnN0IGNyZWF0b3JSb3lhbHR5U3RyaW5nID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmaWVkUmVhZD4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGFzc2V0LmNyZWF0b3IsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBzaGEyNTYoc2hhMjU2KGl0b2IoYXNzZXQuaWQpKSksCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgMSwKICAgIC8vICAgICAncm95YWx0eScsCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICBidXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzNwogICAgLy8gaWYgKEJ5dGVzKGNyZWF0b3JSb3lhbHR5U3RyaW5nKS5sZW5ndGggPiAwKSB7CiAgICBsZW4KICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MzgKICAgIC8vIGNyZWF0b3JSb3lhbHR5ID0gYnRvaShCeXRlcyhjcmVhdG9yUm95YWx0eVN0cmluZykpCiAgICBkaWcgMjAKICAgIGJ0b2kKICAgIGJ1cnkgMTgKCmxpc3RfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQxCiAgICAvLyBpZiAoY3JlYXRvclJveWFsdHkgPiBDcmVhdG9yUm95YWx0eU1heGltdW1TaW5nbGUpIHsKICAgIGRpZyAxNwogICAgaW50YyA2IC8vIDUwMDAwCiAgICA+CiAgICBieiBsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0MgogICAgLy8gcmV0dXJuIENyZWF0b3JSb3lhbHR5TWF4aW11bVNpbmdsZQogICAgaW50YyA2IC8vIDUwMDAwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGNyZWF0b3JSb3lhbHR5ID0gcm95YWx0aWVzKHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQsIG5hbWUsIHByb29mKQogICAgYiBsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDI5CgpsaXN0X3Rlcm5hcnlfZmFsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzIKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAqCiAgICBiIGxpc3RfdGVybmFyeV9tZXJnZUAxMAoKbGlzdF9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY2CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjYKICAgIC8vIGRpc2J1cnNlbWVudE1CUiArPSBkaXNidXJzZW1lbnRDb3N0KDUpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBwYXltZW50QXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDgKICAgIGNhbGxzdWIgcmV3YXJkc09wdEluQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBwdXNoaW50IDMwMzAwMCAvLyAzMDMwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY2CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgZGlnIDE3CiAgICArCiAgICBidXJ5IDE3CiAgICBiIGxpc3RfYWZ0ZXJfaWZfZWxzZUA3CgpsaXN0X3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjUzCiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIDIKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGJ1cnkgMTUKICAgIGIgbGlzdF90ZXJuYXJ5X21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UubGlzdFByaXplQm94W3JvdXRpbmddKCkgLT4gdm9pZDoKbGlzdFByaXplQm94OgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4NC0xOTMKICAgIC8vIGxpc3RQcml6ZUJveCgKICAgIC8vICAgcHJpemVCb3hUcmFuc2ZlclR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgcmVzZXJ2ZWRGb3I6IEFjY291bnQsCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cG4gMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NAogICAgLy8gYXNzZXJ0KHByaWNlID49IDQsIEVSUl9QUklDRV9UT09fTE9XKQogICAgcHVzaGludCA0IC8vIDQKICAgID49CiAgICBhc3NlcnQgLy8gTG93ZXN0IHByaWNlIGlzIDQgdW5pdHMgZm9yIGRpdmlzaWJpbGl0eQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gYXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ29udHJhY3Qgbm90IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk4CiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KCkgJiYKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJ0cmFuc2ZlcihhZGRyZXNzKXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk4LTE5OQogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPigpICYmCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBieiBsaXN0UHJpemVCb3hfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOTkKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGRpZyA4CiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5OC0xOTkKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oKSAmJgogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxpc3RQcml6ZUJveF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpsaXN0UHJpemVCb3hfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk3LTIwMAogICAgLy8gYXNzZXJ0KCgKICAgIC8vICAgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPigpICYmCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICksIEVSUl9CQURfTUVUSE9EX1BSSVpFX0JPWF9UUkFOU0ZFUl9ORUVERUQpCiAgICBhc3NlcnQgLy8gQmFkIG1ldGhvZCBwcml6ZSBib3ggdHJhbnNmZXIgbmVlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDEKICAgIC8vIGFzc2VydChnZXRQcml6ZUJveE93bmVyKHRoaXMuYWtpdGFEQU8udmFsdWUsIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQpID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9QUklaRV9CT1hfT1dORVIpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDEKICAgIC8vIGFzc2VydChnZXRQcml6ZUJveE93bmVyKHRoaXMuYWtpdGFEQU8udmFsdWUsIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQpID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9QUklaRV9CT1hfT1dORVIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDkKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NDkKICAgIC8vIGFzc2VydChwcml6ZUJveC5jcmVhdG9yID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnByaXplQm94KS5hZGRyZXNzLCBFUlJfTk9UX0FfUFJJWkVfQk9YKQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDYgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQ5CiAgICAvLyBhc3NlcnQocHJpemVCb3guY3JlYXRvciA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5wcml6ZUJveCkuYWRkcmVzcywgRVJSX05PVF9BX1BSSVpFX0JPWCkKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIHByaXplIGJveAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTAKICAgIC8vIGNvbnN0IFtvd25lckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHByaXplQm94LCBCeXRlcyhQcml6ZUJveEdsb2JhbFN0YXRlS2V5T3duZXIpKQogICAgcHVzaGJ5dGVzICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwMQogICAgLy8gYXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBwcml6ZSBib3ggb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwNC0yMDYKICAgIC8vIGNvbnN0IG9wdGluTUJSOiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDUKICAgIC8vID8gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKCmxpc3RQcml6ZUJveF90ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMTYKICAgIC8vIGlmIChpc0FsZ29QYXltZW50KSB7CiAgICBkaWcgNAogICAgYm56IGxpc3RQcml6ZUJveF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTAxCiAgICAvLyByZXR1cm4gKE1pbkRpc2J1cnNlbWVudHNNQlIgKyBVc2VyQWxsb2NhdGlvbk1CUikgKiBjb3VudAogICAgaW50YyA0IC8vIDYwNjAwCiAgICBidXJ5IDEzCgpsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIGNvbnN0IGVzY3Jvd09wdEluQ29zdDogdWludDY0ID0gaXNBbGdvUGF5bWVudAogICAgLy8gICA/IDAKICAgIC8vICAgOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjI0CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyNwogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTIKICAgICsKICAgIGRpZyAxNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyOS0yMzEKICAgIC8vIE1BWF9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBsaXN0aW5nLmdsb2JhbEJ5dGVzKSArCiAgICBpbnRjIDUgLy8gOTM1MDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMjktMjMyCiAgICAvLyBNQVhfUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBsaXN0aW5nLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogbGlzdGluZy5nbG9iYWxCeXRlcykgKwogICAgLy8gY2hpbGRBcHBNQlIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzNS0yNDIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdG90YWxNQlIKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDkKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzOAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzNS0yNDIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdG90YWxNQlIKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGRpZyAzCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDUKICAgIC8vIGNvbnN0IGFwcHJvdmFsUHJvZ3JhbSA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDAsIHRoaXMuYm94ZWRDb250cmFjdC5sZW5ndGgpCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI0NQogICAgLy8gY29uc3QgYXBwcm92YWxQcm9ncmFtID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoMCwgdGhpcy5ib3hlZENvbnRyYWN0Lmxlbmd0aCkKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDgtMjY4CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQuaWQsCiAgICAvLyAgICAgICB0cnVlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgMCwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI1MQogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZC5pZCwKICAgIGRpZyAxMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTYKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTcKICAgIC8vIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIHVuY292ZXIgMwogICAgZ3R4bnMgU2VuZGVyCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjU5CiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MgogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozNAogICAgLy8gY2hpbGRDb250cmFjdFZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBCYXNlRmFjdG9yeUdsb2JhbFN0YXRlS2V5Q2hpbGRDb250cmFjdFZlcnNpb24gfSkKICAgIGJ5dGVjIDcgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjIKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjQKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjQKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQ4LTI2OAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBieXRlYyAxMyAvLyBtZXRob2QgImNyZWF0ZSh1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLChhZGRyZXNzLHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3Msc3RyaW5nLHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTIKICAgIC8vIHRydWUsCiAgICBieXRlYyAxMCAvLyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDgKICAgIC8vIGNvbnN0IGxpc3RpbmcgPSBjb21waWxlQXJjNChMaXN0aW5nKQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAxMCAvLyAxMAogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDgtMjY4CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQuaWQsCiAgICAvLyAgICAgICB0cnVlLAogICAgLy8gICAgICAgcHJpY2UsCiAgICAvLyAgICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIC8vICAgICAgIHJlc2VydmVkRm9yLAogICAgLy8gICAgICAgMCwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjA4CiAgICAvLyBjb25zdCBsaXN0aW5nID0gY29tcGlsZUFyYzQoTGlzdGluZykKICAgIGJ5dGVjIDE0IC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQ4LTI2OAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjQ4LTI3MAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI3My0yNzgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI3NQogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjc2CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgdW5jb3ZlciA0CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjczLTI3NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzMtMjc4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjgxLTI4NAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLAogICAgLy8gICBhcmdzOiBbbGlzdGluZ0FwcC5hZGRyZXNzXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyODMKICAgIC8vIGFyZ3M6IFtsaXN0aW5nQXBwLmFkZHJlc3NdLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjgxLTI4NAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLAogICAgLy8gICBhcmdzOiBbbGlzdGluZ0FwcC5hZGRyZXNzXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNiAvLyBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg2CiAgICAvLyBpZiAoIWlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA0CiAgICBieiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg4LTI5NwogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI5MgogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxMQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyOTEtMjk0CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyODgtMjk3CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBieXRlYyA5IC8vIG1ldGhvZCAib3B0aW4ocGF5LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMDAKICAgIC8vIGlmICghdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihBc3NldChwYXltZW50QXNzZXQpKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAwCiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQocGF5bWVudEFzc2V0KSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgNQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAxCiAgICAvLyB0aGlzLm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKEFraXRhREFPRXNjcm93QWNjb3VudE1hcmtldHBsYWNlLCBBc3NldChwYXltZW50QXNzZXQpLCAwKQogICAgYnl0ZWMgMTUgLy8gInJldl9tYXJrZXRwbGFjZSIKICAgIGRpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBvcHRBa2l0YUVzY3Jvd0luQW5kU2VuZAogICAgcG9wCgpsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4NC0xOTMKICAgIC8vIGxpc3RQcml6ZUJveCgKICAgIC8vICAgcHJpemVCb3hUcmFuc2ZlclR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgcmVzZXJ2ZWRGb3I6IEFjY291bnQsCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkaWcgMTEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmxpc3RQcml6ZUJveF90ZXJuYXJ5X2ZhbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjI1CiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyNQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo2NQogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyNQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyA3CiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgKgogICAgYiBsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAxNAoKbGlzdFByaXplQm94X2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxOQogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE5CiAgICAvLyBkaXNidXJzZW1lbnRNQlIgPSBkaXNidXJzZW1lbnRDb3N0KDQpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBwYXltZW50QXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDUKICAgIGNhbGxzdWIgcmV3YXJkc09wdEluQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBwdXNoaW50IDI0MjQwMCAvLyAyNDI0MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxOQogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgYnVyeSAxMwogICAgYiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAxMQoKbGlzdFByaXplQm94X3Rlcm5hcnlfZmFsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwNgogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgYnVyeSAxMQogICAgYiBsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUA4CgpsaXN0UHJpemVCb3hfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgbGlzdFByaXplQm94X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjpNYXJrZXRwbGFjZS5nYXRlZFB1cmNoYXNlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2F0ZWRQdXJjaGFzZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwOC0zMTMKICAgIC8vIGdhdGVkUHVyY2hhc2UoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTQKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyh0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE1CiAgICAvLyBjb25zdCBvcmlnaW4gPSBvcmlnaW5PclR4blNlbmRlcih3YWxsZXQpCiAgICBjYWxsc3ViIG9yaWdpbk9yVHhuU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTcKICAgIC8vIGFzc2VydChhcHBJZC5jcmVhdG9yID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9BX0xJU1RJTkcpCiAgICBkaWcgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgbGlzdGluZyBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE4CiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMgogICAgYnl0ZWMgOCAvLyAiZ2F0ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMxOQogICAgLy8gYXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBvcmlnaW4sIGdhdGVJRCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTkKICAgIC8vIGFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZ2F0ZUNoZWNrCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMyMC0zMjQKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMyMgogICAgLy8geyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgfSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjAtMzI0CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgeyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDU1CiAgICAvLyBjb25zdCBbZnVuZGVyQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYXBwSWQsIEJ5dGVzKEdsb2JhbFN0YXRlS2V5RnVuZGVyKSkKICAgIGRpZyAxCiAgICBieXRlYyA1IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjcKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogY3JlYXRvciwgYW1vdW50IH0gPSBnZXRGdW5kZXIoYXBwSWQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzMC0zNDAKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzM0CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMzUKICAgIC8vIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICB1bmNvdmVyIDUKICAgIGd0eG5zIEFtb3VudAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzMy0zMzYKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMzAtMzQwCiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzM3CiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzMwLTM0MAogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNyAvLyBtZXRob2QgInB1cmNoYXNlKHBheSxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA1IC8vIDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM0Mi0zNDcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQyLTM0NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQyLTM0NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMDgtMzEzCiAgICAvLyBnYXRlZFB1cmNoYXNlKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLnB1cmNoYXNlW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVyY2hhc2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNTAtMzU0CiAgICAvLyBwdXJjaGFzZSgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNTUKICAgIC8vIGFzc2VydChhcHBJZC5jcmVhdG9yID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9BX0xJU1RJTkcpCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgbGlzdGluZyBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzU2CiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMQogICAgYnl0ZWMgOCAvLyAiZ2F0ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1NwogICAgLy8gYXNzZXJ0KGdhdGVJRCA9PT0gMCwgRVJSX0hBU19HQVRFKQogICAgIQogICAgYXNzZXJ0IC8vIFRoaXMgaGFzIGEgZ2F0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzU4LTM2MgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzYwCiAgICAvLyB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyB9LAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1OC0zNjIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDEKICAgIGJ5dGVjIDUgLy8gImZ1bmRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM2NQogICAgLy8gY29uc3QgeyBhY2NvdW50OiBjcmVhdG9yLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzY4LTM3OAogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzIKICAgIC8vIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM3MwogICAgLy8gYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIHVuY292ZXIgNQogICAgZ3R4bnMgQW1vdW50CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzcxLTM3NAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM2OC0zNzgKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzUKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNjgtMzc4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE3IC8vIG1ldGhvZCAicHVyY2hhc2UocGF5LGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDUgLy8gNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzgwLTM4NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODAtMzg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODAtMzg1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1MC0zNTQKICAgIC8vIHB1cmNoYXNlKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UuZ2F0ZWRQdXJjaGFzZUFzYVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdhdGVkUHVyY2hhc2VBc2E6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODgtMzkzCiAgICAvLyBnYXRlZFB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzk0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5NAogICAgLy8gY29uc3Qgd2FsbGV0ID0gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5NQogICAgLy8gY29uc3Qgb3JpZ2luID0gb3JpZ2luT3JUeG5TZW5kZXIod2FsbGV0KQogICAgY2FsbHN1YiBvcmlnaW5PclR4blNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzk3CiAgICAvLyBhc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgZGlnIDIKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIGxpc3RpbmcgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5OAogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KGFwcElkLCBCeXRlcyhMaXN0aW5nR2xvYmFsU3RhdGVLZXlHYXRlSUQpKVswXQogICAgZGlnIDIKICAgIGJ5dGVjIDggLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozOTkKICAgIC8vIGFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzk5CiAgICAvLyBhc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIG9yaWdpbiwgZ2F0ZUlEKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDUKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGdhdGVDaGVjawogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDAtNDA3CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHsgZ3JlYXRlclRoYW46IDAgfSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgIGRpZyAyCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwMC00MDcKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogeyBncmVhdGVyVGhhbjogMCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgPT0KICAgIGRpZyAzCiAgICBndHhucyBBc3NldEFtb3VudAogICAgc3dhcAogICAgZGlnIDEKICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDIKICAgIGJ5dGVjIDUgLy8gImZ1bmRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMAogICAgLy8gY29uc3QgeyBhY2NvdW50OiByZWNlaXZlciwgYW1vdW50IH0gPSBnZXRGdW5kZXIoYXBwSWQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMy00MjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTcKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgNAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDE5CiAgICAvLyB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICB1bmNvdmVyIDYKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTYtNDIwCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMy00MjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQyMQogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQxMy00MjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBieXRlYyAxOCAvLyBtZXRob2QgInB1cmNoYXNlQXNhKGF4ZmVyLGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDI2LTQyOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDI2LTQyNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQyNi00MjgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM4OC0zOTMKICAgIC8vIGdhdGVkUHVyY2hhc2VBc2EoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBnYXRlVHhuOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjpNYXJrZXRwbGFjZS5wdXJjaGFzZUFzYVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnB1cmNoYXNlQXNhOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMxLTQzNQogICAgLy8gcHVyY2hhc2VBc2EoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDM2CiAgICAvLyBhc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIGxpc3RpbmcgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzNwogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KGFwcElkLCBCeXRlcyhMaXN0aW5nR2xvYmFsU3RhdGVLZXlHYXRlSUQpKVswXQogICAgZGlnIDEKICAgIGJ5dGVjIDggLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MzgKICAgIC8vIGFzc2VydChnYXRlSUQgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgICEKICAgIGFzc2VydCAvLyBUaGlzIGhhcyBhIGdhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzOS00NDYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogeyBncmVhdGVyVGhhbjogMCB9LAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgZGlnIDIKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ0MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDM5LTQ0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIGFzc2V0WGZlciwKICAgIC8vICAgewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB7IGdyZWF0ZXJUaGFuOiAwIH0sCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICA9PQogICAgZGlnIDMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBkaWcgMQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkaWcgMgogICAgYnl0ZWMgNSAvLyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDQ5CiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUyLTQ2MwogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ1NgogICAgLy8gYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyA0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NTgKICAgIC8vIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIHVuY292ZXIgNgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ1NS00NTkKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vIH0pLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUyLTQ2MwogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDYwCiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUyLTQ2MwogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAicHVyY2hhc2VBc2EoYXhmZXIsYWRkcmVzcyxhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NjUtNDY3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NjUtNDY2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDY1LTQ2NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMxLTQzNQogICAgLy8gcHVyY2hhc2VBc2EoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmRlbGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGlzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ3MAogICAgLy8gZGVsaXN0KGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ3MQogICAgLy8gYXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0FfTElTVElORykKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgbGlzdGluZyBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZHVwCiAgICBieXRlYyA1IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzQKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogcmVjZWl2ZXIsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzctNDgwCiAgICAvLyBsaXN0aW5nLmNhbGwuZGVsaXN0KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzkKICAgIC8vIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ3Ny00ODAKICAgIC8vIGxpc3RpbmcuY2FsbC5kZWxpc3QoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4ZTg2MzQzIC8vIG1ldGhvZCAiZGVsaXN0KGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA1IC8vIDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ4Mi00ODQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ4Mi00ODMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0ODItNDg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NzAKICAgIC8vIGRlbGlzdChhcHBJZDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmluaXRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgNyAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQzCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0NAogICAgLy8gaWYgKCF0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKCmluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQyCiAgICAvLyBpbml0Qm94ZWRDb250cmFjdCh2ZXJzaW9uOiBzdHJpbmcsIHNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18zIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgc3dhcAogICAgYm94X3Jlc2l6ZQogICAgYiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmxvYWRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKbG9hZEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1MwogICAgLy8gbG9hZEJveGVkQ29udHJhY3Qob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1NAogICAgLy8gY29uc3QgZXhwZWN0ZWRQcmV2aW91c0NhbGxzOiB1aW50NjQgPSBvZmZzZXQgLyAyMDMyCiAgICBwdXNoaW50IDIwMzIgLy8gMjAzMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTUKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSBleHBlY3RlZFByZXZpb3VzQ2FsbHMgLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny01OQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MAogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkdXAKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjAKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjEKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDExIC8vIG1ldGhvZCAiaW5pdEJveGVkQ29udHJhY3Qoc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYxCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MgogICAgLy8gJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny02MgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgaW50Y18xIC8vIDEKCmxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU2LTYzCiAgICAvLyBhc3NlcnQoKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICAvLyAgICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIC8vICksIEVSUl9JTlZBTElEX0NBTExfT1JERVIpCiAgICBhc3NlcnQgLy8gSW52YWxpZCBjYWxsIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjQKICAgIC8vIGFzc2VydCh0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzLCBFUlJfQ09OVFJBQ1RfTk9UX1NFVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENvbnRyYWN0IG5vdCBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlcGxhY2Uob2Zmc2V0LCBkYXRhKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5kZWxldGVCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZWRDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjXzMgLy8gIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjcwCiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjgKICAgIC8vIGRlbGV0ZUJveGVkQ29udHJhY3QoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1MgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTIKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTQtMTYxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NwogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NC0xNjEKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCksCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU4CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA0CiAgICArCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTQtMTYxCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2My0xNjkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjUKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjYKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTYzLTE2OAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTYzLTE2OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTAKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5Db3N0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTcyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzQKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzQKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTc0CiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3NQogICAgLy8gcmV0dXJuIEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDIKICAgICsKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE3MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0LnVwZGF0ZUFraXRhREFPRXNjcm93W3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU9Fc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzcKICAgIC8vIHVwZGF0ZUFraXRhREFPRXNjcm93KGFwcDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NjUKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18xIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzkKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUgPSBhcHAKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzcKICAgIC8vIHVwZGF0ZUFraXRhREFPRXNjcm93KGFwcDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6VXBncmFkZWFibGVBa2l0YUJhc2VDb250cmFjdC51cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjUwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgQWtpdGEgREFPIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQKICAgIC8vIGNvbnN0IFtwbHVnaW5BcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUGx1Z2luQXBwTGlzdCkpCiAgICBieXRlYyAxOSAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTIKICAgIC8vIGFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhcHAgdXBncmFkZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDEyIC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTMKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IG5ld1ZlcnNpb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMgogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0Lm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKG5hbWU6IGJ5dGVzLCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpvcHRBa2l0YUVzY3Jvd0luQW5kU2VuZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgwCiAgICAvLyBwcm90ZWN0ZWQgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQobmFtZTogc3RyaW5nLCBhc3NldDogQXNzZXQsIGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzIKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIGR1cAogICAgYnl0ZWMgMTkgLy8gInBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgzCiAgICAvLyBjb25zdCB7IHJldmVudWVNYW5hZ2VyIH0gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGRpZyAyCiAgICBieXRlY18zIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3MC03MwogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjcyCiAgICAvLyBhcmdzOiBbW25hbWVdXSwKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDEwMDAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3MC03MwogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuKyh1aW50NjQsYm9vbDEpW10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo3NQogICAgLy8gYXNzZXJ0KGVzY3Jvdy5pZCAhPT0gMCwgRVJSX0VTQ1JPV19ET0VTX05PVF9FWElTVCkKICAgIGV4dHJhY3QgNiA5CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYXNzZXJ0IC8vIEVzY3JvdyBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODYKICAgIC8vIGFzc2VydChpZCA9PT0gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5pZCwgRVJSX1dST05HX0VTQ1JPV19GT1JfT1BFUkFUSU9OKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODYKICAgIC8vIGFzc2VydChpZCA9PT0gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5pZCwgRVJSX1dST05HX0VTQ1JPV19GT1JfT1BFUkFUSU9OKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGVzY3JvdyBmb3IgdGhpcyBvcGVyYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg4LTk3CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHg1ODJmZjM4MiAvLyBtZXRob2QgImFyYzU4X3Jla2V5VG9QbHVnaW4odWludDY0LGJvb2wsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OTIKICAgIC8vIHRydWUsCiAgICBieXRlYyAxMCAvLyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk0CiAgICAvLyBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk1CiAgICAvLyBbXQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg4LTk3CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgbmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMDEKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk5LTEwMwogICAgLy8gY29uc3Qgb3B0SW5Db3VudCA9IHNwbGl0T3B0SW5Db3VudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhc3NldAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMDUKICAgIC8vIGNvbnN0IG1ickFtb3VudDogdWludDY0ID0gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogb3B0SW5Db3VudAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE0CiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMTMtMTE2CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG1ickFtb3VudAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEwCiAgICAvLyB3YWxsZXQsCiAgICBkaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTEyCiAgICAvLyBbYXNzZXQuaWRdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjkyCiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTAgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEwNy0xMTgKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7IGFwcElkOiB3YWxsZXQgfSkKICAgIGl0eG5fbmV4dAogICAgcHVzaGJ5dGVzIDB4NmNjM2Y2MDYgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMgogICAgLy8gaWYgKGFtb3VudCA+IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjMtMTI5CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0KAogICAgLy8gICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyNQogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjY1CiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTI1CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyNC0xMjgKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCgpvcHRBa2l0YUVzY3Jvd0luQW5kU2VuZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzIKICAgIC8vIGl0eG5Db21wb3NlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM0CiAgICAvLyByZXR1cm4gbWJyQW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCg==\",\"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/**\n * The argument types for the Marketplace contract\n */\nexport type MarketplaceArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,string,uint64,uint64)void': {\n version: string\n childVersion: string\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n name: string\n proof: Uint8Array[]\n }\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': {\n prizeBoxTransferTxn: AppMethodCallTransactionArgument\n payment: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n }\n 'gatedPurchase(pay,appl,uint64,address)void': {\n payment?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchase(pay,uint64,address)void': {\n payment: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': {\n assetXfer?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchaseAsa(axfer,uint64,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'delist(uint64)void': {\n appId: bigint | number\n }\n 'initBoxedContract(string,uint64)void': {\n version: string\n size: bigint | number\n }\n 'loadBoxedContract(uint64,byte[])void': {\n offset: bigint | number\n data: Uint8Array\n }\n 'deleteBoxedContract()void': Record<string, never>\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'updateAkitaDAOEscrow(uint64)void': {\n app: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,string,uint64,uint64)void': [version: string, childVersion: string, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string, name: string, proof: Uint8Array[]]\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': [prizeBoxTransferTxn: AppMethodCallTransactionArgument, payment: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string]\n 'gatedPurchase(pay,appl,uint64,address)void': [payment: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchase(pay,uint64,address)void': [payment: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchaseAsa(axfer,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'delist(uint64)void': [appId: bigint | number]\n 'initBoxedContract(string,uint64)void': [version: string, size: bigint | number]\n 'loadBoxedContract(uint64,byte[])void': [offset: bigint | number, data: Uint8Array]\n 'deleteBoxedContract()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'updateAkitaDAOEscrow(uint64)void': [app: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type MarketplaceReturns = {\n 'create(string,string,uint64,uint64)void': void\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': bigint\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': bigint\n 'gatedPurchase(pay,appl,uint64,address)void': void\n 'purchase(pay,uint64,address)void': void\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': void\n 'purchaseAsa(axfer,uint64,address)void': void\n 'delist(uint64)void': void\n 'initBoxedContract(string,uint64)void': void\n 'loadBoxedContract(uint64,byte[])void': void\n 'deleteBoxedContract()void': void\n 'optIn(pay,uint64)void': void\n 'optInCost(uint64)uint64': bigint\n 'updateAkitaDAOEscrow(uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the Marketplace smart contract.\n */\nexport type MarketplaceTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,string,uint64,uint64)void' | 'create', {\n argsObj: MarketplaceArgs['obj']['create(string,string,uint64,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']\n returns: MarketplaceReturns['create(string,string,uint64,uint64)void']\n }>\n & Record<'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' | 'list', {\n argsObj: MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n argsTuple: MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n returns: MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n }>\n & Record<'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' | 'listPrizeBox', {\n argsObj: MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n argsTuple: MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n returns: MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n }>\n & Record<'gatedPurchase(pay,appl,uint64,address)void' | 'gatedPurchase', {\n argsObj: MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void']\n }>\n & Record<'purchase(pay,uint64,address)void' | 'purchase', {\n argsObj: MarketplaceArgs['obj']['purchase(pay,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']\n returns: MarketplaceReturns['purchase(pay,uint64,address)void']\n }>\n & Record<'gatedPurchaseAsa(axfer,appl,uint64,address)void' | 'gatedPurchaseAsa', {\n argsObj: MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n }>\n & Record<'purchaseAsa(axfer,uint64,address)void' | 'purchaseAsa', {\n argsObj: MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']\n returns: MarketplaceReturns['purchaseAsa(axfer,uint64,address)void']\n }>\n & Record<'delist(uint64)void' | 'delist', {\n argsObj: MarketplaceArgs['obj']['delist(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['delist(uint64)void']\n returns: MarketplaceReturns['delist(uint64)void']\n }>\n & Record<'initBoxedContract(string,uint64)void' | 'initBoxedContract', {\n argsObj: MarketplaceArgs['obj']['initBoxedContract(string,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']\n returns: MarketplaceReturns['initBoxedContract(string,uint64)void']\n }>\n & Record<'loadBoxedContract(uint64,byte[])void' | 'loadBoxedContract', {\n argsObj: MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void']\n argsTuple: MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']\n returns: MarketplaceReturns['loadBoxedContract(uint64,byte[])void']\n }>\n & Record<'deleteBoxedContract()void' | 'deleteBoxedContract', {\n argsObj: MarketplaceArgs['obj']['deleteBoxedContract()void']\n argsTuple: MarketplaceArgs['tuple']['deleteBoxedContract()void']\n returns: MarketplaceReturns['deleteBoxedContract()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: MarketplaceArgs['obj']['optIn(pay,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['optIn(pay,uint64)void']\n returns: MarketplaceReturns['optIn(pay,uint64)void']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: MarketplaceArgs['obj']['optInCost(uint64)uint64']\n argsTuple: MarketplaceArgs['tuple']['optInCost(uint64)uint64']\n returns: MarketplaceReturns['optInCost(uint64)uint64']\n }>\n & Record<'updateAkitaDAOEscrow(uint64)void' | 'updateAkitaDAOEscrow', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']\n returns: MarketplaceReturns['updateAkitaDAOEscrow(uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: MarketplaceArgs['obj']['update(string)void']\n argsTuple: MarketplaceArgs['tuple']['update(string)void']\n returns: MarketplaceReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: MarketplaceReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: MarketplaceArgs['obj']['opUp()void']\n argsTuple: MarketplaceArgs['tuple']['opUp()void']\n returns: MarketplaceReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the current version of the child contract\n */\n childContractVersion: string\n /**\n * the app ID for the akita DAO escrow to use\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {\n boxedContract: BinaryState\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type MarketplaceSignatures = keyof MarketplaceTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type MarketplaceNonVoidMethodSignatures = keyof MarketplaceTypes['methods'] extends infer T ? T extends keyof MarketplaceTypes['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 Marketplace smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Marketplace smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = MarketplaceTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = MarketplaceTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type MarketplaceCreateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & {method: 'create(string,string,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type MarketplaceUpdateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type MarketplaceDeployParams = 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?: MarketplaceCreateCallParams\n /**\n * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n updateParams?: MarketplaceUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Marketplace smart contract\n */\nexport abstract class MarketplaceParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends MarketplaceCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,string,uint64,uint64)void':\n return MarketplaceParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Marketplace smart contract using the create(string,string,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,string,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends MarketplaceUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return MarketplaceParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the Marketplace smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace, params.args.name, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prizeBoxTransferTxn, params.args.payment, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchase(pay,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchase(pay,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchase(pay,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchase(pay,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchaseAsa(axfer,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchaseAsa(axfer,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchaseAsa(axfer,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the delist(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'delist(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.appId],\n }\n }\n /**\n * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'initBoxedContract(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size],\n }\n }\n /**\n * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'loadBoxedContract(uint64,byte[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data],\n }\n }\n /**\n * Constructs a no op call for the deleteBoxedContract()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteBoxedContract()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.app],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['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 Marketplace smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class MarketplaceFactory {\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 `MarketplaceFactory`\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 MarketplaceClient(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 MarketplaceClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Marketplace 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: MarketplaceDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? MarketplaceParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (MarketplaceCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? MarketplaceParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (MarketplaceUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new MarketplaceClient(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 Marketplace smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(MarketplaceParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(MarketplaceParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(MarketplaceParamsFactory.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 Marketplace smart contract using an ABI method call using the create(string,string,uint64,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,uint64)void'] | MarketplaceArgs['tuple']['create(string,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(MarketplaceParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | MarketplaceReturns['create(string,string,uint64,uint64)void']) }, appClient: new MarketplaceClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Marketplace smart contract\n */\nexport class MarketplaceClient {\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 `MarketplaceClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Marketplace app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `MarketplaceClient`\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 MarketplaceNonVoidMethodSignatures>(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 `MarketplaceClient` 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<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `MarketplaceClient` 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<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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 Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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 Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(MarketplaceParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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 Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n list: async (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.list(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n listPrizeBox: async (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.listPrizeBox(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchase: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchase: async (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchase(pay,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n delist: async (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.delist(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['delist(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n initBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.initBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['initBoxedContract(string,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n loadBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.loadBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['loadBoxedContract(uint64,byte[])void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['deleteBoxedContract()void'])}\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAOEscrow(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace 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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['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 MarketplaceClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return result.return as unknown as MarketplaceReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Methods to access state for the current Marketplace app\n */\n state = {\n /**\n * Methods to access global state for the current Marketplace app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n childContractVersion: result.childContractVersion,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the childContractVersion key in global state\n */\n childContractVersion: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"childContractVersion\")) as string | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current Marketplace app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n boxedContract: new BinaryStateValue(result.boxedContract),\n }\n },\n /**\n * Get the current value of the boxedContract key in box state\n */\n boxedContract: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.box.getValue(\"boxedContract\")) as Uint8Array | undefined) },\n },\n }\n\n public newGroup(): MarketplaceComposer {\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 list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 method call against the Marketplace contract\n */\n list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.list(params)))\n resultMappers.push((v) => client.decodeReturnValue('list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64', v))\n return this\n },\n /**\n * Add a listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 method call against the Marketplace contract\n */\n listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.listPrizeBox(params)))\n resultMappers.push((v) => client.decodeReturnValue('listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64', v))\n return this\n },\n /**\n * Add a gatedPurchase(pay,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchase(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a purchase(pay,uint64,address)void method call against the Marketplace contract\n */\n purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchase(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a gatedPurchaseAsa(axfer,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchaseAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a purchaseAsa(axfer,uint64,address)void method call against the Marketplace contract\n */\n purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a delist(uint64)void method call against the Marketplace contract\n */\n delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.delist(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a initBoxedContract(string,uint64)void method call against the Marketplace contract\n */\n initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a loadBoxedContract(uint64,byte[])void method call against the Marketplace contract\n */\n loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteBoxedContract()void method call against the Marketplace contract\n */\n deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the Marketplace contract\n */\n optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the Marketplace contract\n */\n optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n resultMappers.push((v) => client.decodeReturnValue('optInCost(uint64)uint64', v))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow(uint64)void method call against the Marketplace contract\n */\n updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Marketplace contract\n */\n updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['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 Marketplace contract\n */\n opUp(params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n get update() {\n return {\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Marketplace 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 MarketplaceComposer\n }\n}\nexport type MarketplaceComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])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 list(params?: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | undefined]>\n\n /**\n * Calls the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)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 listPrizeBox(params?: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | undefined]>\n\n /**\n * Calls the gatedPurchase(pay,appl,uint64,address)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 gatedPurchase(params?: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchase(pay,uint64,address)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 purchase(params?: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchase(pay,uint64,address)void'] | undefined]>\n\n /**\n * Calls the gatedPurchaseAsa(axfer,appl,uint64,address)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 gatedPurchaseAsa(params?: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchaseAsa(axfer,uint64,address)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 purchaseAsa(params?: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'] | undefined]>\n\n /**\n * Calls the delist(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 delist(params?: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['delist(uint64)void'] | undefined]>\n\n /**\n * Calls the initBoxedContract(string,uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n initBoxedContract(params?: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['initBoxedContract(string,uint64)void'] | undefined]>\n\n /**\n * Calls the loadBoxedContract(uint64,byte[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n loadBoxedContract(params?: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['loadBoxedContract(uint64,byte[])void'] | undefined]>\n\n /**\n * Calls the deleteBoxedContract()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteBoxedContract(params?: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['deleteBoxedContract()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['updateAkitaDAOEscrow(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['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<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['opUp()void'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace 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): MarketplaceComposer<[...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): MarketplaceComposer<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<MarketplaceComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<MarketplaceComposerResults<TReturns>>\n}\nexport type MarketplaceComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Listing\",\"structs\":{\"FunderInfo\":[{\"name\":\"account\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"uint64\",\"name\":\"prize\"},{\"type\":\"bool\",\"name\":\"isPrizeBox\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"seller\"},{\"type\":\"(address,uint64)\",\"struct\":\"FunderInfo\",\"name\":\"funder\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"creatorRoyalty\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"uint64\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"desc\":\"create the listing application\",\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"- the payment for purchasing the asset\"},{\"type\":\"address\",\"name\":\"buyer\",\"desc\":\"- the buyer of the asset\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"address\",\"name\":\"buyer\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"address\",\"name\":\"caller\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"desc\":\"Deletes the app and returns the asset/mbr to the seller\",\"events\":[],\"recommendations\":{}},{\"name\":\"changePrice\",\"args\":[{\"type\":\"uint64\",\"name\":\"price\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"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\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":10,\"bytes\":5},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"prize\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpemU=\",\"desc\":\"the asset for sale: Asset | Application ( Prize Box )\"},\"isPrizeBox\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"aXNfcHJpemVfYm94\",\"desc\":\"whether or not the prize is an asset or a prize box\"},\"price\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpY2U=\",\"desc\":\"the price of the asset\"},\"paymentAsset\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cGF5bWVudF9hc3NldA==\",\"desc\":\"the asset to use for payment\"},\"expiration\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZXhwaXJhdGlvbg==\",\"desc\":\"the timestamp the listing expires on, once this passes all that can be done is delist\"},\"seller\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"c2VsbGVy\",\"desc\":\"the address selling the asset\"},\"reservedFor\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"cmVzZXJ2ZWRfZm9y\",\"desc\":\"the address the sale is reserved for\"},\"creatorRoyalty\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Y3JlYXRvcl9yb3lhbHR5\",\"desc\":\"the amount the creator will get for the sale\"},\"gateID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9pZA==\",\"desc\":\"the gate ID to use to check if the user is qualified to buy\"},\"marketplace\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"bWFya2V0cGxhY2U=\",\"desc\":\"The address of the marketplace that listed the asset to send the fee to\\n\\nIMPORTANT: this is a double sided marketplace fee contract\\nthe marketplace referred to internally in the contract\\nis the listing side marketplace.\\nthe buyer side marketplace provides their address at\\nthe time of purchase\"},\"marketplaceRoyalties\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWFya2V0cGxhY2Vfcm95YWx0aWVz\",\"desc\":\"the amount the marketplaces will get for the sale\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"},\"funder\":{\"keyType\":\"AVMString\",\"valueType\":\"FunderInfo\",\"key\":\"ZnVuZGVy\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[425,584,712,2483],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[320],\"errorMessage\":\"Close out of algo forbidden\"},{\"pc\":[1288,2352],\"errorMessage\":\"Invalid payment\"},{\"pc\":[791,2389,2520,2550],\"errorMessage\":\"Invalid percentage\"},{\"pc\":[1591],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[284,296],\"errorMessage\":\"OnCompletion must be DeleteApplication && can only call when not creating\"},{\"pc\":[211],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[2306],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2702,2718],\"errorMessage\":\"account opted into asset\"},{\"pc\":[361,448,469,482,493,611,1331,1637,2304],\"errorMessage\":\"application exists\"},{\"pc\":[1439,1459,1673,1688,1991],\"errorMessage\":\"asset exists\"},{\"pc\":[1162,1218,1225,1233,1246,1257,1285,1298,1314,1328,1353,1384,1397,1426,1471,1530,1536,1544,1557,1568,1588,1601,1617,1621,1634,1641,1659,1670,1677,1696,1714,1718,1731,1740,1757,1777,1795,1799,1811,1815,1844,1848,1852,1891,1895,1934,1938,1943,1982,1986,2054,2060,2066,2073,2080,2085,2093,2097,2182,2190,2194,2268,2291,2384,2404,2419,2437,2545,2567,2628,2636,2663,2692],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[1090],\"errorMessage\":\"invalid expiration\"},{\"pc\":[722],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[1029],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[971],\"errorMessage\":\"invalid number of bytes for (uint8[32],uint64)\"},{\"pc\":[917],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[430,589,908,927,936,945,990,1001,1042,1053,2261,2284,2329,2488],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[960,982,1015,1199,1208,1511,1520,2038],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[1241,1552],\"errorMessage\":\"listing expired\"},{\"pc\":[1059,1214,1526,2044],\"errorMessage\":\"must be called from the factory\"},{\"pc\":[2270],\"errorMessage\":\"must be the seller\"},{\"pc\":[2056],\"errorMessage\":\"only the seller can delist\"},{\"pc\":[1220],\"errorMessage\":\"payment asset must be algo\"},{\"pc\":[1531],\"errorMessage\":\"payment asset must not be algo\"},{\"pc\":[1261,1572],\"errorMessage\":\"reserved for different address\"},{\"pc\":[1502],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[1190,2321],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMDAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIGJ5dGVjYmxvY2sgInBheW1lbnRfYXNzZXQiICJzZWxsZXIiICJha2l0YV9kYW8iICJwcml6ZSIgMHgwMDAxICJpc19wcml6ZV9ib3giICJwcmljZSIgImV4cGlyYXRpb24iICJyZXNlcnZlZF9mb3IiICJtYXJrZXRwbGFjZSIgMHgxNTFmN2M3NSAiY3JlYXRvcl9yb3lhbHR5IiAiYWtpdGFfZXNjcm93IiAibWFya2V0cGxhY2Vfcm95YWx0aWVzIiAweGFkZjkyYWU0ICJuZnRfZmVlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTgtMjIKICAgIC8vIGV4cG9ydCBjbGFzcyBMaXN0aW5nIGV4dGVuZHMgY2xhc3NlcygKICAgIC8vICAgQWtpdGFCYXNlQ29udHJhY3QsCiAgICAvLyAgIENvbnRyYWN0V2l0aENyZWF0b3JPbmx5T3B0SW4sCiAgICAvLyAgIENoaWxkQ29udHJhY3QKICAgIC8vICkgewogICAgcHVzaGJ5dGVzcyAweDZhMTYzOTNkIDB4NjhlODYzNDMgLy8gbWV0aG9kICJwdXJjaGFzZShwYXksYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImRlbGlzdChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3B1cmNoYXNlX3JvdXRlQDQgbWFpbl9kZWxpc3Rfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4LTIyCiAgICAvLyBleHBvcnQgY2xhc3MgTGlzdGluZyBleHRlbmRzIGNsYXNzZXMoCiAgICAvLyAgIEFraXRhQmFzZUNvbnRyYWN0LAogICAgLy8gICBDb250cmFjdFdpdGhDcmVhdG9yT25seU9wdEluLAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNAogICAgcHVzaGJ5dGVzcyAweDE3MWM5Zjg4IDB4MTkzOTZjNGEgMHgzM2U5MmM5NCAweDg1NGRlZGUwIDB4M2VhMTE4MzIgLy8gbWV0aG9kICJwdXJjaGFzZUFzYShheGZlcixhZGRyZXNzLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiY2hhbmdlUHJpY2UodWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJvcHRpbihwYXksdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBwdXJjaGFzZUFzYSBjaGFuZ2VQcmljZSB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVAMTEgb3B0aW4KICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4LTIyCiAgICAvLyBleHBvcnQgY2xhc3MgTGlzdGluZyBleHRlbmRzIGNsYXNzZXMoCiAgICAvLyAgIEFraXRhQmFzZUNvbnRyYWN0LAogICAgLy8gICBDb250cmFjdFdpdGhDcmVhdG9yT25seU9wdEluLAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHB1c2hieXRlcyAweGQ2ZjExZWE1IC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsKGFkZHJlc3MsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fZGVsaXN0X3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxNAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgRGVsZXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBkZWxpc3QKCm1haW5fcHVyY2hhc2Vfcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQ0CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIHB1cmNoYXNlCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Y3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChha2l0YURBTzogdWludDY0LCBhc3NldDogdWludDY0LCB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwgZXhwaXJhdGlvbjogdWludDY0LCBhbGxvY2F0aW9uczogYnl0ZXMsIHN1bTogdWludDY0LCBjbG9zZU91dDogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUxOAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBhc3NldDogdWludDY0LCB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwgZXhwaXJhdGlvbjogdWludDY0LCBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXSwgc3VtOiB1aW50NjQsIGNsb3NlT3V0OiBib29sZWFuKTogeyBpZDogdWludDY0LCBjb3N0OiB1aW50NjQgfSB7CiAgICBwcm90byA3IDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTE5CiAgICAvLyBhc3NlcnQoYXNzZXQgIT09IDAgfHwgY2xvc2VPdXQgPT09IGZhbHNlLCBFUlJfQ0FOTk9UX0NMT1NFX09VVF9PRl9BTEdPX0ZPUkJJRERFTikKICAgIGZyYW1lX2RpZyAtNgogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF90cnVlQDIKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9mYWxzZUAzCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUAyOgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTkKICAgIC8vIGFzc2VydChhc3NldCAhPT0gMCB8fCBjbG9zZU91dCA9PT0gZmFsc2UsIEVSUl9DQU5OT1RfQ0xPU0VfT1VUX09GX0FMR09fRk9SQklEREVOKQogICAgYXNzZXJ0IC8vIENsb3NlIG91dCBvZiBhbGdvIGZvcmJpZGRlbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgZnJhbWVfZGlnIC03CiAgICBwdXNoYnl0ZXMgImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTIwCiAgICAvLyBjb25zdCByZXdhcmRzQXBwID0gZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5yZXdhcmRzCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjMKICAgIC8vIGxldCBjb3N0OiB1aW50NjQgPSBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMjUzMDAgLy8gMjUzMDAKICAgICoKICAgIHB1c2hpbnQgMzUzMDAgLy8gMzUzMDAKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjQKICAgIC8vIGlmIChhc3NldCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC02CiAgICBibnogY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI5CiAgICAvLyByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTMwCiAgICAvLyBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjgtNTMxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyNS01MzYKICAgIC8vIGlkID0gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICBhbGxvY2F0aW9ucwogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMgogICAgLy8gdGltZVRvVW5sb2NrLAogICAgZnJhbWVfZGlnIC01CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMwogICAgLy8gZXhwaXJhdGlvbiwKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDdiN2RjNWZjIC8vIG1ldGhvZCAiY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChwYXksdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzcKICAgIC8vIHJldHVybiB7IGlkLCBjb3N0IH0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTM4CiAgICAvLyBpZiAoIUFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2lmX2JvZHlAOQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU1MgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTgKICAgIC8vIGlmIChjbG9zZU91dCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTU5CiAgICAvLyB0cmFuc2ZlclR4bi5zZXQoeyBhc3NldENsb3NlVG86IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MgfSkKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDUKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NgogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NS01NjgKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTY5CiAgICAvLyB0cmFuc2ZlclR4biwKICAgIGl0eG5fbmV4dAogICAgZnJhbWVfZGlnIDQKICAgIGJ6IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfbmV4dF9maWVsZEAxNwogICAgZnJhbWVfZGlnIDUKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X25leHRfZmllbGRAMTc6CiAgICBmcmFtZV9kaWcgLTYKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTUyLTU1NgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogc3VtLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NjItNTc0CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdHJhbnNmZXJUeG4sCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzAKICAgIC8vIHRpbWVUb1VubG9jaywKICAgIGZyYW1lX2RpZyAtNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzEKICAgIC8vIGV4cGlyYXRpb24sCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhhZjFhMTRmMiAvLyBtZXRob2QgImNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQocGF5LGF4ZmVyLHVpbnQ2NCx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBnaXR4biAyIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMAoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9pZl9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzOQogICAgLy8gY29zdCArPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAxCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NDAtNTQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NAogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NQogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQzLTU0NgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQwLTU0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NwogICAgLy8gQXNzZXQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQwLTU0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4Mzk0ZWFlYjIgLy8gbWV0aG9kICJvcHRJbihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c2VuZFJlZmVycmFsUGF5bWVudChha2l0YURBTzogdWludDY0LCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnNlbmRSZWZlcnJhbFBheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5MQogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNlbmRSZWZlcnJhbFBheW1lbnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IFJlZmVycmFsUGF5bWVudEluZm8gewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTIKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTywgVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4M2MxYTZmMzMgLy8gbWV0aG9kICJnZXQoYWRkcmVzcylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4W10pCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MQogICAgLy8gaWYgKEJ5dGVzKGRhdGEpLmxlbmd0aCA9PT0gMCB8fCBCeXRlcyhkYXRhKS5sZW5ndGggIT09IDgpIHsKICAgIGxlbgogICAgZHVwCiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2lmX2JvZHlAMTEKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzIgLy8gOAogICAgIT0KICAgIGJ6IHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAxMgoKc2VuZFJlZmVycmFsUGF5bWVudF9pZl9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTIKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2MQogICAgLy8gcmV0dXJuIHJlZmVycmVyT3Iod2FsbGV0SUQsIEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE1NAogICAgLy8gaWYgKHdhbGxldElELmlkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMwogICAgYm56IHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJlZmVycmVyT3JAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5NgogICAgLy8gaWYgKGFtb3VudCA+IDAgJiYgcmVmZXJyZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjY4CiAgICAvLyBjb25zdCBbd2FsbGV0RmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldEZlZXMpKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgIndhbGxldF9mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTgKICAgIC8vIGNvbnN0IHsgcmVmZXJyZXJQZXJjZW50YWdlIH0gPSBnZXRXYWxsZXRGZWVzKGFraXRhREFPKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDEKICAgIC8vIGlmIChyZWZlcnJhbEZlZSA9PT0gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDUKICAgIGZyYW1lX2RpZyAtMQogICAgYnogc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjAyCiAgICAvLyByZWZlcnJhbEZlZSA9IDEKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDIKCnNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDgKICAgIC8vIEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwOQogICAgLy8gKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfV0VFSyksCiAgICBkdXAKICAgIHB1c2hpbnQgNjA0ODAwIC8vIDYwNDgwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MTAKICAgIC8vIFt7IGFkZHJlc3M6IHJlZmVycmVyLCBhbW91bnQ6IHJlZmVycmFsRmVlIH1dLAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDUtNjEzCiAgICAvLyBjb25zdCB7IGNvc3Q6IHJlZmVycmFsTWJyIH0gPSBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICBha2l0YURBTywKICAgIC8vICAgYXNzZXQsCiAgICAvLyAgIEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgT05FX1dFRUspLAogICAgLy8gICBbeyBhZGRyZXNzOiByZWZlcnJlciwgYW1vdW50OiByZWZlcnJhbEZlZSB9XSwKICAgIC8vICAgcmVmZXJyYWxGZWUsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgZGlnIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjEyCiAgICAvLyBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA1LTYxMwogICAgLy8gY29uc3QgeyBjb3N0OiByZWZlcnJhbE1iciB9ID0gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgYWtpdGFEQU8sCiAgICAvLyAgIGFzc2V0LAogICAgLy8gICBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCArIE9ORV9XRUVLKSwKICAgIC8vICAgW3sgYWRkcmVzczogcmVmZXJyZXIsIGFtb3VudDogcmVmZXJyYWxGZWUgfV0sCiAgICAvLyAgIHJlZmVycmFsRmVlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3AKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxNQogICAgLy8gcmV0dXJuIHsgbGVmdG92ZXI6IChhbW91bnQgLSByZWZlcnJhbEZlZSksIHJlZmVycmFsTWJyIH0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjE4CiAgICAvLyByZXR1cm4geyBsZWZ0b3ZlcjogYW1vdW50LCByZWZlcnJhbE1icjogMCB9CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3My0xNzYKICAgIC8vIGNvbnN0IFtyZWZlcnJlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzUKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgcHVzaGJ5dGVzICJyZWZlcnJlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTczLTE3NgogICAgLy8gY29uc3QgW3JlZmVycmVyQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlcikKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjEKICAgIC8vIHJldHVybiByZWZlcnJlck9yKHdhbGxldElELCBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBiIHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWZlcnJlck9yQDE4CgpzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5NQogICAgLy8gcmV0dXJuIGJ0b2koZGF0YSkKICAgIGZyYW1lX2RpZyA0CiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTgyCiAgICAvLyByZXR1cm4gQXBwbGljYXRpb24oZ2V0V2FsbGV0SUQoZXNjcm93RmFjdG9yeSwgYWRkcmVzcykpCiAgICBiIHNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOTQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCA0MCAvLyA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKHVpbnQ4WzMyXSx1aW50NjQpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZHVwCiAgICBjb3ZlciA2CiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgY292ZXIgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzExCiAgICAvLyBhc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgIT09IDAsIEVSUl9NVVNUX0JFX0NBTExFRF9GUk9NX0ZBQ1RPUlkpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGZhY3RvcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTMKICAgIC8vIHRoaXMucHJpemUudmFsdWUgPSBwcml6ZQogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOQogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy5pc1ByaXplQm94LnZhbHVlID0gaXNQcml6ZUJveAogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMQogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNQogICAgLy8gdGhpcy5wcmljZS52YWx1ZSA9IHByaWNlCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE2CiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSA9IEFzc2V0KHBheW1lbnRBc3NldCkKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE3CiAgICAvLyBhc3NlcnQoZXhwaXJhdGlvbiA9PT0gMCB8fCBleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0lOVkFMSURfRVhQSVJBVElPTikKICAgIGJ6IGNyZWF0ZV9ib29sX3RydWVAMwogICAgZGlnIDkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJ6IGNyZWF0ZV9ib29sX2ZhbHNlQDQKCmNyZWF0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpjcmVhdGVfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTcKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID09PSAwIHx8IGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfSU5WQUxJRF9FWFBJUkFUSU9OKQogICAgYXNzZXJ0IC8vIGludmFsaWQgZXhwaXJhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNQogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxOAogICAgLy8gdGhpcy5leHBpcmF0aW9uLnZhbHVlID0gZXhwaXJhdGlvbgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTkKICAgIC8vIHRoaXMuc2VsbGVyLnZhbHVlID0gc2VsbGVyCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9jaGlsZC50czoxMQogICAgLy8gZnVuZGVyID0gR2xvYmFsU3RhdGU8RnVuZGVySW5mbz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5RnVuZGVyIH0pCiAgICBwdXNoYnl0ZXMgImZ1bmRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIwCiAgICAvLyB0aGlzLmZ1bmRlci52YWx1ZSA9IGNsb25lKGZ1bmRlcikKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOQogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIxCiAgICAvLyB0aGlzLnJlc2VydmVkRm9yLnZhbHVlID0gcmVzZXJ2ZWRGb3IKICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MQogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIyCiAgICAvLyB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlID0gY3JlYXRvclJveWFsdHkKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBwdXNoYnl0ZXMgImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyMwogICAgLy8gdGhpcy5nYXRlSUQudmFsdWUgPSBnYXRlSUQKICAgIGRpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NAogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjQKICAgIC8vIHRoaXMubWFya2V0cGxhY2UudmFsdWUgPSBtYXJrZXRwbGFjZQogICAgZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjUKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyNgogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTgKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzI3CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gYWtpdGFEQU9Fc2Nyb3cKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMzAKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMwCiAgICAvLyB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKS5tYXJrZXRwbGFjZUNvbXBvc2FibGVQZXJjZW50YWdlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo5MwogICAgLy8gY29uc3QgW25mdEZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNORlRGZWVzKSkKICAgIGJ5dGVjIDE1IC8vICJuZnRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMwCiAgICAvLyB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKS5tYXJrZXRwbGFjZUNvbXBvc2FibGVQZXJjZW50YWdlCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NgogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTMgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMwCiAgICAvLyB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKS5tYXJrZXRwbGFjZUNvbXBvc2FibGVQZXJjZW50YWdlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOTQKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjcmVhdGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcucHVyY2hhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0NAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgRVJSX01VU1RfQkVfQ0FMTEVEX0ZST01fRkFDVE9SWSkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBmYWN0b3J5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MQogICAgLy8gYXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MQogICAgLy8gYXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHBheW1lbnQgYXNzZXQgbXVzdCBiZSBhbGdvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MgogICAgLy8gYXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTIKICAgIC8vIGFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBwdXJjaGFzZV9ib29sX3RydWVAMwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTIKICAgIC8vIGFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBwdXJjaGFzZV9ib29sX2ZhbHNlQDQKCnB1cmNoYXNlX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCnB1cmNoYXNlX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUyCiAgICAvLyBhc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBhc3NlcnQgLy8gbGlzdGluZyBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gaWYgKHRoaXMucmVzZXJ2ZWRGb3IudmFsdWUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkKICAgIC8vIHJlc2VydmVkRm9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVJlc2VydmVkRm9yIH0pCiAgICBieXRlYyA4IC8vICJyZXNlcnZlZF9mb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gaWYgKHRoaXMucmVzZXJ2ZWRGb3IudmFsdWUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTUKICAgIC8vIGFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5CiAgICAvLyByZXNlcnZlZEZvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlSZXNlcnZlZEZvciB9KQogICAgYnl0ZWMgOCAvLyAicmVzZXJ2ZWRfZm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTUKICAgIC8vIGFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyByZXNlcnZlZCBmb3IgZGlmZmVyZW50IGFkZHJlc3MKCnB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzU4LTM2NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnByaWNlLnZhbHVlLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgMgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYxCiAgICAvLyBzZW5kZXI6IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTgtMzY2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYyCiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTgtMzY2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2MwogICAgLy8gYW1vdW50OiB0aGlzLnByaWNlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzEKICAgIC8vIHByaWNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpY2UgfSkKICAgIGJ5dGVjIDYgLy8gInByaWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjMKICAgIC8vIGFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1OC0zNjYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2OAogICAgLy8gdGhpcy50cmFuc2ZlclB1cmNoYXNlVG9CdXllcihidXllcikKICAgIGRpZyAxCiAgICBjYWxsc3ViIHRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEyNAogICAgLy8gY29uc3QgYW1vdW50cyA9IHRoaXMuZ2V0QW1vdW50cyh0aGlzLnByaWNlLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzEKICAgIC8vIHByaWNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpY2UgfSkKICAgIGJ5dGVjIDYgLy8gInByaWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjQKICAgIC8vIGNvbnN0IGFtb3VudHMgPSB0aGlzLmdldEFtb3VudHModGhpcy5wcmljZS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIGdldEFtb3VudHMKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEyNwogICAgLy8gbGV0IGxlZnRvdmVyOiB1aW50NjQgPSBhbW91bnRzLmFraXRhCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjgKICAgIC8vIGlmIChhbW91bnRzLmFraXRhID4gMCkgewogICAgYnogcHVyY2hhc2VfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjkKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGFtb3VudHMuYWtpdGEpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjkKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIDAsIGFtb3VudHMuYWtpdGEpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc2VuZFJlZmVycmFsUGF5bWVudAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CgpwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzItMTM3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1OAogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUFraXRhREFPRXNjcm93IH0pCiAgICBieXRlYyAxMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTMyLTEzNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzItMTM3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQwLTE0NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQyCiAgICAvLyBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICBkaWcgMwogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQzCiAgICAvLyByZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU0CiAgICAvLyBtYXJrZXRwbGFjZSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZSB9KQogICAgYnl0ZWMgOSAvLyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MwogICAgLy8gcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDAtMTQ0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MC0xNDUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDgtMTUzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IG1hcmtldHBsYWNlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDgtMTUyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IG1hcmtldHBsYWNlLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDgtMTUzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IG1hcmtldHBsYWNlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1NgogICAgLy8gaWYgKHRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjkKICAgIC8vIGlzUHJpemVCb3ggPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5SXNQcml6ZUJveCB9KQogICAgYnl0ZWMgNSAvLyAiaXNfcHJpemVfYm94IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTYKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBwdXJjaGFzZV9lbHNlX2JvZHlAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU3LTE2MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTkKICAgIC8vIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICBkaWcgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTYwCiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjAKICAgIC8vIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTctMTYxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU3LTE2MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3MC0zNzIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3MQogICAgLy8gLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3MC0zNzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcwLTM3MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0NAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHVyY2hhc2VfZWxzZV9ib2R5QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGFzc2V0UHJpemUgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGFzc2V0UHJpemUgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTY3LTE3MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE2OQogICAgLy8gYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTcwCiAgICAvLyByZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgZGlnIDEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjctMTcxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICByZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjctMTcyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICByZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NS0xODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NwogICAgLy8gYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIHN3YXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3OAogICAgLy8gbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgc3dhcAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAiIFNvbGQiCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTc5CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzkKICAgIC8vIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NS0xODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTc1LTE4MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICBub3RlOiBTdHJpbmcoYXNzZXRQcml6ZS5uYW1lKSArICcgU29sZCcsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMTMKCnB1cmNoYXNlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIHB1cmNoYXNlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcucHVyY2hhc2VBc2Fbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZUFzYToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4MwogICAgLy8gQGFiaW1ldGhvZCh7IE9uQ29tcGxldGVBY3Rpb246ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTVVTVF9CRV9DQUxMRURfRlJPTV9GQUNUT1JZKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGZhY3RvcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkwCiAgICAvLyBhc3NlcnQodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgIT09IDAsIEVSUl9QQVlNRU5UX0FTU0VUX01VU1RfTk9UX0JFX0FMR08pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MAogICAgLy8gYXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkICE9PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX05PVF9CRV9BTEdPKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2VydCAvLyBwYXltZW50IGFzc2V0IG11c3Qgbm90IGJlIGFsZ28KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkxCiAgICAvLyBhc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNQogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MQogICAgLy8gYXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IHB1cmNoYXNlQXNhX2Jvb2xfdHJ1ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNQogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MQogICAgLy8gYXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGJ6IHB1cmNoYXNlQXNhX2Jvb2xfZmFsc2VANAoKcHVyY2hhc2VBc2FfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQoKcHVyY2hhc2VBc2FfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTEKICAgIC8vIGFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFzc2VydCAvLyBsaXN0aW5nIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkzCiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOQogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkzCiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5NAogICAgLy8gYXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkKICAgIC8vIHJlc2VydmVkRm9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVJlc2VydmVkRm9yIH0pCiAgICBieXRlYyA4IC8vICJyZXNlcnZlZF9mb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5NAogICAgLy8gYXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlc2VydmVkIGZvciBkaWZmZXJlbnQgYWRkcmVzcwoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTctNDA0CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICBkaWcgMgogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQwMAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTctNDA0CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHRoaXMucHJpY2UudmFsdWUsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1RSQU5TRkVSCiAgICAvLyApCiAgICA9PQogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxCiAgICAvLyBwcmljZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaWNlIH0pCiAgICBieXRlYyA2IC8vICJwcmljZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5Ny00MDQKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBhc3NldFhmZXIsCiAgICAvLyAgIHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogdGhpcy5wcmljZS52YWx1ZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDA2CiAgICAvLyB0aGlzLnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTg3CiAgICAvLyBjb25zdCBhbW91bnRzID0gdGhpcy5nZXRBbW91bnRzKHRoaXMucHJpY2UudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMQogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4NwogICAgLy8gY29uc3QgYW1vdW50cyA9IHRoaXMuZ2V0QW1vdW50cyh0aGlzLnByaWNlLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgZ2V0QW1vdW50cwogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTkwCiAgICAvLyBsZXQgbGVmdG92ZXI6IHVpbnQ2NCA9IGFtb3VudHMuYWtpdGEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MQogICAgLy8gaWYgKGFtb3VudHMuYWtpdGEgPiAwKSB7CiAgICBieiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MgogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTIKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLCBhbW91bnRzLmFraXRhKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MgogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kUmVmZXJyYWxQYXltZW50CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKCnB1cmNoYXNlQXNhX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NS0yMDEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NwogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTgKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk3CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTkKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5OQogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NS0yMDAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbGVmdG92ZXIsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk1LTIwMQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNAogICAgLy8gaWYgKCF0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI5CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA0CiAgICAvLyBpZiAoIXRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNwogICAgLy8gcHJpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcml6ZSB9KQogICAgYnl0ZWNfMyAvLyAicHJpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA3CiAgICAvLyBpZiAoYXNzZXRQcml6ZS5jcmVhdG9yLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNwogICAgLy8gaWYgKGFzc2V0UHJpemUuY3JlYXRvci5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMDgtMjE0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjEwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTEKICAgIC8vIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxMgogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjEyCiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA4LTIxMwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA4LTIxNAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI5CiAgICAvLyBpZiAodGhpcy5tYXJrZXRwbGFjZS52YWx1ZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NAogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjkKICAgIC8vIGlmICh0aGlzLm1hcmtldHBsYWNlLnZhbHVlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyOQogICAgLy8gaWYgKHRoaXMubWFya2V0cGxhY2UudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMwLTIzNgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMyCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTQKICAgIC8vIG1hcmtldHBsYWNlID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlIH0pCiAgICBieXRlYyA5IC8vICJtYXJrZXRwbGFjZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMyCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMzCiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzQKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzNAogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzMC0yMzUKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMwLTIzNgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTAKICAgIC8vIGlmIChtYXJrZXRwbGFjZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1MAogICAgLy8gaWYgKG1hcmtldHBsYWNlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTEtMjU3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjU0CiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyAzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1NQogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUxLTI1NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUxLTI1NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcyLTI3NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc0CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc0CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc1CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzMKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3Mi0yNzYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcyLTI3NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDgtNDEwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDkKICAgIC8vIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDgtNDA5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQwOC00MTAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODMKICAgIC8vIEBhYmltZXRob2QoeyBPbkNvbXBsZXRlQWN0aW9uOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgxCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMzCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgxCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4NAogICAgLy8gW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODQKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMuc2VsbGVyLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMuc2VsbGVyIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzktMjg3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgyCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgzCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3OS0yODcKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLnNlbGxlci52YWx1ZSwgYW1vdW50OiBhbW91bnRzLnNlbGxlciB9XSwKICAgIC8vICAgYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODYKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzktMjg3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMwoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNjAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNjQKICAgIC8vIFt7IGFkZHJlc3M6IG1hcmtldHBsYWNlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICBkaWcgNQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTktMjY3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MgogICAgLy8gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MwogICAgLy8gTUFYX1VJTlQ2NCwKICAgIGludGMgNSAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTktMjY3CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2NgogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1OS0yNjcKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBtYXJrZXRwbGFjZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyMAoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzkKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDMKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU0CiAgICAvLyBtYXJrZXRwbGFjZSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZSB9KQogICAgYnl0ZWMgOSAvLyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MwogICAgLy8gW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzgtMjQ2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQxCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQyCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOC0yNDYKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICAvLyAgIGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDUKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzgtMjQ2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNwoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTcKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjEKICAgIC8vIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICB1bmNvdmVyIDIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNi0yMjQKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTkKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjAKICAgIC8vIE1BWF9VSU5UNjQsCiAgICBpbnRjIDUgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjE2LTIyNAogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICAvLyAgIGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyMwogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNi0yMjQKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICBjYWxsc3ViIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQKICAgIHBvcG4gMgogICAgYiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE0CgpwdXJjaGFzZUFzYV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwdXJjaGFzZUFzYV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmRlbGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGlzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE0CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxNgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgRVJSX01VU1RfQkVfQ0FMTEVEX0ZST01fRkFDVE9SWSkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBmYWN0b3J5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxNwogICAgLy8gYXNzZXJ0KHRoaXMuc2VsbGVyLnZhbHVlID09PSBjYWxsZXIsIEVSUl9PTkxZX1NFTExFUl9DQU5fREVMSVNUKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE3CiAgICAvLyBhc3NlcnQodGhpcy5zZWxsZXIudmFsdWUgPT09IGNhbGxlciwgRVJSX09OTFlfU0VMTEVSX0NBTl9ERUxJU1QpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIHNlbGxlciBjYW4gZGVsaXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyMQogICAgLy8geGZlckFzc2V0OiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjEKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyNQogICAgLy8gY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyOAogICAgLy8gaWYgKCEodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgPT09IDApKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyOAogICAgLy8gaWYgKCEodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgPT09IDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVsaXN0X2Vsc2VfYm9keUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzEKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNwogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzEKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzIKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMwogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzMgogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzNQogICAgLy8gaWYgKHRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjkKICAgIC8vIGlzUHJpemVCb3ggPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5SXNQcml6ZUJveCB9KQogICAgYnl0ZWMgNSAvLyAiaXNfcHJpemVfYm94IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzUKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBkZWxpc3RfZWxzZV9ib2R5QDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM2LTQzOQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM3CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM3CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOAogICAgLy8gYXJnczogW3RoaXMuc2VsbGVyLnZhbHVlXSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM3CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5U2VsbGVyIH0pCiAgICBieXRlY18xIC8vICJzZWxsZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOAogICAgLy8gYXJnczogW3RoaXMuc2VsbGVyLnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzNi00MzkKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oewogICAgLy8gICBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMuc2VsbGVyLnZhbHVlXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNCAvLyBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDAKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMwLTQzMwogICAgLy8gY29uc3QgcGF5bWVudEFzc2V0VHJhbnNmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQtNDI2CiAgICAvLyBjb25zdCBwYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9zdWJtaXQKCmRlbGlzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTQKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmRlbGlzdF9lbHNlX2JvZHlANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQyCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9iZWdpbgogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE5LTQyMgogICAgLy8gY29uc3QgYXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fbmV4dAogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzMC00MzMKICAgIC8vIGNvbnN0IHBheW1lbnRBc3NldFRyYW5zZmVyID0gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fbmV4dAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI0LTQyNgogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGRlbGlzdF9hZnRlcl9pZl9lbHNlQDIwCgpkZWxpc3RfZWxzZV9ib2R5QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDUKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI5CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ1CiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVsaXN0X2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDYtNDQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDcKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDcKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ4CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ4CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ2LTQ0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MAogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI0LTQyNgogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MAogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgZGVsaXN0X2FmdGVyX2lmX2Vsc2VAMjAKCmRlbGlzdF9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE5LTQyMgogICAgLy8gY29uc3QgYXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1MgogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQtNDI2CiAgICAvLyBjb25zdCBwYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzLAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDUyCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkZWxpc3RfYWZ0ZXJfaWZfZWxzZUAyMAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Okxpc3RpbmcuY2hhbmdlUHJpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgpjaGFuZ2VQcmljZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDU3CiAgICAvLyBjaGFuZ2VQcmljZShwcmljZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NTgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLnNlbGxlci52YWx1ZSwgRVJSX01VU1RfQkVfU0VMTEVSKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDU4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5zZWxsZXIudmFsdWUsIEVSUl9NVVNUX0JFX1NFTExFUikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG11c3QgYmUgdGhlIHNlbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMQogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ1OQogICAgLy8gdGhpcy5wcmljZS52YWx1ZSA9IHByaWNlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NTcKICAgIC8vIGNoYW5nZVByaWNlKHByaWNlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo6Q29udHJhY3RXaXRoQ3JlYXRvck9ubHlPcHRJbi5vcHRpbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdGluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUzCiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo1NAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjU2LTYzCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTkKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTYtNjMKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgdW5jb3ZlciAyCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo2MAogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo1Ni02MwogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjY1LTY5CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NjYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NjcKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjY1LTY5CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUzCiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmdldEFtb3VudHMoYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRBbW91bnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MgogICAgLy8gcHJpdmF0ZSBnZXRBbW91bnRzKGFtb3VudDogdWludDY0KTogUm95YWx0eUFtb3VudHMgewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MwogICAgLy8gbGV0IGNyZWF0b3JBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MQogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjMKICAgIC8vIGxldCBjcmVhdG9yQW1vdW50ID0gY2FsY1BlcmNlbnQoYW1vdW50LCB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGVyY2VudGFnZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBmcmFtZV9kaWcgLTEKICAgIG11bHcKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIGRpdncKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2NAogICAgLy8gaWYgKGNyZWF0b3JBbW91bnQgPT09IDAgJiYgdGhpcy5jcmVhdG9yUm95YWx0eS52YWx1ZSA+IDAgJiYgYW1vdW50ID4gMCkgewogICAgYm56IGdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MQogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjQKICAgIC8vIGlmIChjcmVhdG9yQW1vdW50ID09PSAwICYmIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANAogICAgZnJhbWVfZGlnIC0xCiAgICBieiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2NQogICAgLy8gY3JlYXRvckFtb3VudCA9IDEKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDUKCmdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2OAogICAgLy8gY29uc3QgeyBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWluOiBtaW4sIG1hcmtldHBsYWNlU2FsZVBlcmNlbnRhZ2VNYXg6IG1heCB9ID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2OAogICAgLy8gY29uc3QgeyBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWluOiBtaW4sIG1hcmtldHBsYWNlU2FsZVBlcmNlbnRhZ2VNYXg6IG1heCB9ID0gZ2V0TkZURmVlcyh0aGlzLmFraXRhREFPLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OTMKICAgIC8vIGNvbnN0IFtuZnRGZWVzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzTkZURmVlcykpCiAgICBkdXAKICAgIGJ5dGVjIDE1IC8vICJuZnRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjgKICAgIC8vIGNvbnN0IHsgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1pbjogbWluLCBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWF4OiBtYXggfSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjY5CiAgICAvLyBjb25zdCBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuc2VsbGVyLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzcKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjkKICAgIC8vIGNvbnN0IGltcGFjdCA9IGdldFVzZXJJbXBhY3QodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5zZWxsZXIudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ5CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhU29jaWFsQXBwTGlzdCkpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgInNhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM3CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhkNTc0YmIxMCAvLyBtZXRob2QgImdldFVzZXJJbXBhY3QoYWRkcmVzcyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDEwIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMQogICAgLy8gY29uc3QgbWluSW1wYWN0OiB1aW50NjQgPSAoaW1wYWN0ID4gMSkgPyBpbXBhY3QgLSAxIDogMQogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGdldEFtb3VudHNfdGVybmFyeV9mYWxzZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtCgpnZXRBbW91bnRzX3Rlcm5hcnlfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMgogICAgLy8gcmV0dXJuIG1heCAtICgoKG1heCAtIG1pbikgKiBtaW5JbXBhY3QpIC8gSU1QQUNUX0RJVklTT1IpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgNAogICAgLQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgLwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDgKICAgIC8vIGFzc2VydChwIDw9IERJVklTT1IsIEVSUl9JTlZBTElEX1BFUkNFTlRBR0UpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBwZXJjZW50YWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzMKICAgIC8vIGlmIChha2l0YUFtb3VudCA9PT0gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzQKICAgIC8vIGFraXRhQW1vdW50ID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAoKZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjc3CiAgICAvLyBsZXQgbWFya2V0cGxhY2VBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NgogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTMgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzcKICAgIC8vIGxldCBtYXJrZXRwbGFjZUFtb3VudCA9IGNhbGNQZXJjZW50KGFtb3VudCwgdGhpcy5tYXJrZXRwbGFjZVJveWFsdGllcy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBlcmNlbnRhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo3OAogICAgLy8gaWYgKG1hcmtldHBsYWNlQW1vdW50ID09PSAwICYmIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGJueiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU2CiAgICAvLyBtYXJrZXRwbGFjZVJveWFsdGllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlUm95YWx0aWVzIH0pCiAgICBieXRlYyAxMyAvLyAibWFya2V0cGxhY2Vfcm95YWx0aWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo3OAogICAgLy8gaWYgKG1hcmtldHBsYWNlQW1vdW50ID09PSAwICYmIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjc5CiAgICAvLyBtYXJrZXRwbGFjZUFtb3VudCA9IDEKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDIKCmdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6ODIKICAgIC8vIGNvbnN0IHNlbGxlckFtb3VudDogdWludDY0ID0gYW1vdW50IC0gKGNyZWF0b3JBbW91bnQgKyBha2l0YUFtb3VudCArICgyICogbWFya2V0cGxhY2VBbW91bnQpKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgcHVzaGludCAyIC8vIDIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDUKICAgICoKICAgICsKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo4NC04OQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgY3JlYXRvcjogY3JlYXRvckFtb3VudCwKICAgIC8vICAgYWtpdGE6IGFraXRhQW1vdW50LAogICAgLy8gICBtYXJrZXRwbGFjZTogbWFya2V0cGxhY2VBbW91bnQsCiAgICAvLyAgIHNlbGxlcjogc2VsbGVyQW1vdW50LAogICAgLy8gfQogICAgc3dhcAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRBbW91bnRzX3Rlcm5hcnlfZmFsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzMQogICAgLy8gY29uc3QgbWluSW1wYWN0OiB1aW50NjQgPSAoaW1wYWN0ID4gMSkgPyBpbXBhY3QgLSAxIDogMQogICAgaW50Y18xIC8vIDEKICAgIGIgZ2V0QW1vdW50c190ZXJuYXJ5X21lcmdlQDE3CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo6TGlzdGluZy50cmFuc2ZlclB1cmNoYXNlVG9CdXllcihidXllcjogYnl0ZXMpIC0+IHZvaWQ6CnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5MgogICAgLy8gcHJpdmF0ZSB0cmFuc2ZlclB1cmNoYXNlVG9CdXllcihidXllcjogQWNjb3VudCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjkzCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOQogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjkzCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk0LTk3CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtidXllcl0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5NQogICAgLy8gYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNwogICAgLy8gcHJpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcml6ZSB9KQogICAgYnl0ZWNfMyAvLyAicHJpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk1CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk0LTk3CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtidXllcl0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJ0cmFuc2ZlcihhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTAxCiAgICAvLyBjb25zdCBwcml6ZUFzc2V0ID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTAxCiAgICAvLyBjb25zdCBwcml6ZUFzc2V0ID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMDMKICAgIC8vIGlmIChidXllci5pc09wdGVkSW4ocHJpemVBc3NldCkpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyX2Vsc2VfYm9keUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEwNS0xMDgKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogYnV5ZXIsCiAgICAvLyAgIHhmZXJBc3NldDogcHJpemVBc3NldCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTExCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTE1CiAgICAvLyBbeyBhZGRyZXNzOiBidXllciwgYW1vdW50OiBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIH1dLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExNgogICAgLy8gcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMC0xMTgKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHByaXplQXNzZXQuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICAvLyAgIHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIHRydWUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMwogICAgLy8gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExNAogICAgLy8gTUFYX1VJTlQ2NCwKICAgIGludGMgNSAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTAtMTE4CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICBwcml6ZUFzc2V0LmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBidXllciwgYW1vdW50OiBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIH1dLAogICAgLy8gICBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLAogICAgLy8gICB0cnVlCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTcKICAgIC8vIHRydWUKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExMC0xMTgKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHByaXplQXNzZXQuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICAvLyAgIHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIHRydWUKICAgIC8vICkKICAgIGNhbGxzdWIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudAogICAgcG9wbiAyCiAgICByZXRzdWIK\",\"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 FunderInfo = {\n account: string,\n amount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a FunderInfo to the struct representation\n */\nexport function FunderInfoFromTuple(abiTuple: [string, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.FunderInfo, APP_SPEC.structs) as FunderInfo\n}\n\n/**\n * The argument types for the Listing contract\n */\nexport type ListingArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void': {\n prize: bigint | number\n isPrizeBox: boolean\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n seller: string\n funder: FunderInfo\n reservedFor: string\n creatorRoyalty: bigint | number\n gateId: bigint | number\n marketplace: string\n version: string\n akitaDao: bigint | number\n akitaDaoEscrow: bigint | number\n }\n 'purchase(pay,address,address)void': {\n /**\n * - the payment for purchasing the asset\n */\n payment: AppMethodCallTransactionArgument\n /**\n * - the buyer of the asset\n */\n buyer: string\n marketplace: string\n }\n 'purchaseAsa(axfer,address,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n buyer: string\n marketplace: string\n }\n 'delist(address)void': {\n caller: string\n }\n 'changePrice(uint64)void': {\n price: bigint | number\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()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 }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void': [prize: bigint | number, isPrizeBox: boolean, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, seller: string, funder: FunderInfo, reservedFor: string, creatorRoyalty: bigint | number, gateId: bigint | number, marketplace: string, version: string, akitaDao: bigint | number, akitaDaoEscrow: bigint | number]\n 'purchase(pay,address,address)void': [payment: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'purchaseAsa(axfer,address,address)void': [assetXfer: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'delist(address)void': [caller: string]\n 'changePrice(uint64)void': [price: bigint | number]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'optin(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type ListingReturns = {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void': void\n 'purchase(pay,address,address)void': void\n 'purchaseAsa(axfer,address,address)void': void\n 'delist(address)void': void\n 'changePrice(uint64)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'optin(pay,uint64)void': void\n}\n\n/**\n * Defines the types of available calls and state of the Listing smart contract.\n */\nexport type ListingTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void' | 'create', {\n argsObj: ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']\n argsTuple: ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']\n returns: ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']\n }>\n & Record<'purchase(pay,address,address)void' | 'purchase', {\n argsObj: ListingArgs['obj']['purchase(pay,address,address)void']\n argsTuple: ListingArgs['tuple']['purchase(pay,address,address)void']\n returns: ListingReturns['purchase(pay,address,address)void']\n }>\n & Record<'purchaseAsa(axfer,address,address)void' | 'purchaseAsa', {\n argsObj: ListingArgs['obj']['purchaseAsa(axfer,address,address)void']\n argsTuple: ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']\n returns: ListingReturns['purchaseAsa(axfer,address,address)void']\n }>\n & Record<'delist(address)void' | 'delist', {\n argsObj: ListingArgs['obj']['delist(address)void']\n argsTuple: ListingArgs['tuple']['delist(address)void']\n returns: ListingReturns['delist(address)void']\n }>\n & Record<'changePrice(uint64)void' | 'changePrice', {\n argsObj: ListingArgs['obj']['changePrice(uint64)void']\n argsTuple: ListingArgs['tuple']['changePrice(uint64)void']\n returns: ListingReturns['changePrice(uint64)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: ListingArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: ListingArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: ListingReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: ListingArgs['obj']['opUp()void']\n argsTuple: ListingArgs['tuple']['opUp()void']\n returns: ListingReturns['opUp()void']\n }>\n & Record<'optin(pay,uint64)void' | 'optin', {\n argsObj: ListingArgs['obj']['optin(pay,uint64)void']\n argsTuple: ListingArgs['tuple']['optin(pay,uint64)void']\n returns: ListingReturns['optin(pay,uint64)void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the asset for sale: Asset | Application ( Prize Box )\n */\n prize: bigint\n /**\n * whether or not the prize is an asset or a prize box\n */\n isPrizeBox: bigint\n /**\n * the price of the asset\n */\n price: bigint\n /**\n * the asset to use for payment\n */\n paymentAsset: bigint\n /**\n * the timestamp the listing expires on, once this passes all that can be done is delist\n */\n expiration: bigint\n /**\n * the address selling the asset\n */\n seller: string\n /**\n * the address the sale is reserved for\n */\n reservedFor: string\n /**\n * the amount the creator will get for the sale\n */\n creatorRoyalty: bigint\n /**\n * the gate ID to use to check if the user is qualified to buy\n */\n gateId: bigint\n /**\n * The address of the marketplace that listed the asset to send the fee to\n \n IMPORTANT: this is a double sided marketplace fee contract\n the marketplace referred to internally in the contract\n is the listing side marketplace.\n the buyer side marketplace provides their address at\n the time of purchase\n\n */\n marketplace: string\n /**\n * the amount the marketplaces will get for the sale\n */\n marketplaceRoyalties: bigint\n /**\n * the app ID for the akita DAO escrow\n */\n akitaDaoEscrow: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n funder: FunderInfo\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type ListingSignatures = keyof ListingTypes['methods']\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 Listing smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Listing smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = ListingTypes['state']['global']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type ListingCreateCallParams =\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & {method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported delete method params for this smart contract\n */\nexport type ListingDeleteCallParams =\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase'}>\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase(pay,address,address)void'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist(address)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type ListingDeployParams = 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?: ListingCreateCallParams\n /**\n * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n deleteParams?: ListingDeleteCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Listing smart contract\n */\nexport abstract class ListingParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends ListingCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void':\n return ListingParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prize, params.args.isPrizeBox, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.seller, params.args.funder, params.args.reservedFor, params.args.creatorRoyalty, params.args.gateId, params.args.marketplace, params.args.version, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available delete ABI call param factories\n */\n static get delete() {\n return {\n _resolveByMethod<TParams extends ListingDeleteCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'purchase':\n case 'purchase(pay,address,address)void':\n return ListingParamsFactory.delete.purchase(params)\n case 'delist':\n case 'delist(address)void':\n return ListingParamsFactory.delete.delist(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs delete ABI call params for the Listing smart contract using the purchase(pay,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n purchase(params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'purchase(pay,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.buyer, params.args.marketplace],\n }\n },\n /**\n * Constructs delete ABI call params for the Listing smart contract using the delist(address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n delist(params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'delist(address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.caller],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the purchaseAsa(axfer,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.buyer, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the changePrice(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'changePrice(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.price],\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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['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\n/**\n * A factory to create and deploy one or more instance of the Listing smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class ListingFactory {\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 `ListingFactory`\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 ListingClient(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 ListingClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Listing 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: ListingDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? ListingParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (ListingCreateCallParams & { args: Uint8Array[] }) : undefined,\n deleteParams: params.deleteParams?.method ? ListingParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ListingDeleteCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new ListingClient(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 Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(ListingParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployDelete methods\n */\n deployDelete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.purchase(params))\n },\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.delist(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 Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(ListingParamsFactory.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 Listing smart contract using an ABI method call using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(ListingParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,uint64)void']) }, appClient: new ListingClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Listing smart contract\n */\nexport class ListingClient {\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 `ListingClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Listing app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `ListingClient`\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 * Returns a new `ListingClient` 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<ListingClient> {\n return new ListingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `ListingClient` 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<ListingClient> {\n return new ListingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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 Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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 Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n purchase: async (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & SendParams) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.purchase(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchase(pay,address,address)void'])}\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n delist: async (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & SendParams) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.delist(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['delist(address)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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 Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchaseAsa(axfer,address,address)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n changePrice: async (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.changePrice(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['changePrice(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the Listing 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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.optin(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['optin(pay,uint64)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 ListingClient(this.appClient.clone(params))\n }\n\n /**\n * Methods to access state for the current Listing app\n */\n state = {\n /**\n * Methods to access global state for the current Listing 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 prize: result.prize,\n isPrizeBox: result.isPrizeBox,\n price: result.price,\n paymentAsset: result.paymentAsset,\n expiration: result.expiration,\n seller: result.seller,\n reservedFor: result.reservedFor,\n creatorRoyalty: result.creatorRoyalty,\n gateId: result.gateID,\n marketplace: result.marketplace,\n marketplaceRoyalties: result.marketplaceRoyalties,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n funder: result.funder,\n }\n },\n /**\n * Get the current value of the prize key in global state\n */\n prize: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"prize\")) as bigint | undefined },\n /**\n * Get the current value of the isPrizeBox key in global state\n */\n isPrizeBox: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"isPrizeBox\")) as bigint | undefined },\n /**\n * Get the current value of the price key in global state\n */\n price: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"price\")) as bigint | undefined },\n /**\n * Get the current value of the paymentAsset key in global state\n */\n paymentAsset: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"paymentAsset\")) as bigint | undefined },\n /**\n * Get the current value of the expiration key in global state\n */\n expiration: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"expiration\")) as bigint | undefined },\n /**\n * Get the current value of the seller key in global state\n */\n seller: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"seller\")) as string | undefined },\n /**\n * Get the current value of the reservedFor key in global state\n */\n reservedFor: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"reservedFor\")) as string | undefined },\n /**\n * Get the current value of the creatorRoyalty key in global state\n */\n creatorRoyalty: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"creatorRoyalty\")) as bigint | undefined },\n /**\n * Get the current value of the gateID key in global state\n */\n gateId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateID\")) as bigint | undefined },\n /**\n * Get the current value of the marketplace key in global state\n */\n marketplace: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"marketplace\")) as string | undefined },\n /**\n * Get the current value of the marketplaceRoyalties key in global state\n */\n marketplaceRoyalties: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"marketplaceRoyalties\")) as bigint | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n /**\n * Get the current value of the funder key in global state\n */\n funder: async (): Promise<FunderInfo | undefined> => { return (await this.appClient.state.global.getValue(\"funder\")) as FunderInfo | undefined },\n },\n }\n\n public newGroup(): ListingComposer {\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 purchaseAsa(axfer,address,address)void method call against the Listing contract\n */\n purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a changePrice(uint64)void method call against the Listing contract\n */\n changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changePrice(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Listing contract\n */\n updateAkitaDao(params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['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 Listing contract\n */\n opUp(params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['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 optin(pay,uint64)void method call against the Listing contract\n */\n optin(params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['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 get delete() {\n return {\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.purchase(params)))\n resultMappers.push(undefined)\n return this\n },\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delist(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Listing 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 ListingComposer\n }\n}\nexport type ListingComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the purchaseAsa(axfer,address,address)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 purchaseAsa(params?: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchaseAsa(axfer,address,address)void'] | undefined]>\n\n /**\n * Calls the changePrice(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 changePrice(params?: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['changePrice(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['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<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']>): ListingComposer<[...TReturns, ListingReturns['opUp()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<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']>): ListingComposer<[...TReturns, ListingReturns['optin(pay,uint64)void'] | undefined]>\n\n /**\n * Gets available delete methods\n */\n readonly delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchase(params?: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchase(pay,address,address)void'] | undefined]>\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delist(params?: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): ListingComposer<[...TReturns, ListingReturns['delist(address)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Listing 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): ListingComposer<[...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): ListingComposer<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<ListingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<ListingComposerResults<TReturns>>\n}\nexport type ListingComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { BaseSDK } from \"../base\";\nimport {\n ListingClient,\n ListingFactory,\n} from '../generated/ListingClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n ChangePriceParams,\n ListingState,\n} from \"./types\";\n\n/**\n * SDK for interacting with an individual Listing contract.\n * Use this to manage listing state and change prices.\n * Note: Purchases and delisting should be done through the MarketplaceSDK.\n */\nexport class ListingSDK extends BaseSDK<ListingClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: ListingFactory, ...params });\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current state of the listing.\n */\n async state(): Promise<ListingState> {\n const state = await this.client.state.global.getAll();\n\n return {\n prize: state.prize ?? 0n,\n isPrizeBox: state.isPrizeBox as unknown as boolean ?? false,\n price: state.price ?? 0n,\n paymentAsset: state.paymentAsset ?? 0n,\n expiration: state.expiration ?? 0n,\n seller: state.seller?.toString() ?? '',\n reservedFor: state.reservedFor?.toString() ?? '',\n creatorRoyalty: state.creatorRoyalty ?? 0n,\n gateId: state.gateId ?? 0n,\n marketplace: state.marketplace?.toString() ?? '',\n marketplaceRoyalties: state.marketplaceRoyalties ?? 0n,\n };\n }\n\n /**\n * Checks if the listing has expired.\n */\n async isExpired(): Promise<boolean> {\n const listingState = await this.state();\n if (listingState.expiration === 0n) {\n return false; // No expiration set\n }\n const now = BigInt(Math.floor(Date.now() / 1000));\n return now > listingState.expiration;\n }\n\n /**\n * Checks if the listing is reserved for a specific address.\n */\n async isReserved(): Promise<boolean> {\n const listingState = await this.state();\n return listingState.reservedFor !== '' && listingState.reservedFor !== 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ';\n }\n\n // ========== Write Methods ==========\n\n /**\n * Changes the price of the listing.\n * Can only be called by the seller.\n */\n async changePrice({ sender, signer, price }: ChangePriceParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n await this.client.send.changePrice({\n ...sendParams,\n args: { price },\n });\n }\n}\n\n"]}
|