@bitgo-beta/sdk-coin-sol 7.6.4-beta.71 → 7.6.4-beta.710
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/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/cjs/src/bigint-buffer-guard.js +29 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
- package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +128 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.js +311 -0
- package/dist/{src → cjs/src}/lib/constants.d.ts +89 -2
- package/dist/cjs/src/lib/constants.d.ts.map +1 -0
- package/dist/cjs/src/lib/constants.js +269 -0
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
- package/dist/cjs/src/lib/iface.d.ts +526 -0
- package/dist/cjs/src/lib/iface.d.ts.map +1 -0
- package/dist/cjs/src/lib/iface.js +7 -0
- package/dist/{src → cjs/src}/lib/index.d.ts +5 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/index.js +93 -0
- package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.js +1220 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
- package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
- package/dist/cjs/src/lib/keyPair.js +112 -0
- package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
- package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
- package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Resolve.js +199 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenExtensions.js +105 -0
- package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
- package/dist/{src → cjs/src}/lib/transaction.d.ts +22 -0
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/transaction.js +661 -0
- package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +9 -1
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilder.js +388 -0
- package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +14 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.js +222 -0
- package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilder.js +81 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
- package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
- package/dist/cjs/src/lib/utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/utils.js +657 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
- package/dist/cjs/src/register.d.ts +5 -0
- package/dist/cjs/src/register.d.ts.map +1 -0
- package/dist/cjs/src/register.js +29 -0
- package/dist/{src → cjs/src}/sol.d.ts +114 -3
- package/dist/cjs/src/sol.d.ts.map +1 -0
- package/dist/cjs/src/sol.js +1670 -0
- package/dist/{src → cjs/src}/solToken.d.ts +7 -0
- package/dist/cjs/src/solToken.d.ts.map +1 -0
- package/dist/cjs/src/solToken.js +79 -0
- package/dist/cjs/src/tsol.d.ts.map +1 -0
- package/dist/cjs/src/tsol.js +24 -0
- package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
- package/dist/cjs/test/fixtures/sol.js +1433 -0
- package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
- package/dist/cjs/test/resources/sol.d.ts.map +1 -0
- package/dist/cjs/test/resources/sol.js +320 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
- package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
- package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
- package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
- package/dist/cjs/test/unit/keyPair.js +177 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/cjs/test/unit/register.d.ts +2 -0
- package/dist/cjs/test/unit/register.d.ts.map +1 -0
- package/dist/cjs/test/unit/register.js +65 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
- package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
- package/dist/cjs/test/unit/sol.js +5038 -0
- package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
- package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
- package/dist/cjs/test/unit/solToken.js +37 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/test/unit/token2022Resolve.js +252 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/test/unit/tokenExtensions.js +58 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +1108 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
- package/dist/cjs/test/unit/utils.js +628 -0
- package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/versionedTransaction.js +207 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/bigint-buffer-guard.d.ts +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/esm/lib/ataInitializationBuilder.js +191 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/closeAtaBuilder.js +155 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
- package/dist/esm/lib/constants.d.ts +227 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +266 -0
- package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/esm/lib/customInstructionBuilder.js +282 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/esm/lib/explainTransactionWasm.js +301 -0
- package/dist/esm/lib/iface.d.ts +526 -0
- package/dist/esm/lib/iface.d.ts.map +1 -0
- package/dist/esm/lib/iface.js +3 -0
- package/dist/esm/lib/index.d.ts +27 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +27 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/esm/lib/instructionParamsFactory.js +1212 -0
- package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
- package/dist/esm/lib/keyPair.d.ts +32 -0
- package/dist/esm/lib/keyPair.d.ts.map +1 -0
- package/dist/esm/lib/keyPair.js +75 -0
- package/dist/esm/lib/messages/index.d.ts +2 -0
- package/dist/esm/lib/messages/index.js +2 -0
- package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
- package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
- package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/esm/lib/scaledUiAmount.js +108 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/wire-transaction.js +48 -0
- package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/esm/lib/solInstructionFactory.js +1088 -0
- package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
- package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingActivateBuilder.js +122 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
- package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
- package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
- package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
- package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
- package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
- package/dist/esm/lib/token2022Resolve.d.ts +106 -0
- package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/esm/lib/token2022Resolve.js +194 -0
- package/dist/esm/lib/tokenExtensions.d.ts +26 -0
- package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/esm/lib/tokenExtensions.js +99 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/tokenTransferBuilder.js +230 -0
- package/dist/esm/lib/transaction.d.ts +125 -0
- package/dist/esm/lib/transaction.d.ts.map +1 -0
- package/dist/esm/lib/transaction.js +654 -0
- package/dist/esm/lib/transactionBuilder.d.ts +136 -0
- package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilder.js +381 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts +129 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilderFactory.js +218 -0
- package/dist/esm/lib/transferBuilder.d.ts +26 -0
- package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/transferBuilder.js +74 -0
- package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
- package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/esm/lib/transferBuilderV2.js +245 -0
- package/dist/esm/lib/utils.d.ts +205 -0
- package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +619 -0
- package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
- package/dist/esm/lib/walletInitializationBuilder.js +64 -0
- package/dist/esm/register.d.ts +5 -0
- package/dist/esm/register.d.ts.map +1 -0
- package/dist/esm/register.js +24 -0
- package/dist/esm/sol.d.ts +351 -0
- package/dist/esm/sol.d.ts.map +1 -0
- package/dist/esm/sol.js +1629 -0
- package/dist/esm/solToken.d.ts +44 -0
- package/dist/esm/solToken.d.ts.map +1 -0
- package/dist/esm/solToken.js +75 -0
- package/dist/esm/tsol.d.ts +11 -0
- package/dist/esm/tsol.js +20 -0
- package/package.json +36 -16
- package/dist/src/config/token2022StaticConfig.d.ts +0 -3
- package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/src/config/token2022StaticConfig.js +0 -50
- package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
- package/dist/src/lib/ataInitializationBuilder.js +0 -196
- package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
- package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
- package/dist/src/lib/closeAtaBuilder.js +0 -69
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -171
- package/dist/src/lib/customInstructionBuilder.js +0 -289
- package/dist/src/lib/iface.d.ts +0 -244
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -7
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -77
- package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
- package/dist/src/lib/instructionParamsFactory.js +0 -1036
- package/dist/src/lib/jitoStakePoolOperations.js +0 -200
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -63
- package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
- package/dist/src/lib/solInstructionFactory.js +0 -572
- package/dist/src/lib/stakingActivateBuilder.js +0 -120
- package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
- package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
- package/dist/src/lib/stakingDelegateBuilder.js +0 -120
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
- package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
- package/dist/src/lib/token2022Config.d.ts +0 -44
- package/dist/src/lib/token2022Config.d.ts.map +0 -1
- package/dist/src/lib/token2022Config.js +0 -27
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/tokenTransferBuilder.js +0 -188
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -595
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -380
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -202
- package/dist/src/lib/transferBuilder.js +0 -70
- package/dist/src/lib/transferBuilderV2.d.ts +0 -43
- package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
- package/dist/src/lib/transferBuilderV2.js +0 -210
- package/dist/src/lib/utils.js +0 -589
- package/dist/src/lib/walletInitializationBuilder.js +0 -71
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -15
- package/dist/src/sol.d.ts.map +0 -1
- package/dist/src/sol.js +0 -1324
- package/dist/src/solToken.d.ts.map +0 -1
- package/dist/src/solToken.js +0 -69
- package/dist/src/tsol.js +0 -24
- package/dist/test/fixtures/sol.js +0 -1433
- package/dist/test/resources/sol.d.ts.map +0 -1
- package/dist/test/resources/sol.js +0 -320
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
- package/dist/test/unit/fixtures/solBackupKey.js +0 -8
- package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/getBuilderFactory.js +0 -10
- package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.js +0 -412
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
- package/dist/test/unit/keyPair.js +0 -177
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
- package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
- package/dist/test/unit/sol.js +0 -3180
- package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
- package/dist/test/unit/solInstructionFactory.js +0 -454
- package/dist/test/unit/solToken.d.ts.map +0 -1
- package/dist/test/unit/solToken.js +0 -31
- package/dist/test/unit/transaction.d.ts.map +0 -1
- package/dist/test/unit/transaction.js +0 -983
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
- package/dist/test/unit/utils.js +0 -517
- package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
- package/dist/test/unit/versionedTransaction.js +0 -207
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
- /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/tsol.d.ts.map +0 -0
|
@@ -0,0 +1,909 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const src_1 = require("../../../src");
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const testData = __importStar(require("../../resources/sol"));
|
|
42
|
+
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
43
|
+
describe('Solana Confidential Transfer Builder', () => {
|
|
44
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
|
|
45
|
+
const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
|
|
46
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
47
|
+
// Test addresses (Token-2022 mint + ATAs)
|
|
48
|
+
const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
|
|
49
|
+
const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
|
|
50
|
+
const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
|
|
51
|
+
const authorityAddress = account.pub;
|
|
52
|
+
// Valid base58 addresses for context state accounts (any valid Solana pubkey)
|
|
53
|
+
const eqCtxAddress = testData.associatedTokenAccounts.accounts[0].ata;
|
|
54
|
+
const validityCtxAddress = testData.associatedTokenAccounts.accounts[0].pub;
|
|
55
|
+
const rangeCtxAddress = testData.nonceAccount.pub;
|
|
56
|
+
// Hex test data
|
|
57
|
+
const zeroBytes36 = '00'.repeat(36);
|
|
58
|
+
const zeroBytes64 = '00'.repeat(64);
|
|
59
|
+
const proofDataHex = '00'.repeat(320); // typical equality proof size
|
|
60
|
+
const ctBuilder = () => {
|
|
61
|
+
const txBuilder = factory.getConfidentialTransferBuilder();
|
|
62
|
+
txBuilder.nonce(recentBlockHash);
|
|
63
|
+
txBuilder.sender(account.pub);
|
|
64
|
+
return txBuilder;
|
|
65
|
+
};
|
|
66
|
+
/** Access the raw Solana Transaction from the built tx */
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
const solTx = (tx) => tx.solTransaction;
|
|
69
|
+
describe('ConfigureAccount', () => {
|
|
70
|
+
it('should build a configure account instruction with correct 47-byte layout', async () => {
|
|
71
|
+
const builder = ctBuilder();
|
|
72
|
+
builder.configureAccount({
|
|
73
|
+
tokenAddress,
|
|
74
|
+
mintAddress,
|
|
75
|
+
authorityAddress,
|
|
76
|
+
decryptableZeroBalance: zeroBytes36,
|
|
77
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
78
|
+
proofInstructionOffset: 1,
|
|
79
|
+
});
|
|
80
|
+
const tx = await builder.build();
|
|
81
|
+
const instructions = tx.toJson().instructionsData;
|
|
82
|
+
instructions.should.have.length(1);
|
|
83
|
+
instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
|
|
84
|
+
// Verify raw instruction data
|
|
85
|
+
const rawInstructions = solTx(tx).instructions;
|
|
86
|
+
rawInstructions.should.have.length(1);
|
|
87
|
+
const data = rawInstructions[0].data;
|
|
88
|
+
data.length.should.equal(47);
|
|
89
|
+
data[0].should.equal(27); // ConfidentialTransferExtension
|
|
90
|
+
data[1].should.equal(2); // ConfigureAccount
|
|
91
|
+
data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // decryptable_zero_balance
|
|
92
|
+
data.readBigUInt64LE(38).toString().should.equal('65536'); // max pending balance credit counter
|
|
93
|
+
data[46].should.equal(1); // proof_instruction_offset
|
|
94
|
+
// Verify accounts
|
|
95
|
+
const keys = rawInstructions[0].keys;
|
|
96
|
+
keys.should.have.length(4);
|
|
97
|
+
keys[0].pubkey.toString().should.equal(tokenAddress);
|
|
98
|
+
keys[0].isWritable.should.be.true();
|
|
99
|
+
keys[1].pubkey.toString().should.equal(mintAddress);
|
|
100
|
+
keys[1].isWritable.should.be.false();
|
|
101
|
+
keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111'); // instructions sysvar
|
|
102
|
+
keys[3].pubkey.toString().should.equal(authorityAddress);
|
|
103
|
+
keys[3].isSigner.should.be.true();
|
|
104
|
+
});
|
|
105
|
+
it('should use context state address when provided', async () => {
|
|
106
|
+
const contextStateAddress = testData.associatedTokenAccounts.accounts[0].pub;
|
|
107
|
+
const builder = ctBuilder();
|
|
108
|
+
builder.configureAccount({
|
|
109
|
+
tokenAddress,
|
|
110
|
+
mintAddress,
|
|
111
|
+
authorityAddress,
|
|
112
|
+
instructionsSysvarOrContextStateAddress: contextStateAddress,
|
|
113
|
+
decryptableZeroBalance: zeroBytes36,
|
|
114
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
115
|
+
proofInstructionOffset: 0,
|
|
116
|
+
});
|
|
117
|
+
const tx = await builder.build();
|
|
118
|
+
const keys = solTx(tx).instructions[0].keys;
|
|
119
|
+
keys[2].pubkey.toString().should.equal(contextStateAddress);
|
|
120
|
+
const data = solTx(tx).instructions[0].data;
|
|
121
|
+
data[46].should.equal(0); // proof_instruction_offset = 0 (context state)
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('ApplyPendingBalance', () => {
|
|
125
|
+
it('should build an apply pending balance instruction with correct 46-byte layout', async () => {
|
|
126
|
+
const builder = ctBuilder();
|
|
127
|
+
builder.applyPendingBalance({
|
|
128
|
+
tokenAddress,
|
|
129
|
+
authorityAddress,
|
|
130
|
+
expectedPendingBalanceCreditCounter: '3',
|
|
131
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
132
|
+
});
|
|
133
|
+
const tx = await builder.build();
|
|
134
|
+
const instructions = tx.toJson().instructionsData;
|
|
135
|
+
instructions.should.have.length(1);
|
|
136
|
+
instructions[0].type.should.equal('ApplyPendingBalance');
|
|
137
|
+
const rawInstructions = solTx(tx).instructions;
|
|
138
|
+
rawInstructions.should.have.length(1);
|
|
139
|
+
const data = rawInstructions[0].data;
|
|
140
|
+
data.length.should.equal(46);
|
|
141
|
+
data[0].should.equal(27); // ConfidentialTransferExtension
|
|
142
|
+
data[1].should.equal(8); // ApplyPendingBalance
|
|
143
|
+
data.readBigUInt64LE(2).toString().should.equal('3'); // expected_pending_balance_credit_counter
|
|
144
|
+
data.slice(10, 46).toString('hex').should.equal(zeroBytes36); // new_decryptable_available_balance
|
|
145
|
+
// Verify accounts: [token(writable), authority(signer)]
|
|
146
|
+
const keys = rawInstructions[0].keys;
|
|
147
|
+
keys.should.have.length(2);
|
|
148
|
+
keys[0].pubkey.toString().should.equal(tokenAddress);
|
|
149
|
+
keys[0].isWritable.should.be.true();
|
|
150
|
+
keys[1].pubkey.toString().should.equal(authorityAddress);
|
|
151
|
+
keys[1].isSigner.should.be.true();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('Deposit', () => {
|
|
155
|
+
it('should build a deposit instruction with correct 11-byte layout', async () => {
|
|
156
|
+
const builder = ctBuilder();
|
|
157
|
+
builder.confidentialDeposit({
|
|
158
|
+
tokenAddress,
|
|
159
|
+
mintAddress,
|
|
160
|
+
authorityAddress,
|
|
161
|
+
amount: '1000000',
|
|
162
|
+
decimals: 6,
|
|
163
|
+
});
|
|
164
|
+
const tx = await builder.build();
|
|
165
|
+
const instructions = tx.toJson().instructionsData;
|
|
166
|
+
instructions.should.have.length(1);
|
|
167
|
+
instructions[0].type.should.equal('ConfidentialDeposit');
|
|
168
|
+
const rawInstructions = solTx(tx).instructions;
|
|
169
|
+
rawInstructions.should.have.length(1);
|
|
170
|
+
const data = rawInstructions[0].data;
|
|
171
|
+
data.length.should.equal(11);
|
|
172
|
+
data[0].should.equal(27); // ConfidentialTransferExtension
|
|
173
|
+
data[1].should.equal(5); // Deposit
|
|
174
|
+
data.readBigUInt64LE(2).toString().should.equal('1000000'); // amount
|
|
175
|
+
data[10].should.equal(6); // decimals
|
|
176
|
+
// Verify accounts: [token(writable), mint, authority(signer)]
|
|
177
|
+
const keys = rawInstructions[0].keys;
|
|
178
|
+
keys.should.have.length(3);
|
|
179
|
+
keys[0].pubkey.toString().should.equal(tokenAddress);
|
|
180
|
+
keys[0].isWritable.should.be.true();
|
|
181
|
+
keys[1].pubkey.toString().should.equal(mintAddress);
|
|
182
|
+
keys[2].pubkey.toString().should.equal(authorityAddress);
|
|
183
|
+
keys[2].isSigner.should.be.true();
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('Withdraw', () => {
|
|
187
|
+
it('should build a withdraw instruction with correct 49-byte layout and inline proofs', async () => {
|
|
188
|
+
const builder = ctBuilder();
|
|
189
|
+
builder.confidentialWithdraw({
|
|
190
|
+
tokenAddress,
|
|
191
|
+
mintAddress,
|
|
192
|
+
authorityAddress,
|
|
193
|
+
amount: '500000',
|
|
194
|
+
decimals: 6,
|
|
195
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
196
|
+
equalityProofInstructionOffset: 1,
|
|
197
|
+
rangeProofInstructionOffset: 2,
|
|
198
|
+
});
|
|
199
|
+
const tx = await builder.build();
|
|
200
|
+
const instructions = tx.toJson().instructionsData;
|
|
201
|
+
instructions.should.have.length(1);
|
|
202
|
+
instructions[0].type.should.equal('ConfidentialWithdraw');
|
|
203
|
+
const rawInstructions = solTx(tx).instructions;
|
|
204
|
+
rawInstructions.should.have.length(1);
|
|
205
|
+
const data = rawInstructions[0].data;
|
|
206
|
+
data.length.should.equal(49);
|
|
207
|
+
data[0].should.equal(27); // ConfidentialTransferExtension
|
|
208
|
+
data[1].should.equal(6); // Withdraw
|
|
209
|
+
data.readBigUInt64LE(2).toString().should.equal('500000'); // amount
|
|
210
|
+
data[10].should.equal(6); // decimals
|
|
211
|
+
data.slice(11, 47).toString('hex').should.equal(zeroBytes36); // new_decryptable
|
|
212
|
+
data[47].should.equal(1); // equality proof offset
|
|
213
|
+
data[48].should.equal(2); // range proof offset
|
|
214
|
+
// Verify accounts: [token(writable), mint, sysvar, authority(signer)]
|
|
215
|
+
const keys = rawInstructions[0].keys;
|
|
216
|
+
keys.should.have.length(4);
|
|
217
|
+
keys[0].pubkey.toString().should.equal(tokenAddress);
|
|
218
|
+
keys[0].isWritable.should.be.true();
|
|
219
|
+
keys[1].pubkey.toString().should.equal(mintAddress);
|
|
220
|
+
keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
|
|
221
|
+
keys[3].pubkey.toString().should.equal(authorityAddress);
|
|
222
|
+
keys[3].isSigner.should.be.true();
|
|
223
|
+
});
|
|
224
|
+
it('should build a withdraw instruction with context state accounts', async () => {
|
|
225
|
+
const builder = ctBuilder();
|
|
226
|
+
builder.confidentialWithdraw({
|
|
227
|
+
tokenAddress,
|
|
228
|
+
mintAddress,
|
|
229
|
+
authorityAddress,
|
|
230
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
231
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
232
|
+
amount: '500000',
|
|
233
|
+
decimals: 6,
|
|
234
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
235
|
+
equalityProofInstructionOffset: 0,
|
|
236
|
+
rangeProofInstructionOffset: 0,
|
|
237
|
+
});
|
|
238
|
+
const tx = await builder.build();
|
|
239
|
+
const keys = solTx(tx).instructions[0].keys;
|
|
240
|
+
// [token, mint, eqCtx, rgCtx, authority] — no sysvar since all proofs use context state
|
|
241
|
+
keys.should.have.length(5);
|
|
242
|
+
keys[2].pubkey.toString().should.equal(eqCtxAddress);
|
|
243
|
+
keys[3].pubkey.toString().should.equal(rangeCtxAddress);
|
|
244
|
+
keys[4].pubkey.toString().should.equal(authorityAddress);
|
|
245
|
+
keys[4].isSigner.should.be.true();
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe('ConfidentialTransfer', () => {
|
|
249
|
+
it('should build a transfer instruction with correct 169-byte layout and inline proofs', async () => {
|
|
250
|
+
const builder = ctBuilder();
|
|
251
|
+
builder.confidentialTransfer({
|
|
252
|
+
sourceTokenAddress: tokenAddress,
|
|
253
|
+
mintAddress,
|
|
254
|
+
destinationTokenAddress,
|
|
255
|
+
authorityAddress,
|
|
256
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
257
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
258
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
259
|
+
equalityProofInstructionOffset: 1,
|
|
260
|
+
ciphertextValidityProofInstructionOffset: 2,
|
|
261
|
+
rangeProofInstructionOffset: 3,
|
|
262
|
+
});
|
|
263
|
+
const tx = await builder.build();
|
|
264
|
+
const instructions = tx.toJson().instructionsData;
|
|
265
|
+
instructions.should.have.length(1);
|
|
266
|
+
instructions[0].type.should.equal('ConfidentialTransfer');
|
|
267
|
+
const rawInstructions = solTx(tx).instructions;
|
|
268
|
+
rawInstructions.should.have.length(1);
|
|
269
|
+
const data = rawInstructions[0].data;
|
|
270
|
+
data.length.should.equal(169);
|
|
271
|
+
data[0].should.equal(27); // ConfidentialTransferExtension
|
|
272
|
+
data[1].should.equal(7); // Transfer
|
|
273
|
+
data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // new_source_decryptable
|
|
274
|
+
data.slice(38, 102).toString('hex').should.equal(zeroBytes64); // auditor_ct_lo
|
|
275
|
+
data.slice(102, 166).toString('hex').should.equal(zeroBytes64); // auditor_ct_hi
|
|
276
|
+
data[166].should.equal(1); // equality proof offset
|
|
277
|
+
data[167].should.equal(2); // validity proof offset
|
|
278
|
+
data[168].should.equal(3); // range proof offset
|
|
279
|
+
// Verify accounts: [source(writable), mint, dest(writable), sysvar, authority(signer)]
|
|
280
|
+
const keys = rawInstructions[0].keys;
|
|
281
|
+
keys.should.have.length(5);
|
|
282
|
+
keys[0].pubkey.toString().should.equal(tokenAddress);
|
|
283
|
+
keys[0].isWritable.should.be.true();
|
|
284
|
+
keys[1].pubkey.toString().should.equal(mintAddress);
|
|
285
|
+
keys[2].pubkey.toString().should.equal(destinationTokenAddress);
|
|
286
|
+
keys[2].isWritable.should.be.true();
|
|
287
|
+
keys[3].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
|
|
288
|
+
keys[4].pubkey.toString().should.equal(authorityAddress);
|
|
289
|
+
keys[4].isSigner.should.be.true();
|
|
290
|
+
});
|
|
291
|
+
it('should build a transfer instruction with context state accounts', async () => {
|
|
292
|
+
const builder = ctBuilder();
|
|
293
|
+
builder.confidentialTransfer({
|
|
294
|
+
sourceTokenAddress: tokenAddress,
|
|
295
|
+
mintAddress,
|
|
296
|
+
destinationTokenAddress,
|
|
297
|
+
authorityAddress,
|
|
298
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
299
|
+
ciphertextValidityProofContextStateAddress: validityCtxAddress,
|
|
300
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
301
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
302
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
303
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
304
|
+
equalityProofInstructionOffset: 0,
|
|
305
|
+
ciphertextValidityProofInstructionOffset: 0,
|
|
306
|
+
rangeProofInstructionOffset: 0,
|
|
307
|
+
});
|
|
308
|
+
const tx = await builder.build();
|
|
309
|
+
const keys = solTx(tx).instructions[0].keys;
|
|
310
|
+
// [source, mint, dest, eqCtx, validityCtx, rangeCtx, authority] — no sysvar
|
|
311
|
+
keys.should.have.length(7);
|
|
312
|
+
keys[3].pubkey.toString().should.equal(eqCtxAddress);
|
|
313
|
+
keys[4].pubkey.toString().should.equal(validityCtxAddress);
|
|
314
|
+
keys[5].pubkey.toString().should.equal(rangeCtxAddress);
|
|
315
|
+
keys[6].pubkey.toString().should.equal(authorityAddress);
|
|
316
|
+
keys[6].isSigner.should.be.true();
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
describe('VerifyPubkeyValidity', () => {
|
|
320
|
+
it('should build a verify pubkey validity instruction with inline proof data', async () => {
|
|
321
|
+
const builder = ctBuilder();
|
|
322
|
+
builder.verifyPubkeyValidity({ proofData: proofDataHex });
|
|
323
|
+
const tx = await builder.build();
|
|
324
|
+
const rawInstructions = solTx(tx).instructions;
|
|
325
|
+
rawInstructions.should.have.length(1);
|
|
326
|
+
const data = rawInstructions[0].data;
|
|
327
|
+
data[0].should.equal(4); // VerifyPubkeyValidity discriminator
|
|
328
|
+
data.length.should.equal(1 + 320); // discriminator + proof data
|
|
329
|
+
data.slice(1).toString('hex').should.equal(proofDataHex);
|
|
330
|
+
// No accounts for inline proof
|
|
331
|
+
rawInstructions[0].keys.should.have.length(0);
|
|
332
|
+
// Verify program id (canonical on-chain id)
|
|
333
|
+
rawInstructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
|
|
334
|
+
});
|
|
335
|
+
it('should build with context state account (fix #3)', async () => {
|
|
336
|
+
const builder = ctBuilder();
|
|
337
|
+
builder.verifyPubkeyValidity({
|
|
338
|
+
contextStateAccountAddress: eqCtxAddress,
|
|
339
|
+
contextStateAuthorityAddress: authorityAddress,
|
|
340
|
+
});
|
|
341
|
+
const tx = await builder.build();
|
|
342
|
+
const rawIx = solTx(tx).instructions[0];
|
|
343
|
+
const data = rawIx.data;
|
|
344
|
+
data[0].should.equal(4); // VerifyPubkeyValidity discriminator
|
|
345
|
+
// Context state accounts: [contextState(writable), authority]
|
|
346
|
+
rawIx.keys.should.have.length(2);
|
|
347
|
+
rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
|
|
348
|
+
rawIx.keys[0].isWritable.should.be.true();
|
|
349
|
+
rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
describe('VerifyEqualityProof', () => {
|
|
353
|
+
it('should build with inline proof data', async () => {
|
|
354
|
+
const builder = ctBuilder();
|
|
355
|
+
builder.verifyEqualityProof({ proofData: proofDataHex });
|
|
356
|
+
const tx = await builder.build();
|
|
357
|
+
const data = solTx(tx).instructions[0].data;
|
|
358
|
+
data[0].should.equal(3); // VerifyCiphertextCommitmentEquality discriminator
|
|
359
|
+
data.length.should.equal(1 + 320);
|
|
360
|
+
data.slice(1).toString('hex').should.equal(proofDataHex);
|
|
361
|
+
});
|
|
362
|
+
it('should build with context state offset', async () => {
|
|
363
|
+
const builder = ctBuilder();
|
|
364
|
+
builder.verifyEqualityProof({
|
|
365
|
+
contextStateAccountAddress: eqCtxAddress,
|
|
366
|
+
contextStateAuthorityAddress: authorityAddress,
|
|
367
|
+
offset: 0,
|
|
368
|
+
});
|
|
369
|
+
const tx = await builder.build();
|
|
370
|
+
const rawIx = solTx(tx).instructions[0];
|
|
371
|
+
const data = rawIx.data;
|
|
372
|
+
data[0].should.equal(3);
|
|
373
|
+
data.readUInt32LE(1).should.equal(0); // offset as u32
|
|
374
|
+
// Context state accounts: [contextState(writable), authority]
|
|
375
|
+
rawIx.keys.should.have.length(2);
|
|
376
|
+
rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
|
|
377
|
+
rawIx.keys[0].isWritable.should.be.true();
|
|
378
|
+
rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
describe('VerifyValidityProof', () => {
|
|
382
|
+
it('should build with inline proof data', async () => {
|
|
383
|
+
const builder = ctBuilder();
|
|
384
|
+
builder.verifyValidityProof({ proofData: proofDataHex });
|
|
385
|
+
const tx = await builder.build();
|
|
386
|
+
const data = solTx(tx).instructions[0].data;
|
|
387
|
+
data[0].should.equal(12); // VerifyBatchedGroupedCiphertext3HandlesValidity
|
|
388
|
+
data.length.should.equal(1 + 320);
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
describe('VerifyRangeProof', () => {
|
|
392
|
+
it('should build with inline proof data', async () => {
|
|
393
|
+
const builder = ctBuilder();
|
|
394
|
+
builder.verifyRangeProof({ proofData: '00'.repeat(1000) }); // range proof is ~1000 bytes
|
|
395
|
+
const tx = await builder.build();
|
|
396
|
+
const data = solTx(tx).instructions[0].data;
|
|
397
|
+
data[0].should.equal(7); // VerifyBatchedRangeProofU128
|
|
398
|
+
data.length.should.equal(1 + 1000);
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
describe('Multiple instructions (v1 tx simulation)', () => {
|
|
402
|
+
it('should build ApplyPendingBalance + 3 proofs + Transfer in correct order', async () => {
|
|
403
|
+
const builder = ctBuilder();
|
|
404
|
+
builder
|
|
405
|
+
.applyPendingBalance({
|
|
406
|
+
tokenAddress,
|
|
407
|
+
authorityAddress,
|
|
408
|
+
expectedPendingBalanceCreditCounter: '2',
|
|
409
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
410
|
+
})
|
|
411
|
+
.verifyEqualityProof({ proofData: proofDataHex })
|
|
412
|
+
.verifyValidityProof({ proofData: proofDataHex })
|
|
413
|
+
.verifyRangeProof({ proofData: '00'.repeat(1000) })
|
|
414
|
+
.confidentialTransfer({
|
|
415
|
+
sourceTokenAddress: tokenAddress,
|
|
416
|
+
mintAddress,
|
|
417
|
+
destinationTokenAddress,
|
|
418
|
+
authorityAddress,
|
|
419
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
420
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
421
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
422
|
+
equalityProofInstructionOffset: 1,
|
|
423
|
+
ciphertextValidityProofInstructionOffset: 2,
|
|
424
|
+
rangeProofInstructionOffset: 3,
|
|
425
|
+
});
|
|
426
|
+
const tx = await builder.build();
|
|
427
|
+
const instructions = tx.toJson().instructionsData;
|
|
428
|
+
instructions.should.have.length(5);
|
|
429
|
+
instructions[0].type.should.equal('ApplyPendingBalance');
|
|
430
|
+
instructions[1].type.should.equal('VerifyEqualityProof');
|
|
431
|
+
instructions[2].type.should.equal('VerifyValidityProof');
|
|
432
|
+
instructions[3].type.should.equal('VerifyRangeProof');
|
|
433
|
+
instructions[4].type.should.equal('ConfidentialTransfer');
|
|
434
|
+
// Note: Cannot verify toBroadcastFormat() here because 3 proofs (320+320+1000 bytes)
|
|
435
|
+
// + transfer (169B) exceeds v0 tx size limit (1232B). These are v1 transactions (4132B).
|
|
436
|
+
// The instruction data layouts are verified individually in the tests above.
|
|
437
|
+
});
|
|
438
|
+
it('should build ConfigureAccount + VerifyPubkeyValidity', async () => {
|
|
439
|
+
const builder = ctBuilder();
|
|
440
|
+
builder
|
|
441
|
+
.configureAccount({
|
|
442
|
+
tokenAddress,
|
|
443
|
+
mintAddress,
|
|
444
|
+
authorityAddress,
|
|
445
|
+
decryptableZeroBalance: zeroBytes36,
|
|
446
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
447
|
+
proofInstructionOffset: 1,
|
|
448
|
+
})
|
|
449
|
+
.verifyPubkeyValidity({ proofData: proofDataHex });
|
|
450
|
+
const tx = await builder.build();
|
|
451
|
+
const instructions = tx.toJson().instructionsData;
|
|
452
|
+
instructions.should.have.length(2);
|
|
453
|
+
instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
|
|
454
|
+
instructions[1].type.should.equal('VerifyPubkeyValidity');
|
|
455
|
+
const rawTx = tx.toBroadcastFormat();
|
|
456
|
+
src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
describe('Raw transaction validity', () => {
|
|
460
|
+
it('should produce a valid raw transaction', async () => {
|
|
461
|
+
const builder = ctBuilder();
|
|
462
|
+
builder.configureAccount({
|
|
463
|
+
tokenAddress,
|
|
464
|
+
mintAddress,
|
|
465
|
+
authorityAddress,
|
|
466
|
+
decryptableZeroBalance: zeroBytes36,
|
|
467
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
468
|
+
proofInstructionOffset: 1,
|
|
469
|
+
});
|
|
470
|
+
const tx = await builder.build();
|
|
471
|
+
const rawTx = tx.toBroadcastFormat();
|
|
472
|
+
src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
|
|
473
|
+
});
|
|
474
|
+
});
|
|
475
|
+
describe('Validation', () => {
|
|
476
|
+
it('should reject empty builder', async () => {
|
|
477
|
+
const builder = ctBuilder();
|
|
478
|
+
await builder.build().should.be.rejectedWith(/confidential transfer instruction/);
|
|
479
|
+
});
|
|
480
|
+
it('should reject missing tokenAddress on configureAccount', () => {
|
|
481
|
+
const builder = ctBuilder();
|
|
482
|
+
should_1.default.throws(() => builder.configureAccount({
|
|
483
|
+
tokenAddress: '',
|
|
484
|
+
mintAddress,
|
|
485
|
+
authorityAddress,
|
|
486
|
+
decryptableZeroBalance: zeroBytes36,
|
|
487
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
488
|
+
proofInstructionOffset: 1,
|
|
489
|
+
}));
|
|
490
|
+
});
|
|
491
|
+
});
|
|
492
|
+
// ─── Fix-specific tests ────────────────────────────────────────────────────
|
|
493
|
+
describe('Fix #1: signed i8 proof instruction offsets', () => {
|
|
494
|
+
it('should correctly encode negative offset on ConfigureAccount', async () => {
|
|
495
|
+
const builder = ctBuilder();
|
|
496
|
+
builder.configureAccount({
|
|
497
|
+
tokenAddress,
|
|
498
|
+
mintAddress,
|
|
499
|
+
authorityAddress,
|
|
500
|
+
decryptableZeroBalance: zeroBytes36,
|
|
501
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
502
|
+
proofInstructionOffset: -1, // proof is the previous instruction
|
|
503
|
+
});
|
|
504
|
+
const tx = await builder.build();
|
|
505
|
+
const data = solTx(tx).instructions[0].data;
|
|
506
|
+
data[46].should.equal(255); // -1 as i8 = 255 as u8 (two's complement)
|
|
507
|
+
});
|
|
508
|
+
it('should correctly encode negative offset on Withdraw', async () => {
|
|
509
|
+
const builder = ctBuilder();
|
|
510
|
+
builder.confidentialWithdraw({
|
|
511
|
+
tokenAddress,
|
|
512
|
+
mintAddress,
|
|
513
|
+
authorityAddress,
|
|
514
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
515
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
516
|
+
amount: '100',
|
|
517
|
+
decimals: 6,
|
|
518
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
519
|
+
equalityProofInstructionOffset: -1,
|
|
520
|
+
rangeProofInstructionOffset: -2,
|
|
521
|
+
});
|
|
522
|
+
const tx = await builder.build();
|
|
523
|
+
const data = solTx(tx).instructions[0].data;
|
|
524
|
+
data[47].should.equal(255); // -1 as i8
|
|
525
|
+
data[48].should.equal(254); // -2 as i8
|
|
526
|
+
});
|
|
527
|
+
it('should correctly encode negative offsets on Transfer', async () => {
|
|
528
|
+
const builder = ctBuilder();
|
|
529
|
+
builder.confidentialTransfer({
|
|
530
|
+
sourceTokenAddress: tokenAddress,
|
|
531
|
+
mintAddress,
|
|
532
|
+
destinationTokenAddress,
|
|
533
|
+
authorityAddress,
|
|
534
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
535
|
+
ciphertextValidityProofContextStateAddress: validityCtxAddress,
|
|
536
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
537
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
538
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
539
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
540
|
+
equalityProofInstructionOffset: -3,
|
|
541
|
+
ciphertextValidityProofInstructionOffset: -2,
|
|
542
|
+
rangeProofInstructionOffset: -1,
|
|
543
|
+
});
|
|
544
|
+
const tx = await builder.build();
|
|
545
|
+
const data = solTx(tx).instructions[0].data;
|
|
546
|
+
data[166].should.equal(253); // -3 as i8
|
|
547
|
+
data[167].should.equal(254); // -2 as i8
|
|
548
|
+
data[168].should.equal(255); // -1 as i8
|
|
549
|
+
});
|
|
550
|
+
});
|
|
551
|
+
describe('Fix #2: instruction order preservation in parser', () => {
|
|
552
|
+
it('should preserve interleaved CT and custom instruction order', async () => {
|
|
553
|
+
const builder = ctBuilder();
|
|
554
|
+
builder
|
|
555
|
+
.applyPendingBalance({
|
|
556
|
+
tokenAddress,
|
|
557
|
+
authorityAddress,
|
|
558
|
+
expectedPendingBalanceCreditCounter: '1',
|
|
559
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
560
|
+
})
|
|
561
|
+
.verifyEqualityProof({ proofData: proofDataHex })
|
|
562
|
+
.confidentialTransfer({
|
|
563
|
+
sourceTokenAddress: tokenAddress,
|
|
564
|
+
mintAddress,
|
|
565
|
+
destinationTokenAddress,
|
|
566
|
+
authorityAddress,
|
|
567
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
568
|
+
ciphertextValidityProofContextStateAddress: validityCtxAddress,
|
|
569
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
570
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
571
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
572
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
573
|
+
equalityProofInstructionOffset: 0,
|
|
574
|
+
ciphertextValidityProofInstructionOffset: 0,
|
|
575
|
+
rangeProofInstructionOffset: 0,
|
|
576
|
+
});
|
|
577
|
+
const tx = await builder.build();
|
|
578
|
+
const instructions = tx.toJson().instructionsData;
|
|
579
|
+
// Order should be: ApplyPendingBalance, VerifyEqualityProof, ConfidentialTransfer
|
|
580
|
+
instructions.should.have.length(3);
|
|
581
|
+
instructions[0].type.should.equal('ApplyPendingBalance');
|
|
582
|
+
instructions[1].type.should.equal('VerifyEqualityProof');
|
|
583
|
+
instructions[2].type.should.equal('ConfidentialTransfer');
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
describe('Fix #3: VerifyPubkeyValidity context state mode', () => {
|
|
587
|
+
it('should not throw when only context state accounts are provided (no proofData)', async () => {
|
|
588
|
+
const builder = ctBuilder();
|
|
589
|
+
builder.verifyPubkeyValidity({
|
|
590
|
+
contextStateAccountAddress: eqCtxAddress,
|
|
591
|
+
contextStateAuthorityAddress: authorityAddress,
|
|
592
|
+
});
|
|
593
|
+
const tx = await builder.build();
|
|
594
|
+
const rawIx = solTx(tx).instructions[0];
|
|
595
|
+
// Should produce an offset-based instruction, not throw
|
|
596
|
+
rawIx.data[0].should.equal(4);
|
|
597
|
+
rawIx.keys.should.have.length(2);
|
|
598
|
+
});
|
|
599
|
+
});
|
|
600
|
+
describe('Fix #4: context state address required when offset == 0', () => {
|
|
601
|
+
it('should reject Withdraw with offset 0 but missing equality context state address', async () => {
|
|
602
|
+
const builder = ctBuilder();
|
|
603
|
+
builder.confidentialWithdraw({
|
|
604
|
+
tokenAddress,
|
|
605
|
+
mintAddress,
|
|
606
|
+
authorityAddress,
|
|
607
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
608
|
+
amount: '100',
|
|
609
|
+
decimals: 6,
|
|
610
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
611
|
+
equalityProofInstructionOffset: 0, // context state mode but no address
|
|
612
|
+
rangeProofInstructionOffset: 0,
|
|
613
|
+
});
|
|
614
|
+
await builder.build().should.be.rejectedWith(/equalityProofContextStateAddress is required/);
|
|
615
|
+
});
|
|
616
|
+
it('should reject Transfer with offset 0 but missing range context state address', async () => {
|
|
617
|
+
const builder = ctBuilder();
|
|
618
|
+
builder.confidentialTransfer({
|
|
619
|
+
sourceTokenAddress: tokenAddress,
|
|
620
|
+
mintAddress,
|
|
621
|
+
destinationTokenAddress,
|
|
622
|
+
authorityAddress,
|
|
623
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
624
|
+
ciphertextValidityProofContextStateAddress: validityCtxAddress,
|
|
625
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
626
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
627
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
628
|
+
equalityProofInstructionOffset: 0,
|
|
629
|
+
ciphertextValidityProofInstructionOffset: 0,
|
|
630
|
+
rangeProofInstructionOffset: 0, // context state mode but no address
|
|
631
|
+
});
|
|
632
|
+
await builder.build().should.be.rejectedWith(/rangeProofContextStateAddress is required/);
|
|
633
|
+
});
|
|
634
|
+
});
|
|
635
|
+
describe('Fix #5: numeric string validation', () => {
|
|
636
|
+
it('should reject non-numeric amount on Deposit', async () => {
|
|
637
|
+
const builder = ctBuilder();
|
|
638
|
+
builder.confidentialDeposit({
|
|
639
|
+
tokenAddress,
|
|
640
|
+
mintAddress,
|
|
641
|
+
authorityAddress,
|
|
642
|
+
amount: 'abc',
|
|
643
|
+
decimals: 6,
|
|
644
|
+
});
|
|
645
|
+
await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
|
|
646
|
+
});
|
|
647
|
+
it('should reject negative amount on Deposit', async () => {
|
|
648
|
+
const builder = ctBuilder();
|
|
649
|
+
builder.confidentialDeposit({
|
|
650
|
+
tokenAddress,
|
|
651
|
+
mintAddress,
|
|
652
|
+
authorityAddress,
|
|
653
|
+
amount: '-100',
|
|
654
|
+
decimals: 6,
|
|
655
|
+
});
|
|
656
|
+
await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
|
|
657
|
+
});
|
|
658
|
+
it('should reject non-numeric counter on ApplyPendingBalance', async () => {
|
|
659
|
+
const builder = ctBuilder();
|
|
660
|
+
builder.applyPendingBalance({
|
|
661
|
+
tokenAddress,
|
|
662
|
+
authorityAddress,
|
|
663
|
+
expectedPendingBalanceCreditCounter: 'not-a-number',
|
|
664
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
665
|
+
});
|
|
666
|
+
await builder.build().should.be.rejectedWith(/Invalid expectedPendingBalanceCreditCounter/);
|
|
667
|
+
});
|
|
668
|
+
it('should reject non-numeric counter on ConfigureAccount', async () => {
|
|
669
|
+
const builder = ctBuilder();
|
|
670
|
+
builder.configureAccount({
|
|
671
|
+
tokenAddress,
|
|
672
|
+
mintAddress,
|
|
673
|
+
authorityAddress,
|
|
674
|
+
decryptableZeroBalance: zeroBytes36,
|
|
675
|
+
maximumPendingBalanceCreditCounter: 'foo',
|
|
676
|
+
proofInstructionOffset: 1,
|
|
677
|
+
});
|
|
678
|
+
await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter/);
|
|
679
|
+
});
|
|
680
|
+
it('should accept amount of 0 on Deposit', async () => {
|
|
681
|
+
const builder = ctBuilder();
|
|
682
|
+
builder.confidentialDeposit({
|
|
683
|
+
tokenAddress,
|
|
684
|
+
mintAddress,
|
|
685
|
+
authorityAddress,
|
|
686
|
+
amount: '0',
|
|
687
|
+
decimals: 6,
|
|
688
|
+
});
|
|
689
|
+
const tx = await builder.build();
|
|
690
|
+
const data = solTx(tx).instructions[0].data;
|
|
691
|
+
data.readBigUInt64LE(2).toString().should.equal('0');
|
|
692
|
+
});
|
|
693
|
+
});
|
|
694
|
+
describe('Fix #6: canonical ZK proof program ID', () => {
|
|
695
|
+
it('should use canonical zk-elgamal-proof program id', async () => {
|
|
696
|
+
const builder = ctBuilder();
|
|
697
|
+
builder.verifyEqualityProof({ proofData: proofDataHex });
|
|
698
|
+
const tx = await builder.build();
|
|
699
|
+
solTx(tx).instructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
|
|
700
|
+
});
|
|
701
|
+
it('should allow overriding ZK proof program id', async () => {
|
|
702
|
+
const customProgramId = testData.associatedTokenAccounts.accounts[0].pub; // any valid pubkey
|
|
703
|
+
const builder = ctBuilder();
|
|
704
|
+
builder.zkProofProgramId(customProgramId);
|
|
705
|
+
builder.verifyEqualityProof({ proofData: proofDataHex });
|
|
706
|
+
const tx = await builder.build();
|
|
707
|
+
solTx(tx).instructions[0].programId.toString().should.equal(customProgramId);
|
|
708
|
+
});
|
|
709
|
+
});
|
|
710
|
+
describe('Fix #8: from() routing for CT transactions', () => {
|
|
711
|
+
it('should route CT transaction to ConfidentialTransferBuilder on from()', async () => {
|
|
712
|
+
// Build a CT transaction
|
|
713
|
+
const builder = ctBuilder();
|
|
714
|
+
builder.configureAccount({
|
|
715
|
+
tokenAddress,
|
|
716
|
+
mintAddress,
|
|
717
|
+
authorityAddress,
|
|
718
|
+
decryptableZeroBalance: zeroBytes36,
|
|
719
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
720
|
+
proofInstructionOffset: 1,
|
|
721
|
+
});
|
|
722
|
+
const tx = await builder.build();
|
|
723
|
+
const rawTx = tx.toBroadcastFormat();
|
|
724
|
+
// Parse it back via factory.from()
|
|
725
|
+
const parsedBuilder = factory.from(rawTx);
|
|
726
|
+
// Should be a ConfidentialTransferBuilder, not CustomInstructionBuilder
|
|
727
|
+
parsedBuilder.constructor.name.should.equal('ConfidentialTransferBuilder');
|
|
728
|
+
});
|
|
729
|
+
it('should route non-CT custom transaction to CustomInstructionBuilder on from()', async () => {
|
|
730
|
+
// Build a non-CT custom transaction
|
|
731
|
+
const customBuilder = factory.getCustomInstructionBuilder();
|
|
732
|
+
customBuilder.nonce(recentBlockHash);
|
|
733
|
+
customBuilder.sender(account.pub);
|
|
734
|
+
customBuilder.addCustomInstruction({
|
|
735
|
+
programId: 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',
|
|
736
|
+
keys: [],
|
|
737
|
+
data: 'hello',
|
|
738
|
+
});
|
|
739
|
+
const tx = await customBuilder.build();
|
|
740
|
+
const rawTx = tx.toBroadcastFormat();
|
|
741
|
+
// Parse it back via factory.from()
|
|
742
|
+
const parsedBuilder = factory.from(rawTx);
|
|
743
|
+
parsedBuilder.constructor.name.should.equal('CustomInstructionBuilder');
|
|
744
|
+
});
|
|
745
|
+
});
|
|
746
|
+
describe('Fix #9: range validation for decimals and proof offsets', () => {
|
|
747
|
+
it('should reject decimals > 255 on Deposit', async () => {
|
|
748
|
+
const builder = ctBuilder();
|
|
749
|
+
builder.confidentialDeposit({
|
|
750
|
+
tokenAddress,
|
|
751
|
+
mintAddress,
|
|
752
|
+
authorityAddress,
|
|
753
|
+
amount: '100',
|
|
754
|
+
decimals: 256,
|
|
755
|
+
});
|
|
756
|
+
await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
|
|
757
|
+
});
|
|
758
|
+
it('should reject negative decimals on Deposit', async () => {
|
|
759
|
+
const builder = ctBuilder();
|
|
760
|
+
builder.confidentialDeposit({
|
|
761
|
+
tokenAddress,
|
|
762
|
+
mintAddress,
|
|
763
|
+
authorityAddress,
|
|
764
|
+
amount: '100',
|
|
765
|
+
decimals: -1,
|
|
766
|
+
});
|
|
767
|
+
await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
|
|
768
|
+
});
|
|
769
|
+
it('should reject non-integer decimals on Deposit', async () => {
|
|
770
|
+
const builder = ctBuilder();
|
|
771
|
+
builder.confidentialDeposit({
|
|
772
|
+
tokenAddress,
|
|
773
|
+
mintAddress,
|
|
774
|
+
authorityAddress,
|
|
775
|
+
amount: '100',
|
|
776
|
+
decimals: 6.5,
|
|
777
|
+
});
|
|
778
|
+
await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
|
|
779
|
+
});
|
|
780
|
+
it('should reject proof offset > 127 on ConfigureAccount', async () => {
|
|
781
|
+
const builder = ctBuilder();
|
|
782
|
+
builder.configureAccount({
|
|
783
|
+
tokenAddress,
|
|
784
|
+
mintAddress,
|
|
785
|
+
authorityAddress,
|
|
786
|
+
decryptableZeroBalance: zeroBytes36,
|
|
787
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
788
|
+
proofInstructionOffset: 128,
|
|
789
|
+
});
|
|
790
|
+
await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
|
|
791
|
+
});
|
|
792
|
+
it('should reject proof offset < -128 on ConfigureAccount', async () => {
|
|
793
|
+
const builder = ctBuilder();
|
|
794
|
+
builder.configureAccount({
|
|
795
|
+
tokenAddress,
|
|
796
|
+
mintAddress,
|
|
797
|
+
authorityAddress,
|
|
798
|
+
decryptableZeroBalance: zeroBytes36,
|
|
799
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
800
|
+
proofInstructionOffset: -129,
|
|
801
|
+
});
|
|
802
|
+
await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
|
|
803
|
+
});
|
|
804
|
+
it('should reject equality proof offset > 127 on Withdraw', async () => {
|
|
805
|
+
const builder = ctBuilder();
|
|
806
|
+
builder.confidentialWithdraw({
|
|
807
|
+
tokenAddress,
|
|
808
|
+
mintAddress,
|
|
809
|
+
authorityAddress,
|
|
810
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
811
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
812
|
+
amount: '100',
|
|
813
|
+
decimals: 6,
|
|
814
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
815
|
+
equalityProofInstructionOffset: 200,
|
|
816
|
+
rangeProofInstructionOffset: 0,
|
|
817
|
+
});
|
|
818
|
+
await builder.build().should.be.rejectedWith(/Invalid equalityProofInstructionOffset: expected i8/);
|
|
819
|
+
});
|
|
820
|
+
it('should reject range proof offset < -128 on Withdraw', async () => {
|
|
821
|
+
const builder = ctBuilder();
|
|
822
|
+
builder.confidentialWithdraw({
|
|
823
|
+
tokenAddress,
|
|
824
|
+
mintAddress,
|
|
825
|
+
authorityAddress,
|
|
826
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
827
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
828
|
+
amount: '100',
|
|
829
|
+
decimals: 6,
|
|
830
|
+
newDecryptableAvailableBalance: zeroBytes36,
|
|
831
|
+
equalityProofInstructionOffset: 0,
|
|
832
|
+
rangeProofInstructionOffset: -200,
|
|
833
|
+
});
|
|
834
|
+
await builder.build().should.be.rejectedWith(/Invalid rangeProofInstructionOffset: expected i8/);
|
|
835
|
+
});
|
|
836
|
+
it('should reject validity proof offset out of i8 range on Transfer', async () => {
|
|
837
|
+
const builder = ctBuilder();
|
|
838
|
+
builder.confidentialTransfer({
|
|
839
|
+
sourceTokenAddress: tokenAddress,
|
|
840
|
+
mintAddress,
|
|
841
|
+
destinationTokenAddress,
|
|
842
|
+
authorityAddress,
|
|
843
|
+
equalityProofContextStateAddress: eqCtxAddress,
|
|
844
|
+
ciphertextValidityProofContextStateAddress: validityCtxAddress,
|
|
845
|
+
rangeProofContextStateAddress: rangeCtxAddress,
|
|
846
|
+
newSourceDecryptableAvailableBalance: zeroBytes36,
|
|
847
|
+
transferAmountAuditorCiphertextLo: zeroBytes64,
|
|
848
|
+
transferAmountAuditorCiphertextHi: zeroBytes64,
|
|
849
|
+
equalityProofInstructionOffset: 0,
|
|
850
|
+
ciphertextValidityProofInstructionOffset: 255,
|
|
851
|
+
rangeProofInstructionOffset: 0,
|
|
852
|
+
});
|
|
853
|
+
await builder.build().should.be.rejectedWith(/Invalid ciphertextValidityProofInstructionOffset: expected i8/);
|
|
854
|
+
});
|
|
855
|
+
it('should accept boundary offset values (-128 and 127)', async () => {
|
|
856
|
+
const builder = ctBuilder();
|
|
857
|
+
builder.configureAccount({
|
|
858
|
+
tokenAddress,
|
|
859
|
+
mintAddress,
|
|
860
|
+
authorityAddress,
|
|
861
|
+
decryptableZeroBalance: zeroBytes36,
|
|
862
|
+
maximumPendingBalanceCreditCounter: '65536',
|
|
863
|
+
proofInstructionOffset: 127,
|
|
864
|
+
});
|
|
865
|
+
const tx = await builder.build();
|
|
866
|
+
const data = solTx(tx).instructions[0].data;
|
|
867
|
+
data[46].should.equal(127);
|
|
868
|
+
});
|
|
869
|
+
});
|
|
870
|
+
describe('Fix #10: u64 overflow validation', () => {
|
|
871
|
+
it('should reject amount exceeding u64 max on Deposit', async () => {
|
|
872
|
+
const builder = ctBuilder();
|
|
873
|
+
builder.confidentialDeposit({
|
|
874
|
+
tokenAddress,
|
|
875
|
+
mintAddress,
|
|
876
|
+
authorityAddress,
|
|
877
|
+
amount: '18446744073709551616', // 2^64
|
|
878
|
+
decimals: 6,
|
|
879
|
+
});
|
|
880
|
+
await builder.build().should.be.rejectedWith(/Invalid amount: value exceeds u64 max/);
|
|
881
|
+
});
|
|
882
|
+
it('should accept amount at u64 max on Deposit', async () => {
|
|
883
|
+
const builder = ctBuilder();
|
|
884
|
+
builder.confidentialDeposit({
|
|
885
|
+
tokenAddress,
|
|
886
|
+
mintAddress,
|
|
887
|
+
authorityAddress,
|
|
888
|
+
amount: '18446744073709551615', // 2^64 - 1
|
|
889
|
+
decimals: 6,
|
|
890
|
+
});
|
|
891
|
+
const tx = await builder.build();
|
|
892
|
+
const data = solTx(tx).instructions[0].data;
|
|
893
|
+
data.readBigUInt64LE(2).toString().should.equal('18446744073709551615');
|
|
894
|
+
});
|
|
895
|
+
it('should reject counter exceeding u64 max on ConfigureAccount', async () => {
|
|
896
|
+
const builder = ctBuilder();
|
|
897
|
+
builder.configureAccount({
|
|
898
|
+
tokenAddress,
|
|
899
|
+
mintAddress,
|
|
900
|
+
authorityAddress,
|
|
901
|
+
decryptableZeroBalance: zeroBytes36,
|
|
902
|
+
maximumPendingBalanceCreditCounter: '18446744073709551616', // 2^64
|
|
903
|
+
proofInstructionOffset: 1,
|
|
904
|
+
});
|
|
905
|
+
await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter: value exceeds u64 max/);
|
|
906
|
+
});
|
|
907
|
+
});
|
|
908
|
+
});
|
|
909
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBMkQ7QUFDM0Qsb0RBQTRCO0FBQzVCLDhEQUFnRDtBQUNoRCw0REFBeUQ7QUFFekQsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUV2RSwwQ0FBMEM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQztJQUN0RSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoRixNQUFNLHVCQUF1QixHQUFHLDhDQUE4QyxDQUFDO0lBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNyQyw4RUFBOEU7SUFDOUUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1RSxNQUFN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QUFDLENBQUMsWUFBWSxDQUFDO1lBQy9DLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztZQUMxRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNyRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7WUFFckMsOERBQThEO1lBQzlELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFD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ZXlQYWlyLCBVdGlscywgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcblxuZGVzY3JpYmUoJ1NvbGFuYSBDb25maWRlbnRpYWwgVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCdzb2wnKTtcbiAgY29uc3QgYWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdKS5nZXRLZXlzKCk7XG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG5cbiAgLy8gVGVzdCBhZGRyZXNzZXMgKFRva2VuLTIwMjIgbWludCArIEFUQXMpXG4gIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLm1pbnRJZDtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgPSAnRU5uOGEydEdNUzliUjVYVjdzbUdISnZOZ3preXhKbW5EMmVVdlF4WTVqU1AnO1xuICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gYWNjb3VudC5wdWI7XG4gIC8vIFZhbGlkIGJhc2U1OCBhZGRyZXNzZXMgZm9yIGNvbnRleHQgc3RhdGUgYWNjb3VudHMgKGFueSB2YWxpZCBTb2xhbmEgcHVia2V5KVxuICBjb25zdCBlcUN0eEFkZHJlc3MgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5hdGE7XG4gIGNvbnN0IHZhbGlkaXR5Q3R4QWRkcmVzcyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YjtcbiAgY29uc3QgcmFuZ2VDdHhBZGRyZXNzID0gdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YjtcblxuICAvLyBIZXggdGVzdCBkYXRhXG4gIGNvbnN0IHplcm9CeXRlczM2ID0gJzAwJy5yZXBlYXQoMzYpO1xuICBjb25zdCB6ZXJvQnl0ZXM2NCA9ICcwMCcucmVwZWF0KDY0KTtcbiAgY29uc3QgcHJvb2ZEYXRhSGV4ID0gJzAwJy5yZXBlYXQoMzIwKTsgLy8gdHlwaWNhbCBlcXVhbGl0eSBwcm9vZiBzaXplXG5cbiAgY29uc3QgY3RCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICAvKiogQWNjZXNzIHRoZSByYXcgU29sYW5hIFRyYW5zYWN0aW9uIGZyb20gdGhlIGJ1aWx0IHR4ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHNvbFR4ID0gKHR4OiBhbnkpOiBhbnkgPT4gKHR4IGFzIFRyYW5zYWN0aW9uKS5zb2xUcmFuc2FjdGlvbjtcblxuICBkZXNjcmliZSgnQ29uZmlndXJlQWNjb3VudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgY29uZmlndXJlIGFjY291bnQgaW5zdHJ1Y3Rpb24gd2l0aCBjb3JyZWN0IDQ3LWJ5dGUgbGF5b3V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSByYXcgaW5zdHJ1Y3Rpb24gZGF0YVxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDcpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoMik7IC8vIENvbmZpZ3VyZUFjY291bnRcbiAgICAgIGRhdGEuc2xpY2UoMiwgMzgpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBkZWNyeXB0YWJsZV96ZXJvX2JhbGFuY2VcbiAgICAgIGRhdGEucmVhZEJpZ1VJbnQ2NExFKDM4KS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNjU1MzYnKTsgLy8gbWF4IHBlbmRpbmcgYmFsYW5jZSBjcmVkaXQgY291bnRlclxuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBwcm9vZl9pbnN0cnVjdGlvbl9vZmZzZXRcblxuICAgICAgLy8gVmVyaWZ5IGFjY291bnRzXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMV0uaXNXcml0YWJsZS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7IC8vIGluc3RydWN0aW9ucyBzeXN2YXJcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1szXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgY29udGV4dCBzdGF0ZSBhZGRyZXNzIHdoZW4gcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0U3RhdGVBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zU3lzdmFyT3JDb250ZXh0U3RhdGVBZGRyZXNzOiBjb250ZXh0U3RhdGVBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGtleXMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChjb250ZXh0U3RhdGVBZGRyZXNzKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ2XS5zaG91bGQuZXF1YWwoMCk7IC8vIHByb29mX2luc3RydWN0aW9uX29mZnNldCA9IDAgKGNvbnRleHQgc3RhdGUpXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBcHBseVBlbmRpbmdCYWxhbmNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gYXBwbHkgcGVuZGluZyBiYWxhbmNlIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0Ni1ieXRlIGxheW91dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuYXBwbHlQZW5kaW5nQmFsYW5jZSh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXhwZWN0ZWRQZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICczJyxcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG5cbiAgICAgIGNvbnN0IHJhd0luc3RydWN0aW9ucyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnM7XG4gICAgICByYXdJbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgZGF0YSA9IHJhd0luc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDQ2KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDgpOyAvLyBBcHBseVBlbmRpbmdCYWxhbmNlXG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnMycpOyAvLyBleHBlY3RlZF9wZW5kaW5nX2JhbGFuY2VfY3JlZGl0X2NvdW50ZXJcbiAgICAgIGRhdGEuc2xpY2UoMTAsIDQ2KS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHplcm9CeXRlczM2KTsgLy8gbmV3X2RlY3J5cHRhYmxlX2F2YWlsYWJsZV9iYWxhbmNlXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1sxXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVwb3NpdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZGVwb3NpdCBpbnN0cnVjdGlvbiB3aXRoIGNvcnJlY3QgMTEtYnl0ZSBsYXlvdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsRGVwb3NpdCcpO1xuXG4gICAgICBjb25zdCByYXdJbnN0cnVjdGlvbnMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zO1xuICAgICAgcmF3SW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxMSk7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCgyNyk7IC8vIENvbmZpZGVudGlhbFRyYW5zZmVyRXh0ZW5zaW9uXG4gICAgICBkYXRhWzFdLnNob3VsZC5lcXVhbCg1KTsgLy8gRGVwb3NpdFxuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTsgLy8gYW1vdW50XG4gICAgICBkYXRhWzEwXS5zaG91bGQuZXF1YWwoNik7IC8vIGRlY2ltYWxzXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgbWludCwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1syXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2l0aGRyYXcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHdpdGhkcmF3IGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0OS1ieXRlIGxheW91dCBhbmQgaW5saW5lIHByb29mcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsV2l0aGRyYXcnKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDkpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoNik7IC8vIFdpdGhkcmF3XG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNTAwMDAwJyk7IC8vIGFtb3VudFxuICAgICAgZGF0YVsxMF0uc2hvdWxkLmVxdWFsKDYpOyAvLyBkZWNpbWFsc1xuICAgICAgZGF0YS5zbGljZSgxMSwgNDcpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBuZXdfZGVjcnlwdGFibGVcbiAgICAgIGRhdGFbNDddLnNob3VsZC5lcXVhbCgxKTsgLy8gZXF1YWxpdHkgcHJvb2Ygb2Zmc2V0XG4gICAgICBkYXRhWzQ4XS5zaG91bGQuZXF1YWwoMik7IC8vIHJhbmdlIHByb29mIG9mZnNldFxuXG4gICAgICAvLyBWZXJpZnkgYWNjb3VudHM6IFt0b2tlbih3cml0YWJsZSksIG1pbnQsIHN5c3ZhciwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbM10uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFt0b2tlbiwgbWludCwgZXFDdHgsIHJnQ3R4LCBhdXRob3JpdHldIOKAlCBubyBzeXN2YXIgc2luY2UgYWxsIHByb29mcyB1c2UgY29udGV4dCBzdGF0ZVxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwocmFuZ2VDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uZmlkZW50aWFsVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCAxNjktYnl0ZSBsYXlvdXQgYW5kIGlubGluZSBwcm9vZnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMTY5KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDcpOyAvLyBUcmFuc2ZlclxuICAgICAgZGF0YS5zbGljZSgyLCAzOCkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXMzNik7IC8vIG5ld19zb3VyY2VfZGVjcnlwdGFibGVcbiAgICAgIGRhdGEuc2xpY2UoMzgsIDEwMikudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXM2NCk7IC8vIGF1ZGl0b3JfY3RfbG9cbiAgICAgIGRhdGEuc2xpY2UoMTAyLCAxNjYpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzNjQpOyAvLyBhdWRpdG9yX2N0X2hpXG4gICAgICBkYXRhWzE2Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBlcXVhbGl0eSBwcm9vZiBvZmZzZXRcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMik7IC8vIHZhbGlkaXR5IHByb29mIG9mZnNldFxuICAgICAgZGF0YVsxNjhdLnNob3VsZC5lcXVhbCgzKTsgLy8gcmFuZ2UgcHJvb2Ygb2Zmc2V0XG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3NvdXJjZSh3cml0YWJsZSksIG1pbnQsIGRlc3Qod3JpdGFibGUpLCBzeXN2YXIsIGF1dGhvcml0eShzaWduZXIpXVxuICAgICAgY29uc3Qga2V5cyA9IHJhd0luc3RydWN0aW9uc1swXS5rZXlzO1xuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzBdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MpO1xuICAgICAga2V5c1swXS5pc1dyaXRhYmxlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXlzWzFdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChtaW50QWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvblRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzRdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFtzb3VyY2UsIG1pbnQsIGRlc3QsIGVxQ3R4LCB2YWxpZGl0eUN0eCwgcmFuZ2VDdHgsIGF1dGhvcml0eV0g4oCUIG5vIHN5c3ZhclxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodmFsaWRpdHlDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHJhbmdlQ3R4QWRkcmVzcyk7XG4gICAgICBrZXlzWzZdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNl0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB2ZXJpZnkgcHVia2V5IHZhbGlkaXR5IGluc3RydWN0aW9uIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCg0KTsgLy8gVmVyaWZ5UHVia2V5VmFsaWRpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApOyAvLyBkaXNjcmltaW5hdG9yICsgcHJvb2YgZGF0YVxuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG5cbiAgICAgIC8vIE5vIGFjY291bnRzIGZvciBpbmxpbmUgcHJvb2ZcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcblxuICAgICAgLy8gVmVyaWZ5IHByb2dyYW0gaWQgKGNhbm9uaWNhbCBvbi1jaGFpbiBpZClcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJ1prRTFHYW1hMVByb29mMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBjb250ZXh0IHN0YXRlIGFjY291bnQgKGZpeCAjMyknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHtcbiAgICAgICAgY29udGV4dFN0YXRlQWNjb3VudEFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY29udGV4dFN0YXRlQXV0aG9yaXR5QWRkcmVzczogYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd0l4ID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJeC5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoNCk7IC8vIFZlcmlmeVB1YmtleVZhbGlkaXR5IGRpc2NyaW1pbmF0b3JcbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5RXF1YWxpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMyk7IC8vIFZlcmlmeUNpcGhlcnRleHRDb21taXRtZW50RXF1YWxpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApO1xuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggY29udGV4dCBzdGF0ZSBvZmZzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2Yoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdJeCA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF07XG4gICAgICBjb25zdCBkYXRhID0gcmF3SXguZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgZGF0YS5yZWFkVUludDMyTEUoMSkuc2hvdWxkLmVxdWFsKDApOyAvLyBvZmZzZXQgYXMgdTMyXG5cbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5VmFsaWRpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVZhbGlkaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMTIpOyAvLyBWZXJpZnlCYXRjaGVkR3JvdXBlZENpcGhlcnRleHQzSGFuZGxlc1ZhbGlkaXR5XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMSArIDMyMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnlSYW5nZVByb29mJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBpbmxpbmUgcHJvb2YgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UmFuZ2VQcm9vZih7IHByb29mRGF0YTogJzAwJy5yZXBlYXQoMTAwMCkgfSk7IC8vIHJhbmdlIHByb29mIGlzIH4xMDAwIGJ5dGVzXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDcpOyAvLyBWZXJpZnlCYXRjaGVkUmFuZ2VQcm9vZlUxMjhcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxICsgMTAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdNdWx0aXBsZSBpbnN0cnVjdGlvbnMgKHYxIHR4IHNpbXVsYXRpb24pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgQXBwbHlQZW5kaW5nQmFsYW5jZSArIDMgcHJvb2ZzICsgVHJhbnNmZXIgaW4gY29ycmVjdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFwcGx5UGVuZGluZ0JhbGFuY2Uoe1xuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnMicsXG4gICAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgfSlcbiAgICAgICAgLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KVxuICAgICAgICAudmVyaWZ5VmFsaWRpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pXG4gICAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgICAuY29uZmlkZW50aWFsVHJhbnNmZXIoe1xuICAgICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAzLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCg1KTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQXBwbHlQZW5kaW5nQmFsYW5jZScpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdWZXJpZnlFcXVhbGl0eVByb29mJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMl0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVZhbGlkaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1szXS50eXBlLnNob3VsZC5lcXVhbCgnVmVyaWZ5UmFuZ2VQcm9vZicpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzRdLnR5cGUuc2hvdWxkLmVxdWFsKCdDb25maWRlbnRpYWxUcmFuc2ZlcicpO1xuXG4gICAgICAvLyBOb3RlOiBDYW5ub3QgdmVyaWZ5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgaGVyZSBiZWNhdXNlIDMgcHJvb2ZzICgzMjArMzIwKzEwMDAgYnl0ZXMpXG4gICAgICAvLyArIHRyYW5zZmVyICgxNjlCKSBleGNlZWRzIHYwIHR4IHNpemUgbGltaXQgKDEyMzJCKS4gVGhlc2UgYXJlIHYxIHRyYW5zYWN0aW9ucyAoNDEzMkIpLlxuICAgICAgLy8gVGhlIGluc3RydWN0aW9uIGRhdGEgbGF5b3V0cyBhcmUgdmVyaWZpZWQgaW5kaXZpZHVhbGx5IGluIHRoZSB0ZXN0cyBhYm92ZS5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgQ29uZmlndXJlQWNjb3VudCArIFZlcmlmeVB1YmtleVZhbGlkaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICB9KVxuICAgICAgICAudmVyaWZ5UHVia2V5VmFsaWRpdHkoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5Jyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmF3IHRyYW5zYWN0aW9uIHZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IGJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtaXNzaW5nIHRva2VuQWRkcmVzcyBvbiBjb25maWd1cmVBY2NvdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PlxuICAgICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICAgIHRva2VuQWRkcmVzczogJycsXG4gICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIAgRml4LXNwZWNpZmljIHRlc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGRlc2NyaWJlKCdGaXggIzE6IHNpZ25lZCBpOCBwcm9vZiBpbnN0cnVjdGlvbiBvZmZzZXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGVuY29kZSBuZWdhdGl2ZSBvZmZzZXQgb24gQ29uZmlndXJlQWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSwgLy8gcHJvb2YgaXMgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDI1NSk7IC8vIC0xIGFzIGk4ID0gMjU1IGFzIHU4ICh0d28ncyBjb21wbGVtZW50KVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldCBvbiBXaXRoZHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ3XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICAgIGRhdGFbNDhdLnNob3VsZC5lcXVhbCgyNTQpOyAvLyAtMiBhcyBpOFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldHMgb24gVHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogLTMsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0yLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMTY2XS5zaG91bGQuZXF1YWwoMjUzKTsgLy8gLTMgYXMgaThcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMjU0KTsgLy8gLTIgYXMgaThcbiAgICAgIGRhdGFbMTY4XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMjogaW5zdHJ1Y3Rpb24gb3JkZXIgcHJlc2VydmF0aW9uIGluIHBhcnNlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIGludGVybGVhdmVkIENUIGFuZCBjdXN0b20gaW5zdHJ1Y3Rpb24gb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzEnLFxuICAgICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIH0pXG4gICAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgICBzb3VyY2VUb2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICAvLyBPcmRlciBzaG91bGQgYmU6IEFwcGx5UGVuZGluZ0JhbGFuY2UsIFZlcmlmeUVxdWFsaXR5UHJvb2YsIENvbmZpZGVudGlhbFRyYW5zZmVyXG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeUVxdWFsaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1syXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMzogVmVyaWZ5UHVia2V5VmFsaWRpdHkgY29udGV4dCBzdGF0ZSBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IHdoZW4gb25seSBjb250ZXh0IHN0YXRlIGFjY291bnRzIGFyZSBwcm92aWRlZCAobm8gcHJvb2ZEYXRhKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UHVia2V5VmFsaWRpdHkoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SXggPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdO1xuICAgICAgLy8gU2hvdWxkIHByb2R1Y2UgYW4gb2Zmc2V0LWJhc2VkIGluc3RydWN0aW9uLCBub3QgdGhyb3dcbiAgICAgIHJhd0l4LmRhdGFbMF0uc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgcmF3SXgua2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzQ6IGNvbnRleHQgc3RhdGUgYWRkcmVzcyByZXF1aXJlZCB3aGVuIG9mZnNldCA9PSAwJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IFdpdGhkcmF3IHdpdGggb2Zmc2V0IDAgYnV0IG1pc3NpbmcgZXF1YWxpdHkgY29udGV4dCBzdGF0ZSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxXaXRoZHJhdyh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsIC8vIGNvbnRleHQgc3RhdGUgbW9kZSBidXQgbm8gYWRkcmVzc1xuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9lcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzcyBpcyByZXF1aXJlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgVHJhbnNmZXIgd2l0aCBvZmZzZXQgMCBidXQgbWlzc2luZyByYW5nZSBjb250ZXh0IHN0YXRlIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLCAvLyBjb250ZXh0IHN0YXRlIG1vZGUgYnV0IG5vIGFkZHJlc3NcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzIGlzIHJlcXVpcmVkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzU6IG51bWVyaWMgc3RyaW5nIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgYW1vdW50IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICdhYmMnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiBleHBlY3RlZCBub24tbmVnYXRpdmUgaW50ZWdlciBzdHJpbmcvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGFtb3VudCBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnLTEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBhbW91bnQ6IGV4cGVjdGVkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgY291bnRlciBvbiBBcHBseVBlbmRpbmdCYWxhbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ25vdC1hLW51bWJlcicsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tbnVtZXJpYyBjb3VudGVyIG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ2ZvbycsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXIvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFtb3VudCBvZiAwIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjNjogY2Fub25pY2FsIFpLIHByb29mIHByb2dyYW0gSUQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1c2UgY2Fub25pY2FsIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5RXF1YWxpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdaa0UxR2FtYTFQcm9vZjExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IG92ZXJyaWRpbmcgWksgcHJvb2YgcHJvZ3JhbSBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVByb2dyYW1JZCA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YjsgLy8gYW55IHZhbGlkIHB1YmtleVxuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci56a1Byb29mUHJvZ3JhbUlkKGN1c3RvbVByb2dyYW1JZCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpLnNob3VsZC5lcXVhbChjdXN0b21Qcm9ncmFtSWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRml4ICM4OiBmcm9tKCkgcm91dGluZyBmb3IgQ1QgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcm91dGUgQ1QgdHJhbnNhY3Rpb24gdG8gQ29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyIG9uIGZyb20oKScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQ1QgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBQYXJzZSBpdCBiYWNrIHZpYSBmYWN0b3J5LmZyb20oKVxuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICAvLyBTaG91bGQgYmUgYSBDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIsIG5vdCBDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXJcbiAgICAgIHBhcnNlZEJ1aWxkZXIuY29uc3RydWN0b3IubmFtZS5zaG91bGQuZXF1YWwoJ0NvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3V0ZSBub24tQ1QgY3VzdG9tIHRyYW5zYWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uQnVpbGRlciBvbiBmcm9tKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBhIG5vbi1DVCBjdXN0b20gdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGN1c3RvbUJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY3VzdG9tQnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgY3VzdG9tQnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgY3VzdG9tQnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgIHByb2dyYW1JZDogJ01lbW9TcTRncUFCQVhLYjk2cW5IOFR5c05jV3hNeVdDcVhnRExHbWZjSHInLFxuICAgICAgICBrZXlzOiBbXSxcbiAgICAgICAgZGF0YTogJ2hlbGxvJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGN1c3RvbUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gUGFyc2UgaXQgYmFjayB2aWEgZmFjdG9yeS5mcm9tKClcbiAgICAgIGNvbnN0IHBhcnNlZEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcGFyc2VkQnVpbGRlci5jb25zdHJ1Y3Rvci5uYW1lLnNob3VsZC5lcXVhbCgnQ3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzk6IHJhbmdlIHZhbGlkYXRpb24gZm9yIGRlY2ltYWxzIGFuZCBwcm9vZiBvZmZzZXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGRlY2ltYWxzID4gMjU1IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogMjU2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBkZWNpbWFsczogZXhwZWN0ZWQgdTggXFwoMC0yNTVcXCkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGRlY2ltYWxzIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogLTEsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlY2ltYWxzOiBleHBlY3RlZCB1OCBcXCgwLTI1NVxcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLWludGVnZXIgZGVjaW1hbHMgb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LjUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlY2ltYWxzOiBleHBlY3RlZCB1OCBcXCgwLTI1NVxcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0ID4gMTI3IG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMTI4LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOCBcXCgtMTI4IHRvIDEyN1xcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0IDwgLTEyOCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xMjksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4IFxcKC0xMjggdG8gMTI3XFwpLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBlcXVhbGl0eSBwcm9vZiBvZmZzZXQgPiAxMjcgb24gV2l0aGRyYXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMjAwLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogZXhwZWN0ZWQgaTgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHJhbmdlIHByb29mIG9mZnNldCA8IC0xMjggb24gV2l0aGRyYXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMjAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB2YWxpZGl0eSBwcm9vZiBvZmZzZXQgb3V0IG9mIGk4IHJhbmdlIG9uIFRyYW5zZmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxUcmFuc2Zlcih7XG4gICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogdmFsaWRpdHlDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0SGk6IHplcm9CeXRlczY0LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDI1NSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYm91bmRhcnkgb2Zmc2V0IHZhbHVlcyAoLTEyOCBhbmQgMTI3KScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxMjcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDEyNyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzEwOiB1NjQgb3ZlcmZsb3cgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbW91bnQgZXhjZWVkaW5nIHU2NCBtYXggb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzE4NDQ2NzQ0MDczNzA5NTUxNjE2JywgLy8gMl42NFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiB2YWx1ZSBleGNlZWRzIHU2NCBtYXgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFtb3VudCBhdCB1NjQgbWF4IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIDJeNjQgLSAxXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEucmVhZEJpZ1VJbnQ2NExFKDIpLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgY291bnRlciBleGNlZWRpbmcgdTY0IG1heCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNicsIC8vIDJeNjRcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogdmFsdWUgZXhjZWVkcyB1NjQgbWF4Lyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|