@bitgo-beta/sdk-coin-sui 3.0.3-beta.182 → 3.0.3-beta.1821

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +7 -2
  4. package/dist/src/lib/compareTransactionBlocks.js +2 -3
  5. package/dist/src/lib/constants.d.ts +9 -2
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +18 -2
  8. package/dist/src/lib/customTransaction.js +3 -3
  9. package/dist/src/lib/customTransactionBuilder.js +5 -5
  10. package/dist/src/lib/iface.d.ts +80 -12
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +34 -5
  13. package/dist/src/lib/index.d.ts +6 -0
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +36 -10
  16. package/dist/src/lib/keyPair.js +24 -10
  17. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  18. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  19. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  20. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  21. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  22. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
  23. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  24. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  26. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  27. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  29. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  30. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  32. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  33. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  34. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  35. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  36. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  37. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  38. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  39. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  40. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  41. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  42. package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
  43. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  44. package/dist/src/lib/mystenlab/types/coin.d.ts +13 -11
  45. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  47. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  48. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  49. package/dist/src/lib/mystenlab/types/common.js +22 -22
  50. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  51. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  52. package/dist/src/lib/mystenlab/types/events.js +17 -17
  53. package/dist/src/lib/mystenlab/types/index.js +6 -2
  54. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  55. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  56. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  57. package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
  58. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  59. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  60. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  61. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  62. package/dist/src/lib/mystenlab/types/option.js +2 -3
  63. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  64. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  65. package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
  66. package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
  67. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  68. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  69. package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
  70. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  71. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  72. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  73. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  74. package/dist/src/lib/resources/walrusConfig.js +37 -0
  75. package/dist/src/lib/rpcClient.d.ts +5 -0
  76. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  77. package/dist/src/lib/rpcClient.js +74 -0
  78. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  79. package/dist/src/lib/stakingBuilder.js +23 -7
  80. package/dist/src/lib/stakingTransaction.d.ts +0 -1
  81. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  82. package/dist/src/lib/stakingTransaction.js +26 -15
  83. package/dist/src/lib/tokenTransferBuilder.d.ts +66 -0
  84. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  85. package/dist/src/lib/tokenTransferBuilder.js +202 -0
  86. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  87. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  88. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  89. package/dist/src/lib/transaction.d.ts +21 -4
  90. package/dist/src/lib/transaction.d.ts.map +1 -1
  91. package/dist/src/lib/transaction.js +129 -17
  92. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  93. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  94. package/dist/src/lib/transactionBuilder.js +34 -4
  95. package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
  96. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  97. package/dist/src/lib/transactionBuilderFactory.js +32 -1
  98. package/dist/src/lib/transferBuilder.d.ts +58 -1
  99. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  100. package/dist/src/lib/transferBuilder.js +310 -24
  101. package/dist/src/lib/transferTransaction.d.ts +6 -1
  102. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  103. package/dist/src/lib/transferTransaction.js +129 -12
  104. package/dist/src/lib/unstakingBuilder.js +6 -6
  105. package/dist/src/lib/unstakingTransaction.d.ts +0 -1
  106. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  107. package/dist/src/lib/unstakingTransaction.js +31 -17
  108. package/dist/src/lib/utils.d.ts +24 -3
  109. package/dist/src/lib/utils.d.ts.map +1 -1
  110. package/dist/src/lib/utils.js +254 -21
  111. package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
  112. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  113. package/dist/src/lib/walrusStakingBuilder.js +200 -0
  114. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  115. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  116. package/dist/src/lib/walrusStakingTransaction.js +269 -0
  117. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  118. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  119. package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
  120. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  121. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  122. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  123. package/dist/src/register.d.ts.map +1 -1
  124. package/dist/src/register.js +5 -1
  125. package/dist/src/sui.d.ts +46 -8
  126. package/dist/src/sui.d.ts.map +1 -1
  127. package/dist/src/sui.js +525 -37
  128. package/dist/src/suiToken.d.ts +22 -0
  129. package/dist/src/suiToken.d.ts.map +1 -0
  130. package/dist/src/suiToken.js +61 -0
  131. package/dist/src/tsui.js +1 -1
  132. package/dist/test/integration/index.d.ts +1 -0
  133. package/dist/test/integration/index.d.ts.map +1 -0
  134. package/dist/test/integration/index.js +1 -0
  135. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  136. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  137. package/dist/test/local_fullnode/RpcClient.js +111 -0
  138. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  139. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  140. package/dist/test/local_fullnode/faucet.js +17 -0
  141. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  142. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  143. package/dist/test/local_fullnode/transactions.js +190 -0
  144. package/dist/test/resources/sui.d.ts +458 -0
  145. package/dist/test/resources/sui.d.ts.map +1 -0
  146. package/dist/test/resources/sui.js +632 -0
  147. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  148. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  149. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  150. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  151. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  152. package/dist/test/unit/getBuilderFactory.js +10 -0
  153. package/dist/test/unit/keyPair.d.ts +2 -0
  154. package/dist/test/unit/keyPair.d.ts.map +1 -0
  155. package/dist/test/unit/keyPair.js +72 -0
  156. package/dist/test/unit/sui.d.ts +2 -0
  157. package/dist/test/unit/sui.d.ts.map +1 -0
  158. package/dist/test/unit/sui.js +2423 -0
  159. package/dist/test/unit/suiToken.d.ts +2 -0
  160. package/dist/test/unit/suiToken.d.ts.map +1 -0
  161. package/dist/test/unit/suiToken.js +39 -0
  162. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  163. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  164. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  165. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  166. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  167. package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
  168. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  169. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  170. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +255 -0
  171. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  172. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  173. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  174. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  175. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  176. package/dist/test/unit/transactionBuilder/transferBuilder.js +1055 -0
  177. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  178. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  179. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  180. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  181. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  182. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
  183. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  184. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  185. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
  186. package/dist/test/unit/transferTransaction.d.ts +2 -0
  187. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  188. package/dist/test/unit/transferTransaction.js +94 -0
  189. package/dist/test/unit/utils.d.ts +2 -0
  190. package/dist/test/unit/utils.d.ts.map +1 -0
  191. package/dist/test/unit/utils.js +186 -0
  192. package/dist/tsconfig.tsbuildinfo +1 -0
  193. package/package.json +16 -12
  194. package/.eslintignore +0 -6
  195. package/.mocharc.yml +0 -7
  196. package/CHANGELOG.md +0 -420
@@ -0,0 +1,639 @@
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 getBuilderFactory_1 = require("../getBuilderFactory");
40
+ const testData = __importStar(require("../../resources/sui"));
41
+ const should_1 = __importDefault(require("should"));
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
+ const iface_1 = require("../../../src/lib/iface");
44
+ const sui_1 = require("../../resources/sui");
45
+ const keyPair_1 = require("../../../src/lib/keyPair");
46
+ const constants_1 = require("../../../src/lib/constants");
47
+ describe('Sui Transaction Builder', async () => {
48
+ let builders;
49
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
50
+ describe('Transfer TX', async () => {
51
+ beforeEach(function (done) {
52
+ builders = [factory.getTransferBuilder()];
53
+ done();
54
+ });
55
+ it('should build a transfer transaction and serialize it and deserialize it', async function () {
56
+ const txBuilder = factory.getTransferBuilder();
57
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
58
+ txBuilder.sender(testData.sender.address);
59
+ txBuilder.send(sui_1.recipients);
60
+ txBuilder.gasData(testData.gasData);
61
+ const tx = await txBuilder.build();
62
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
63
+ const rawTx = tx.toBroadcastFormat();
64
+ should_1.default.equal(rawTx, testData.TRANSFER);
65
+ const reserialized = await factory.from(rawTx).build();
66
+ reserialized.should.be.deepEqual(tx);
67
+ reserialized.toBroadcastFormat().should.equal(rawTx);
68
+ });
69
+ it('should build and sign a transfer tx with gasPayment', async function () {
70
+ const txBuilder = factory.getTransferBuilder();
71
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
72
+ txBuilder.sender(testData.sender.address);
73
+ txBuilder.send(sui_1.recipients);
74
+ txBuilder.gasData(testData.gasData);
75
+ const tx = await txBuilder.build();
76
+ should_1.default.equal(tx.id, 'UNAVAILABLE');
77
+ const rawTx = tx.toBroadcastFormat();
78
+ should_1.default.equal(rawTx, testData.TRANSFER);
79
+ const txBuilder2 = await factory.from(rawTx);
80
+ await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
81
+ const signedTx = await txBuilder2.build();
82
+ should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.Send);
83
+ should_1.default.equal(signedTx.id, 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR');
84
+ const rawSignedTx = signedTx.toBroadcastFormat();
85
+ should_1.default.equal(rawSignedTx, testData.TRANSFER);
86
+ const reserializedTxBuilder = factory.from(rawSignedTx);
87
+ reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
88
+ const reserialized = await reserializedTxBuilder.build();
89
+ reserialized.should.be.deepEqual(signedTx);
90
+ reserialized.toBroadcastFormat().should.equal(rawSignedTx);
91
+ });
92
+ it('should build and sign a transfer tx with gasPayment as different owner', async function () {
93
+ const txBuilder = factory.getTransferBuilder();
94
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
95
+ txBuilder.sender(testData.sender.address);
96
+ txBuilder.send(sui_1.recipients);
97
+ txBuilder.gasData(testData.gasDataHavingDifferentOwner);
98
+ const tx = await txBuilder.build();
99
+ should_1.default.equal(tx.id, 'UNAVAILABLE');
100
+ const rawTx = tx.toBroadcastFormat();
101
+ should_1.default.equal(rawTx, testData.FEE_SPONSOR_TRANSFER);
102
+ const txBuilder2 = await factory.from(rawTx);
103
+ await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
104
+ await txBuilder2.addFeePayerSignature({ pub: testData.feePayer.publicKey }, Buffer.from(testData.feePayer.signatureHex));
105
+ const signedTx = await txBuilder2.build();
106
+ should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.Send);
107
+ should_1.default.equal(signedTx.id, 'Co5d6tiLQuwUPrfPp7vfmcJMNK5gWZ3StFR6cvzq6R12');
108
+ const rawSignedTx = signedTx.toBroadcastFormat();
109
+ should_1.default.equal(rawSignedTx, testData.FEE_SPONSOR_TRANSFER);
110
+ const reserializedTxBuilder = factory.from(rawSignedTx);
111
+ reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
112
+ reserializedTxBuilder.addFeePayerSignature({ pub: testData.feePayer.publicKey }, Buffer.from(testData.feePayer.signatureHex));
113
+ const reserialized = await reserializedTxBuilder.build();
114
+ reserialized.should.be.deepEqual(signedTx);
115
+ reserialized.toBroadcastFormat().should.equal(rawSignedTx);
116
+ });
117
+ it('should submit a transfer transaction with private keys', async () => {
118
+ const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
119
+ const keyPairRecipient = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey2 });
120
+ const senderAddress = keyPairSender.getAddress();
121
+ const receiveAddress = keyPairRecipient.getAddress();
122
+ const expectedTransferTxSig = 'AI8Q9KINqSCOeHvhv6MJ6Vf3TWbTcxhpclg0PD9gBgand2kLQZxEJS/HJASganLKfZ277Il4mAifKHzvtb2fCA+lzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
123
+ const expectedTransferTxHex = 'AAACAAgA4fUFAAAAAAAgtev+nncDfTtowJZEPHUMsJXia4wKmT/Xpgtrzsy6O38CAgABAQAAAQECAAABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
124
+ const coins = [
125
+ {
126
+ digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
127
+ objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
128
+ version: 1126,
129
+ },
130
+ {
131
+ digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
132
+ objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
133
+ version: 1126,
134
+ },
135
+ ];
136
+ const txBuilder_1 = factory.getTransferBuilder();
137
+ txBuilder_1.type(iface_1.SuiTransactionType.Transfer);
138
+ txBuilder_1.sender(senderAddress);
139
+ txBuilder_1.send([{ address: receiveAddress, amount: '100000000' }]);
140
+ const gasData = {
141
+ payment: coins,
142
+ owner: senderAddress,
143
+ budget: testData.GAS_BUDGET,
144
+ price: 1000,
145
+ };
146
+ txBuilder_1.gasData(gasData);
147
+ const tx_1 = await txBuilder_1.build();
148
+ const signable_1 = tx_1.signablePayload;
149
+ const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
150
+ txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
151
+ const signedTx_1 = (await txBuilder_1.build());
152
+ const txHex_1 = signedTx_1.toBroadcastFormat();
153
+ const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
154
+ const txBuilderFromRaw_2 = factory.getTransferBuilder();
155
+ txBuilderFromRaw_2.from(txHex_1);
156
+ const signable_2 = tx_1.signablePayload;
157
+ txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
158
+ const signedTx_2 = (await txBuilderFromRaw_2.build());
159
+ const txHex_2 = signedTx_2.toBroadcastFormat();
160
+ const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
161
+ should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
162
+ should_1.default.equal(txHex_1, txHex_2);
163
+ should_1.default.equal(txHex_1, expectedTransferTxHex);
164
+ should_1.default.equal(txHex_2, expectedTransferTxHex);
165
+ should_1.default.equal(sig_1, sig_2);
166
+ should_1.default.equal(sig_1, expectedTransferTxSig);
167
+ should_1.default.equal(sig_2, expectedTransferTxSig);
168
+ });
169
+ it('should submit a slit coin transaction with private keys', async () => {
170
+ const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
171
+ const senderAddress = keyPairSender.getAddress();
172
+ const expectedTransferTxSig = 'AGGWHZuyUjsxMhMoPoqdsZRTC50a8mByDhupwE0WrDlvvqzwaRO7R5sY20/IYgabUA9fep3o35ssnRhUZ0jDqwmlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
173
+ const expectedTransferTxHex = 'AAAVAAgA4fUFAAAAAAAgkAdCu5I+qQalbzJaF1l3UuzTrDAmu6luDt/0XejbM6sACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAKAIAAQEAAAEBAgAAAQEAAgABAQIAAQECAgABAQACAAEBAwABAQIEAAEBAAIAAQEEAAEBAgYAAQEAAgABAQUAAQECCAABAQACAAEBBgABAQIKAAEBAAIAAQEHAAEBAgwAAQEAAgABAQgAAQECDgABAQACAAEBCQABAQIQAAEBAAIAAQEKAAEBAhIAAQEAAgABAQsAAQECFAABAQACAAEBDAABAQIWAAEBAAIAAQENAAEBAhgAAQEAAgABAQ4AAQECGgABAQACAAEBDwABAQIcAAEBAAIAAQEQAAEBAh4AAQEAAgABAREAAQECIAABAQACAAEBEgABAQIiAAEBAAIAAQETAAEBAiQAAQEAAgABARQAAQECJgABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
174
+ const coins = [
175
+ {
176
+ digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
177
+ objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
178
+ version: 1126,
179
+ },
180
+ {
181
+ digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
182
+ objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
183
+ version: 1126,
184
+ },
185
+ ];
186
+ const txBuilder_1 = factory.getTransferBuilder();
187
+ txBuilder_1.type(iface_1.SuiTransactionType.Transfer);
188
+ txBuilder_1.sender(senderAddress);
189
+ txBuilder_1.send(Array(20).fill({ address: senderAddress, amount: '100000000' }));
190
+ const gasData = {
191
+ payment: coins,
192
+ owner: senderAddress,
193
+ budget: testData.GAS_BUDGET,
194
+ price: 1000,
195
+ };
196
+ txBuilder_1.gasData(gasData);
197
+ const tx_1 = await txBuilder_1.build();
198
+ const signable_1 = tx_1.signablePayload;
199
+ const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
200
+ txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
201
+ const signedTx_1 = (await txBuilder_1.build());
202
+ const txHex_1 = signedTx_1.toBroadcastFormat();
203
+ const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
204
+ const txBuilderFromRaw_2 = factory.getTransferBuilder();
205
+ txBuilderFromRaw_2.from(txHex_1);
206
+ const signable_2 = tx_1.signablePayload;
207
+ const signature_2 = keyPairSender.signMessageinUint8Array(signable_2);
208
+ txBuilderFromRaw_2.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_2));
209
+ const signedTx_2 = (await txBuilderFromRaw_2.build());
210
+ const txHex_2 = signedTx_2.toBroadcastFormat();
211
+ const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
212
+ should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
213
+ should_1.default.equal(txHex_1, txHex_2);
214
+ should_1.default.equal(txHex_1, expectedTransferTxHex);
215
+ should_1.default.equal(txHex_2, expectedTransferTxHex);
216
+ should_1.default.equal(sig_1, sig_2);
217
+ should_1.default.equal(sig_1, expectedTransferTxSig);
218
+ should_1.default.equal(sig_2, expectedTransferTxSig);
219
+ });
220
+ it('should fail to build if missing type', async function () {
221
+ for (const txBuilder of builders) {
222
+ txBuilder.sender(testData.sender.address);
223
+ txBuilder.send(sui_1.recipients);
224
+ txBuilder.gasData(testData.gasData);
225
+ await txBuilder.build().should.rejectedWith('type is required before building');
226
+ }
227
+ });
228
+ it('should fail to build if missing sender', async function () {
229
+ for (const txBuilder of builders) {
230
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
231
+ txBuilder.send(sui_1.recipients);
232
+ txBuilder.gasData(testData.gasData);
233
+ await txBuilder.build().should.rejectedWith('sender is required before building');
234
+ }
235
+ });
236
+ it('should fail to build if missing recipients', async function () {
237
+ for (const txBuilder of builders) {
238
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
239
+ txBuilder.sender(testData.sender.address);
240
+ txBuilder.gasData(testData.gasData);
241
+ await txBuilder.build().should.rejectedWith('at least one recipient is required before building');
242
+ }
243
+ });
244
+ it('should fail to build if missing gasData', async function () {
245
+ for (const txBuilder of builders) {
246
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
247
+ txBuilder.sender(testData.sender.address);
248
+ txBuilder.send(sui_1.recipients);
249
+ await txBuilder.build().should.rejectedWith('gasData is required before building');
250
+ }
251
+ });
252
+ it('should fail to build if missing payment coins in gasData', async function () {
253
+ for (const txBuilder of builders) {
254
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
255
+ txBuilder.sender(testData.sender.address);
256
+ txBuilder.send(sui_1.recipients);
257
+ (0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
258
+ await txBuilder.build().should.rejectedWith('gasData is required before building');
259
+ }
260
+ });
261
+ it('should build a send from rawTx', async function () {
262
+ const txBuilder = factory.from(testData.TRANSFER);
263
+ const builtTx = await txBuilder.build();
264
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
265
+ should_1.default.equal(builtTx.id, 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR');
266
+ builtTx.inputs.length.should.equal(1);
267
+ builtTx.inputs[0].should.deepEqual({
268
+ address: testData.sender.address,
269
+ value: (testData.AMOUNT * 2).toString(),
270
+ coin: 'tsui',
271
+ });
272
+ builtTx.outputs.length.should.equal(2);
273
+ builtTx.outputs[0].should.deepEqual({
274
+ address: testData.recipients[0].address,
275
+ value: testData.recipients[0].amount,
276
+ coin: 'tsui',
277
+ });
278
+ builtTx.outputs[1].should.deepEqual({
279
+ address: testData.recipients[1].address,
280
+ value: testData.recipients[1].amount,
281
+ coin: 'tsui',
282
+ });
283
+ const jsonTx = builtTx.toJson();
284
+ jsonTx.gasData.should.deepEqual(testData.gasData);
285
+ jsonTx.kind.ProgrammableTransaction.should.deepEqual({
286
+ inputs: testData.txInputs,
287
+ transactions: testData.txTransactions,
288
+ });
289
+ jsonTx.sender.should.equal(testData.sender.address);
290
+ jsonTx.gasData.should.deepEqual(testData.gasData);
291
+ builtTx.toBroadcastFormat().should.equal(testData.TRANSFER);
292
+ });
293
+ });
294
+ describe('Staking TX', async () => {
295
+ beforeEach(function (done) {
296
+ builders = [factory.getStakingBuilder()];
297
+ done();
298
+ });
299
+ it('should build an add staking transaction and serialize it and deserialize it', async function () {
300
+ const txBuilder = factory.getStakingBuilder();
301
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
302
+ txBuilder.sender(testData.sender.address);
303
+ txBuilder.stake([testData.requestAddStake]);
304
+ txBuilder.gasData(testData.gasData);
305
+ const tx = await txBuilder.build();
306
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
307
+ const rawTx = tx.toBroadcastFormat();
308
+ should_1.default.equal(rawTx, testData.ADD_STAKE);
309
+ const reserialized = await factory.from(rawTx).build();
310
+ reserialized.toBroadcastFormat().should.equal(rawTx);
311
+ });
312
+ it('should build an stakeMany transaction and serialize it and deserialize it', async function () {
313
+ const txBuilder = factory.getStakingBuilder();
314
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
315
+ txBuilder.sender(testData.sender.address);
316
+ txBuilder.stake(testData.requestAddStakeMany);
317
+ txBuilder.gasData(testData.gasData);
318
+ const tx = await txBuilder.build();
319
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
320
+ const rawTx = tx.toBroadcastFormat();
321
+ should_1.default.equal(rawTx, testData.STAKE_MANY);
322
+ const reserialized = await factory.from(rawTx).build();
323
+ // reserialized.should.be.deepEqual(tx);
324
+ reserialized.toBroadcastFormat().should.equal(rawTx);
325
+ });
326
+ it('should build and sign a staking tx with gasPayment', async function () {
327
+ const txBuilder = factory.getStakingBuilder();
328
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
329
+ txBuilder.sender(testData.sender.address);
330
+ txBuilder.stake([testData.requestAddStake]);
331
+ txBuilder.gasData(testData.gasData);
332
+ const tx = await txBuilder.build();
333
+ should_1.default.equal(tx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
334
+ const rawTx = tx.toBroadcastFormat();
335
+ should_1.default.equal(rawTx, testData.ADD_STAKE);
336
+ const txBuilder2 = await factory.from(rawTx);
337
+ await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
338
+ const signedTx = await txBuilder2.build();
339
+ should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.StakingAdd);
340
+ should_1.default.equal(signedTx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
341
+ const rawSignedTx = signedTx.toBroadcastFormat();
342
+ should_1.default.equal(rawSignedTx, testData.ADD_STAKE);
343
+ const reserializedTxBuilder = factory.from(rawSignedTx);
344
+ reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
345
+ const reserialized = await reserializedTxBuilder.build();
346
+ reserialized.should.be.deepEqual(signedTx);
347
+ reserialized.toBroadcastFormat().should.equal(rawSignedTx);
348
+ });
349
+ it('should build and sign a staking transaction with private keys', async () => {
350
+ const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
351
+ const senderAddress = keyPairSender.getAddress();
352
+ const expectedStakingTxSig = 'AD8755e+kA3/Iy+3oRxBbQiK0Iz4qmD4sZcpoQN0UMPxIXv7Qx4twvuAiZf9H2nHYa/Ae0asM4Rkz1SCP0dhXgqlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
353
+ const expectedStakingTxHex = 'AAAJAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAAgArCP8BgAAAAAgRLGzGeI0lZlfyDfa/Sj8avi2Re3d/w/BRn8a1jE2LCYACAAtMQEAAAAAACBEsbMZ4jSVmV/IN9r9KPxq+LZF7d3/D8FGfxrWMTYsJgAIAKwj/AYAAAAAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjCAIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgACAAEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRFyZXF1ZXN0X2FkZF9zdGFrZQADAQEAAgIAAQQAAgABAQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCnN1aV9zeXN0ZW0RcmVxdWVzdF9hZGRfc3Rha2UAAwEBAAIEAAEGAAIAAQEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACBgABCACQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
354
+ const coins = [
355
+ {
356
+ digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
357
+ objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
358
+ version: 1126,
359
+ },
360
+ {
361
+ digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
362
+ objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
363
+ version: 1126,
364
+ },
365
+ ];
366
+ const txBuilder_1 = factory.getStakingBuilder();
367
+ txBuilder_1.type(iface_1.SuiTransactionType.AddStake);
368
+ txBuilder_1.sender(senderAddress);
369
+ txBuilder_1.stake(testData.requestAddStakeMany);
370
+ const gasData = {
371
+ payment: coins,
372
+ owner: senderAddress,
373
+ budget: testData.GAS_BUDGET,
374
+ price: 1000,
375
+ };
376
+ txBuilder_1.gasData(gasData);
377
+ const tx_1 = await txBuilder_1.build();
378
+ const signable_1 = tx_1.signablePayload;
379
+ const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
380
+ txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
381
+ const signedTx_1 = (await txBuilder_1.build());
382
+ const txHex_1 = signedTx_1.toBroadcastFormat();
383
+ const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
384
+ const txBuilderFromRaw_2 = factory.getStakingBuilder();
385
+ txBuilderFromRaw_2.from(txHex_1);
386
+ const signable_2 = tx_1.signablePayload;
387
+ txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
388
+ const signedTx_2 = (await txBuilderFromRaw_2.build());
389
+ const txHex_2 = signedTx_2.toBroadcastFormat();
390
+ const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
391
+ should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
392
+ should_1.default.equal(txHex_1, txHex_2);
393
+ should_1.default.equal(txHex_1, expectedStakingTxHex);
394
+ should_1.default.equal(txHex_2, expectedStakingTxHex);
395
+ should_1.default.equal(sig_1, sig_2);
396
+ should_1.default.equal(sig_1, expectedStakingTxSig);
397
+ should_1.default.equal(sig_2, expectedStakingTxSig);
398
+ });
399
+ it('should fail to build if missing type', async function () {
400
+ for (const txBuilder of builders) {
401
+ txBuilder.sender(testData.sender.address);
402
+ txBuilder.stake([testData.requestAddStake]);
403
+ txBuilder.gasData(testData.gasData);
404
+ await txBuilder.build().should.rejectedWith('type is required before building');
405
+ }
406
+ });
407
+ it('should fail to build if missing sender', async function () {
408
+ for (const txBuilder of builders) {
409
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
410
+ txBuilder.stake([testData.requestAddStake]);
411
+ txBuilder.gasData(testData.gasData);
412
+ await txBuilder.build().should.rejectedWith('sender is required before building');
413
+ }
414
+ });
415
+ it('should fail to build if missing gasData', async function () {
416
+ for (const txBuilder of builders) {
417
+ txBuilder.sender(testData.sender.address);
418
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
419
+ txBuilder.stake([testData.requestAddStake]);
420
+ await txBuilder.build().should.rejectedWith('gasData is required before building');
421
+ }
422
+ });
423
+ it('should fail to build if missing payment coins in gasData', async function () {
424
+ for (const txBuilder of builders) {
425
+ txBuilder.sender(testData.sender.address);
426
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
427
+ txBuilder.stake([testData.requestAddStake]);
428
+ (0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
429
+ await txBuilder.build().should.rejectedWith('gasData is required before building');
430
+ }
431
+ });
432
+ it('should build a send from rawTx', async function () {
433
+ const txBuilder = factory.from(testData.ADD_STAKE);
434
+ const builtTx = await txBuilder.build();
435
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingAdd);
436
+ should_1.default.equal(builtTx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
437
+ builtTx.inputs.length.should.equal(1);
438
+ builtTx.inputs[0].should.deepEqual({
439
+ address: testData.sender.address,
440
+ value: sui_1.STAKING_AMOUNT.toString(),
441
+ coin: 'tsui',
442
+ });
443
+ builtTx.outputs.length.should.equal(1);
444
+ builtTx.outputs[0].should.deepEqual({
445
+ address: testData.requestAddStake.validatorAddress,
446
+ value: sui_1.STAKING_AMOUNT.toString(),
447
+ coin: 'tsui',
448
+ });
449
+ const jsonTx = builtTx.toJson();
450
+ jsonTx.gasData.should.deepEqual(testData.gasData);
451
+ jsonTx.kind.ProgrammableTransaction.should.deepEqual({
452
+ inputs: testData.txInputsAddStake,
453
+ transactions: testData.txTransactionsAddStake,
454
+ });
455
+ jsonTx.sender.should.equal(testData.sender.address);
456
+ jsonTx.gasData.should.deepEqual(testData.gasData);
457
+ builtTx.toBroadcastFormat().should.equal(testData.ADD_STAKE);
458
+ });
459
+ });
460
+ describe('Unstaking TX', async () => {
461
+ beforeEach(function (done) {
462
+ builders = [factory.getUnstakingBuilder()];
463
+ done();
464
+ });
465
+ it('should build an unstaking transaction and serialize it and deserialize it', async function () {
466
+ const txBuilder = factory.getUnstakingBuilder();
467
+ txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
468
+ txBuilder.sender(testData.sender.address);
469
+ txBuilder.unstake(testData.requestWithdrawStakedSui);
470
+ txBuilder.gasData(testData.gasData);
471
+ const tx = await txBuilder.build();
472
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingClaim);
473
+ const rawTx = tx.toBroadcastFormat();
474
+ should_1.default.equal(rawTx, testData.WITHDRAW_STAKED_SUI);
475
+ const reserialized = await factory.from(rawTx).build();
476
+ reserialized.toBroadcastFormat().should.equal(rawTx);
477
+ });
478
+ it('should build and sign a staking tx with gasPayment', async function () {
479
+ const txBuilder = factory.getUnstakingBuilder();
480
+ txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
481
+ txBuilder.sender(testData.sender.address);
482
+ txBuilder.unstake(testData.requestWithdrawStakedSui);
483
+ txBuilder.gasData(testData.gasData);
484
+ const tx = await txBuilder.build();
485
+ should_1.default.equal(tx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
486
+ const rawTx = tx.toBroadcastFormat();
487
+ should_1.default.equal(rawTx, testData.WITHDRAW_STAKED_SUI);
488
+ const txBuilder2 = await factory.from(rawTx);
489
+ await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
490
+ const signedTx = await txBuilder2.build();
491
+ should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.StakingClaim);
492
+ should_1.default.equal(signedTx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
493
+ const rawSignedTx = signedTx.toBroadcastFormat();
494
+ should_1.default.equal(rawSignedTx, testData.WITHDRAW_STAKED_SUI);
495
+ const reserializedTxBuilder = factory.from(rawSignedTx);
496
+ reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
497
+ const reserialized = await reserializedTxBuilder.build();
498
+ reserialized.should.be.deepEqual(signedTx);
499
+ reserialized.toBroadcastFormat().should.equal(rawSignedTx);
500
+ });
501
+ it('should build and sign a staking transaction with private keys', async () => {
502
+ const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
503
+ const senderAddress = keyPairSender.getAddress();
504
+ const expectedStakingTxSig = 'ABqwaOIsxZjf/LIE985SJK2lH56oNxIuHVpZhN+6L9uZFYFuipa6zsg5fnprxuBPIUVTorw3yEJcoKNGZwOpQgKlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
505
+ const expectedStakingTxHex = 'AAACAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQEAAAAAAAAAAQEA7m38PaMuIVQaKurfzSUPigoju3q9qciYhAf8MgaMN0ZhBAAAAAAAACDJYCWUFis6HawzxGyErvRT03pYayRliLki0kYsV0XCBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlAAIBAAABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
506
+ const coins = [
507
+ {
508
+ digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
509
+ objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
510
+ version: 1126,
511
+ },
512
+ {
513
+ digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
514
+ objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
515
+ version: 1126,
516
+ },
517
+ ];
518
+ const txBuilder_1 = factory.getUnstakingBuilder();
519
+ txBuilder_1.type(iface_1.SuiTransactionType.WithdrawStake);
520
+ txBuilder_1.sender(senderAddress);
521
+ txBuilder_1.unstake(testData.requestWithdrawStakedSui);
522
+ const gasData = {
523
+ payment: coins,
524
+ owner: senderAddress,
525
+ budget: testData.GAS_BUDGET,
526
+ price: 1000,
527
+ };
528
+ txBuilder_1.gasData(gasData);
529
+ const tx_1 = await txBuilder_1.build();
530
+ const signable_1 = tx_1.signablePayload;
531
+ const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
532
+ txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
533
+ const signedTx_1 = (await txBuilder_1.build());
534
+ const txHex_1 = signedTx_1.toBroadcastFormat();
535
+ const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
536
+ const txBuilderFromRaw_2 = factory.getUnstakingBuilder();
537
+ txBuilderFromRaw_2.from(txHex_1);
538
+ const signable_2 = tx_1.signablePayload;
539
+ txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
540
+ const signedTx_2 = (await txBuilderFromRaw_2.build());
541
+ const txHex_2 = signedTx_2.toBroadcastFormat();
542
+ const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
543
+ should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
544
+ should_1.default.equal(txHex_1, txHex_2);
545
+ should_1.default.equal(txHex_1, expectedStakingTxHex);
546
+ should_1.default.equal(txHex_2, expectedStakingTxHex);
547
+ should_1.default.equal(sig_1, sig_2);
548
+ should_1.default.equal(sig_1, expectedStakingTxSig);
549
+ should_1.default.equal(sig_2, expectedStakingTxSig);
550
+ });
551
+ it('should fail to build if missing type', async function () {
552
+ for (const txBuilder of builders) {
553
+ txBuilder.sender(testData.sender.address);
554
+ txBuilder.unstake(testData.requestWithdrawStakedSui);
555
+ txBuilder.gasData(testData.gasData);
556
+ await txBuilder.build().should.rejectedWith('type is required before building');
557
+ }
558
+ });
559
+ it('should fail to build if missing sender', async function () {
560
+ for (const txBuilder of builders) {
561
+ txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
562
+ txBuilder.unstake(testData.requestWithdrawStakedSui);
563
+ txBuilder.gasData(testData.gasData);
564
+ await txBuilder.build().should.rejectedWith('sender is required before building');
565
+ }
566
+ });
567
+ it('should fail to build if missing gasData', async function () {
568
+ for (const txBuilder of builders) {
569
+ txBuilder.sender(testData.sender.address);
570
+ txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
571
+ txBuilder.unstake(testData.requestWithdrawStakedSui);
572
+ await txBuilder.build().should.rejectedWith('gasData is required before building');
573
+ }
574
+ });
575
+ it('should fail to build if missing payment coins in gasData', async function () {
576
+ for (const txBuilder of builders) {
577
+ txBuilder.sender(testData.sender.address);
578
+ txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
579
+ txBuilder.unstake(testData.requestWithdrawStakedSui);
580
+ (0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
581
+ await txBuilder.build().should.rejectedWith('gasData is required before building');
582
+ }
583
+ });
584
+ it('should build a send from rawTx', async function () {
585
+ const txBuilder = factory.from(testData.WITHDRAW_STAKED_SUI);
586
+ const builtTx = await txBuilder.build();
587
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingClaim);
588
+ should_1.default.equal(builtTx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
589
+ builtTx.inputs.length.should.equal(1);
590
+ builtTx.inputs[0].should.deepEqual({
591
+ address: testData.requestWithdrawStakedSui.stakedSui.objectId,
592
+ value: constants_1.AMOUNT_UNKNOWN_TEXT,
593
+ coin: 'tsui',
594
+ });
595
+ builtTx.outputs.length.should.equal(1);
596
+ builtTx.outputs[0].should.deepEqual({
597
+ address: testData.sender.address,
598
+ value: constants_1.AMOUNT_UNKNOWN_TEXT,
599
+ coin: 'tsui',
600
+ });
601
+ const jsonTx = builtTx.toJson();
602
+ jsonTx.gasData.should.deepEqual(testData.gasData);
603
+ jsonTx.kind.ProgrammableTransaction.should.deepEqual({
604
+ inputs: testData.txInputWithdrawStaked,
605
+ transactions: testData.txTransactionsWithdrawStaked,
606
+ });
607
+ jsonTx.sender.should.equal(testData.sender.address);
608
+ jsonTx.gasData.should.deepEqual(testData.gasData);
609
+ builtTx.toBroadcastFormat().should.equal(testData.WITHDRAW_STAKED_SUI);
610
+ });
611
+ it('should determine correct type for withdrawal with amount', async function () {
612
+ const txBuilder = factory.from(testData.WITHDRAW_STAKED_SUI_WITH_AMOUNT);
613
+ const tx = await txBuilder.build();
614
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingClaim);
615
+ });
616
+ });
617
+ describe('Custom TX', async () => {
618
+ it('should sign a custom tx', async function () {
619
+ const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
620
+ const txBuilder = factory.from(sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
621
+ const tx = await txBuilder.build();
622
+ const unsignedTxHex = tx.toBroadcastFormat();
623
+ const signable = tx.signablePayload;
624
+ const signatureBytes = keyPairSender.signMessageinUint8Array(signable);
625
+ txBuilder.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signatureBytes));
626
+ const signedTx = (await txBuilder.build());
627
+ const signedTxHex = signedTx.toBroadcastFormat();
628
+ should_1.default.equal(signedTxHex, unsignedTxHex);
629
+ should_1.default.equal(signedTx.signature.length, 1);
630
+ should_1.default.equal(signedTx.signature[0], Buffer.from(signatureBytes).toString('hex'));
631
+ const serializedSig = Buffer.from(signedTx.serializedSig).toString('base64');
632
+ should_1.default.equal(serializedSig, 'APGQHoYbVSyL6M7lOQL5w2YYzeeVcTMEbe0Y4jVphQA+0QHq3VEDoXVwIukkL44z+vqsekviS4gQ0ZwUPTWHFQilzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==');
633
+ });
634
+ it('should fail to build if unsupported txn type', async function () {
635
+ (0, should_1.default)(() => factory.from(sui_1.UNSUPPORTED_TX)).throwError('unsupported target method 0000000000000000000000000000000000000000000000000000000000000003::staking_pool::split_staked_sui');
636
+ });
637
+ });
638
+ });
639
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBeUQ7QUFDekQsOERBQWdEO0FBQ2hELG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQsa0RBQTREO0FBQzVELDZDQUErRztBQUMvRyxzREFBbUQ7QUFJbkQsMERBQWlFO0FBR2pFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtJQUM3QyxJQUFJLFFBQVEsQ0FBQztJQUNiLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqQyxVQUFVLENBQUMsVUFBVSxJQUFJO1lBQ3ZCLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxLQUFLO1lBQ2pGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQVUsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFD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QUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUVqRixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0UsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsYUFBYSxFQUNiLHNJQUFzSSxDQUN2SSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUUsS0FBSztZQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ25ELDRIQUE0SCxDQUM3SCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFN1aVRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgQ1VTVE9NX1RYX1NUQUtJTkdfUE9PTF9TUExJVCwgcmVjaXBpZW50cywgU1RBS0lOR19BTU9VTlQsIFVOU1VQUE9SVEVEX1RYIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3N1aSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9rZXlQYWlyJztcbmltcG9ydCB7IEdhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcyc7XG5pbXBvcnQgeyBTdGFraW5nVHJhbnNhY3Rpb24sIFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgVW5zdGFraW5nVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3Vuc3Rha2luZ1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEFNT1VOVF9VTktOT1dOX1RFWFQgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDdXN0b21UcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvY3VzdG9tVHJhbnNhY3Rpb24nO1xuXG5kZXNjcmliZSgnU3VpIFRyYW5zYWN0aW9uIEJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gIGxldCBidWlsZGVycztcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJyk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zZmVyIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJ1aWxkZXJzID0gW2ZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCldO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVFJBTlNGRVIpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpO1xuICAgICAgcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwodHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSB0cmFuc2ZlciB0eCB3aXRoIGdhc1BheW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICdVTkFWQUlMQUJMRScpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UUkFOU0ZFUik7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlkLCAnQnhvZUdYYkJDdXc2VkZFY2d3SEhVQUtyQ29Bc0dhblBCMzlrZFZWS1paY1InKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5UUkFOU0ZFUik7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3U2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwoc2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSB0cmFuc2ZlciB0eCB3aXRoIGdhc1BheW1lbnQgYXMgZGlmZmVyZW50IG93bmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YUhhdmluZ0RpZmZlcmVudE93bmVyKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICdVTkFWQUlMQUJMRScpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5GRUVfU1BPTlNPUl9UUkFOU0ZFUik7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyMi5hZGRGZWVQYXllclNpZ25hdHVyZShcbiAgICAgICAgeyBwdWI6IHRlc3REYXRhLmZlZVBheWVyLnB1YmxpY0tleSB9LFxuICAgICAgICBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5mZWVQYXllci5zaWduYXR1cmVIZXgpXG4gICAgICApO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlkLCAnQ281ZDZ0aUxRdXdVUHJmUHA3dmZtY0pNTks1Z1daM1N0RlI2Y3Z6cTZSMTInKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5GRUVfU1BPTlNPUl9UUkFOU0ZFUik7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3U2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYWRkRmVlUGF5ZXJTaWduYXR1cmUoXG4gICAgICAgIHsgcHViOiB0ZXN0RGF0YS5mZWVQYXllci5wdWJsaWNLZXkgfSxcbiAgICAgICAgQnVmZmVyLmZyb20odGVzdERhdGEuZmVlUGF5ZXIuc2lnbmF0dXJlSGV4KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IHJlc2VyaWFsaXplZFR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICByZXNlcmlhbGl6ZWQuc2hvdWxkLmJlLmRlZXBFcXVhbChzaWduZWRUeCk7XG4gICAgICByZXNlcmlhbGl6ZWQudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3U2lnbmVkVHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWJtaXQgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIHByaXZhdGUga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXJTZW5kZXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IGtleVBhaXJSZWNpcGllbnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MiB9KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBrZXlQYWlyU2VuZGVyLmdldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IHJlY2VpdmVBZGRyZXNzID0ga2V5UGFpclJlY2lwaWVudC5nZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zZmVyVHhTaWcgPVxuICAgICAgICAnQUk4UTlLSU5xU0NPZUh2aHY2TUo2VmYzVFdiVGN4aHBjbGcwUEQ5Z0JnYW5kMmtMUVp4RUpTL0hKQVNnYW5MS2ZaMjc3SWw0bUFpZktIenZ0YjJmQ0ErbHphcTFqNHdNdUNpWHVGVzRvakZmdW9CaEVpQnkvSzRlQjVCa0haK2Vadz09JztcbiAgICAgIGNvbnN0IGV4cGVjdGVkVHJhbnNmZXJUeEhleCA9XG4gICAgICAgICdBQUFDQUFnQTRmVUZBQUFBQUFBZ3RlditubmNEZlR0b3dKWkVQSFVNc0pYaWE0d0ttVC9YcGd0cnpzeTZPMzhDQWdBQkFRQUFBUUVDQUFBQkFRQ1FCMEs3a2o2cEJxVnZNbG9YV1hkUzdOT3NNQ2E3cVc0TzMvUmQ2TnN6cXdKM0FiaUl3V001bXMxYmdFWXp3ZERsTXJ3eFE4L3ZOTW8yQytZSHhvM043MllFQUFBQUFBQUFJRHJNY0VPVGlkak9kcDdhMUovampKOXRPamI2UDJXVHlCU3dRcUFIaUExL3lmVmxhK2NZSXdFOWszNEdWT3MrM0xKaGxhL1NNQW0rbXJsdWZ6OHR3Z05tQkFBQUFBQUFBQ0FoWG5rWG9iUzJFL1JaL2NMRFEvbjNCSC9UeEFqS3Y1VnhzYkxFWkNVeHU1QUhRcnVTUHFrR3BXOHlXaGRaZDFMczA2d3dKcnVwYmc3ZjlGM28yek9yNkFNQUFBQUFBQUFBTFRFQkFBQUFBQUE9JztcblxuICAgICAgY29uc3QgY29pbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICc0eFhUR2hodE5VakJVOG5NaXZzTFdUTVJXdlpSYzVSV0RNZ3lUTW5uUkRZUycsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc3MDFiODg4YzE2MzM5OWFjZDViODA0NjMzYzFkMGU1MzJiYzMxNDNjZmVmMzRjYTM2MGJlNjA3YzY4ZGNkZWYnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICczRkcxTmZrNUhyUTF0V1lLUzhCWDl5blpUU3ByTDVoTG4zcGd3N2tkajFSVScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGM5ZjU2NTZiZTcxODIzMDEzZDkzN2UwNjU0ZWIzZWRjYjI2MTk1YWZkMjMwMDliZTlhYjk2ZTdmM2YyZGMyMDMnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgdHhCdWlsZGVyXzEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyXzEudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZGVyKHNlbmRlckFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZChbeyBhZGRyZXNzOiByZWNlaXZlQWRkcmVzcywgYW1vdW50OiAnMTAwMDAwMDAwJyB9XSk7XG4gICAgICBjb25zdCBnYXNEYXRhOiBHYXNEYXRhID0ge1xuICAgICAgICBwYXltZW50OiBjb2lucyxcbiAgICAgICAgb3duZXI6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGJ1ZGdldDogdGVzdERhdGEuR0FTX0JVREdFVCxcbiAgICAgICAgcHJpY2U6IDEwMDAsXG4gICAgICB9O1xuICAgICAgdHhCdWlsZGVyXzEuZ2FzRGF0YShnYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHhfMSA9IGF3YWl0IHR4QnVpbGRlcl8xLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduYWJsZV8xID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVfMSA9IGtleVBhaXJTZW5kZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGVfMSk7XG4gICAgICB0eEJ1aWxkZXJfMS5hZGRTaWduYXR1cmUoeyBwdWI6IGtleVBhaXJTZW5kZXIuZ2V0S2V5cygpLnB1YiB9LCBCdWZmZXIuZnJvbShzaWduYXR1cmVfMSkpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMSA9IChhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMSA9IHNpZ25lZFR4XzEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18xID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMS5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlckZyb21SYXdfMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuZnJvbSh0eEhleF8xKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzIgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHR4QnVpbGRlckZyb21SYXdfMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMiA9IChhd2FpdCB0eEJ1aWxkZXJGcm9tUmF3XzIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzIgPSBzaWduZWRUeF8yLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMiA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzIuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oc2lnbmFibGVfMSkudG9TdHJpbmcoJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYWJsZV8yKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzEsIHR4SGV4XzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzEsIGV4cGVjdGVkVHJhbnNmZXJUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMiwgZXhwZWN0ZWRUcmFuc2ZlclR4SGV4KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgc2lnXzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBleHBlY3RlZFRyYW5zZmVyVHhTaWcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18yLCBleHBlY3RlZFRyYW5zZmVyVHhTaWcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWJtaXQgYSBzbGl0IGNvaW4gdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyU2VuZGVyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0ga2V5UGFpclNlbmRlci5nZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zZmVyVHhTaWcgPVxuICAgICAgICAnQUdHV0hadXlVanN4TWhNb1BvcWRzWlJUQzUwYThtQnlEaHVwd0UwV3JEbHZ2cXp3YVJPN1I1c1kyMC9JWWdhYlVBOWZlcDNvMzVzc25SaFVaMGpEcXdtbHphcTFqNHdNdUNpWHVGVzRvakZmdW9CaEVpQnkvSzRlQjVCa0haK2Vadz09JztcbiAgICAgIGNvbnN0IGV4cGVjdGVkVHJhbnNmZXJUeEhleCA9XG4gICAgICAgICdBQUFWQUFnQTRmVUZBQUFBQUFBZ2tBZEN1NUkrcVFhbGJ6SmFGMWwzVXV6VHJEQW11Nmx1RHQvMFhlamJNNnNBQ0FEaDlRVUFBQUFBQUFnQTRmVUZBQUFBQUFBSUFPSDFCUUFBQUFBQUNBRGg5UVVBQUFBQUFBZ0E0ZlVGQUFBQUFBQUlBT0gxQlFBQUFBQUFDQURoOVFVQUFBQUFBQWdBNGZVRkFBQUFBQUFJQU9IMUJRQUFBQUFBQ0FEaDlRVUFBQUFBQUFnQTRmVUZBQUFBQUFBSUFPSDFCUUFBQUFBQUNBRGg5UVVBQUFBQUFBZ0E0ZlVGQUFBQUFBQUlBT0gxQlFBQUFBQUFDQURoOVFVQUFBQUFBQWdBNGZVRkFBQUFBQUFJQU9IMUJRQUFBQUFBQ0FEaDlRVUFBQUFBS0FJQUFRRUFBQUVCQWdBQUFRRUFBZ0FCQVFJQUFRRUNBZ0FCQVFBQ0FBRUJBd0FCQVFJRUFBRUJBQUlBQVFFRUFBRUJBZ1lBQVFFQUFnQUJBUVVBQVFFQ0NBQUJBUUFDQUFFQkJnQUJBUUlLQUFFQkFBSUFBUUVIQUFFQkFnd0FBUUVBQWdBQkFRZ0FBUUVDRGdBQkFRQUNBQUVCQ1FBQkFRSVFBQUVCQUFJQUFRRUtBQUVCQWhJQUFRRUFBZ0FCQVFzQUFRRUNGQUFCQVFBQ0FBRUJEQUFCQVFJV0FBRUJBQUlBQVFFTkFBRUJBaGdBQVFFQUFnQUJBUTRBQVFFQ0dnQUJBUUFDQUFFQkR3QUJBUUljQUFFQkFBSUFBUUVRQUFFQkFoNEFBUUVBQWdBQkFSRUFBUUVDSUFBQkFRQUNBQUVCRWdBQkFRSWlBQUVCQUFJQUFRRVRBQUVCQWlRQUFRRUFBZ0FCQVJRQUFRRUNKZ0FCQVFDUUIwSzdrajZwQnFWdk1sb1hXWGRTN05Pc01DYTdxVzRPMy9SZDZOc3pxd0ozQWJpSXdXTTVtczFiZ0VZendkRGxNcnd4UTgvdk5NbzJDK1lIeG8zTjcyWUVBQUFBQUFBQUlEck1jRU9UaWRqT2RwN2ExSi9qako5dE9qYjZQMldUeUJTd1FxQUhpQTEveWZWbGErY1lJd0U5azM0R1ZPcyszTEpobGEvU01BbSttcmx1Zno4dHdnTm1CQUFBQUFBQUFDQWhYbmtYb2JTMkUvUlovY0xEUS9uM0JIL1R4QWpLdjVWeHNiTEVaQ1V4dTVBSFFydVNQcWtHcFc4eVdoZFpkMUxzMDZ3d0pydXBiZzdmOUYzbzJ6T3I2QU1BQUFBQUFBQUFMVEVCQUFBQUFBQT0nO1xuXG4gICAgICBjb25zdCBjb2lucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGRpZ2VzdDogJzR4WFRHaGh0TlVqQlU4bk1pdnNMV1RNUld2WlJjNVJXRE1neVRNbm5SRFlTJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4NzcwMWI4ODhjMTYzMzk5YWNkNWI4MDQ2MzNjMWQwZTUzMmJjMzE0M2NmZWYzNGNhMzYwYmU2MDdjNjhkY2RlZicsXG4gICAgICAgICAgdmVyc2lvbjogMTEyNixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRpZ2VzdDogJzNGRzFOZms1SHJRMXRXWUtTOEJYOXluWlRTcHJMNWhMbjNwZ3c3a2RqMVJVJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4YzlmNTY1NmJlNzE4MjMwMTNkOTM3ZTA2NTRlYjNlZGNiMjYxOTVhZmQyMzAwOWJlOWFiOTZlN2YzZjJkYzIwMycsXG4gICAgICAgICAgdmVyc2lvbjogMTEyNixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB0eEJ1aWxkZXJfMSA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJfMS50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXJfMS5zZW5kZXIoc2VuZGVyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXJfMS5zZW5kKEFycmF5KDIwKS5maWxsKHsgYWRkcmVzczogc2VuZGVyQWRkcmVzcywgYW1vdW50OiAnMTAwMDAwMDAwJyB9KSk7XG4gICAgICBjb25zdCBnYXNEYXRhOiBHYXNEYXRhID0ge1xuICAgICAgICBwYXltZW50OiBjb2lucyxcbiAgICAgICAgb3duZXI6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGJ1ZGdldDogdGVzdERhdGEuR0FTX0JVREdFVCxcbiAgICAgICAgcHJpY2U6IDEwMDAsXG4gICAgICB9O1xuICAgICAgdHhCdWlsZGVyXzEuZ2FzRGF0YShnYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHhfMSA9IGF3YWl0IHR4QnVpbGRlcl8xLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduYWJsZV8xID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVfMSA9IGtleVBhaXJTZW5kZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGVfMSk7XG4gICAgICB0eEJ1aWxkZXJfMS5hZGRTaWduYXR1cmUoeyBwdWI6IGtleVBhaXJTZW5kZXIuZ2V0S2V5cygpLnB1YiB9LCBCdWZmZXIuZnJvbShzaWduYXR1cmVfMSkpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMSA9IChhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMSA9IHNpZ25lZFR4XzEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18xID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMS5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlckZyb21SYXdfMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuZnJvbSh0eEhleF8xKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzIgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZV8yID0ga2V5UGFpclNlbmRlci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZV8yKTtcbiAgICAgIHR4QnVpbGRlckZyb21SYXdfMi5hZGRTaWduYXR1cmUoeyBwdWI6IGtleVBhaXJTZW5kZXIuZ2V0S2V5cygpLnB1YiB9LCBCdWZmZXIuZnJvbShzaWduYXR1cmVfMikpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMiA9IChhd2FpdCB0eEJ1aWxkZXJGcm9tUmF3XzIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzIgPSBzaWduZWRUeF8yLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMiA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzIuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oc2lnbmFibGVfMSkudG9TdHJpbmcoJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYWJsZV8yKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzEsIHR4SGV4XzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzEsIGV4cGVjdGVkVHJhbnNmZXJUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMiwgZXhwZWN0ZWRUcmFuc2ZlclR4SGV4KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgc2lnXzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBleHBlY3RlZFRyYW5zZmVyVHhTaWcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18yLCBleHBlY3RlZFRyYW5zZmVyVHhTaWcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3R5cGUgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3NlbmRlciBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2F0IGxlYXN0IG9uZSByZWNpcGllbnQgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgcGF5bWVudCBjb2lucyBpbiBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50KSkudGhyb3dFcnJvcihcbiAgICAgICAgICBgZ2FzIHBheW1lbnQgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNlbmQgZnJvbSByYXdUeCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5UUkFOU0ZFUik7XG4gICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgJ0J4b2VHWGJCQ3V3NlZGRWNnd0hIVUFLckNvQXNHYW5QQjM5a2RWVktaWmNSJyk7XG4gICAgICBidWlsdFR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgYnVpbHRUeC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogKHRlc3REYXRhLkFNT1VOVCAqIDIpLnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBidWlsdFR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGJ1aWx0VHgub3V0cHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBqc29uVHgua2luZC5Qcm9ncmFtbWFibGVUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiB0ZXN0RGF0YS50eElucHV0cyxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiB0ZXN0RGF0YS50eFRyYW5zYWN0aW9ucyxcbiAgICAgIH0pO1xuICAgICAganNvblR4LnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAganNvblR4Lmdhc0RhdGEuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuVFJBTlNGRVIpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ1N0YWtpbmcgVFgnLCBhc3luYyAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYnVpbGRlcnMgPSBbZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpXTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gYWRkIHN0YWtpbmcgdHJhbnNhY3Rpb24gYW5kIHNlcmlhbGl6ZSBpdCBhbmQgZGVzZXJpYWxpemUgaXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQUREX1NUQUtFKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIHN0YWtlTWFueSB0cmFuc2FjdGlvbiBhbmQgc2VyaWFsaXplIGl0IGFuZCBkZXNlcmlhbGl6ZSBpdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VNYW55KTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlNUQUtFX01BTlkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpO1xuICAgICAgLy8gcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwodHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSBzdGFraW5nIHR4IHdpdGggZ2FzUGF5bWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlXSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICdiUDc4Ym9aNDhzRGRKc2cyVjF0SmFocEd5QndhQzlHU1RMMnJ2eUFEbnNoJyk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFERF9TVEFLRSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlkLCAnYlA3OGJvWjQ4c0RkSnNnMlYxdEphaHBHeUJ3YUM5R1NUTDJydnlBRG5zaCcpO1xuXG4gICAgICBjb25zdCByYXdTaWduZWRUeCA9IHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3U2lnbmVkVHgsIHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3U2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwoc2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSBzdGFraW5nIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpclNlbmRlciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGtleVBhaXJTZW5kZXIuZ2V0QWRkcmVzcygpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nVHhTaWcgPVxuICAgICAgICAnQUQ4NzU1ZStrQTMvSXkrM29SeEJiUWlLMEl6NHFtRDRzWmNwb1FOMFVNUHhJWHY3UXg0dHd2dUFpWmY5SDJuSFlhL0FlMGFzTTRSa3oxU0NQMGRoWGdxbHphcTFqNHdNdUNpWHVGVzRvakZmdW9CaEVpQnkvSzRlQjVCa0haK2Vadz09JztcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1R4SGV4ID1cbiAgICAgICAgJ0FBQUpBQWdBTFRFQkFBQUFBQUVCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVUJBQUFBQUFBQUFBRUFJRVN4c3huaU5KV1pYOGczMnYwby9HcjR0a1h0M2Y4UHdVWi9HdFl4Tml3akFBZ0FyQ1A4QmdBQUFBQWdSTEd6R2VJMGxabGZ5RGZhL1NqOGF2aTJSZTNkL3cvQlJuOGExakUyTENZQUNBQXRNUUVBQUFBQUFDQkVzYk1aNGpTVm1WL0lOOXI5S1B4cStMWkY3ZDMvRDhGR2Z4cldNVFlzSmdBSUFLd2ovQVlBQUFBQUlFU3hzeG5pTkpXWlg4ZzMydjBvL0dyNHRrWHQzZjhQd1VaL0d0WXhOaXdqQ0FJQUFRRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3cHpkV2xmYzNsemRHVnRFWEpsY1hWbGMzUmZZV1JrWDNOMFlXdGxBQU1CQVFBQ0FBQUJBZ0FDQUFFQkF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNS2MzVnBYM041YzNSbGJSRnlaWEYxWlhOMFgyRmtaRjl6ZEdGclpRQURBUUVBQWdJQUFRUUFBZ0FCQVFVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQ25OMWFWOXplWE4wWlcwUmNtVnhkV1Z6ZEY5aFpHUmZjM1JoYTJVQUF3RUJBQUlFQUFFR0FBSUFBUUVIQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd3B6ZFdsZmMzbHpkR1Z0RVhKbGNYVmxjM1JmWVdSa1gzTjBZV3RsQUFNQkFRQUNCZ0FCQ0FDUUIwSzdrajZwQnFWdk1sb1hXWGRTN05Pc01DYTdxVzRPMy9SZDZOc3pxd0ozQWJpSXdXTTVtczFiZ0VZendkRGxNcnd4UTgvdk5NbzJDK1lIeG8zTjcyWUVBQUFBQUFBQUlEck1jRU9UaWRqT2RwN2ExSi9qako5dE9qYjZQMldUeUJTd1FxQUhpQTEveWZWbGErY1lJd0U5azM0R1ZPcyszTEpobGEvU01BbSttcmx1Zno4dHdnTm1CQUFBQUFBQUFDQWhYbmtYb2JTMkUvUlovY0xEUS9uM0JIL1R4QWpLdjVWeHNiTEVaQ1V4dTVBSFFydVNQcWtHcFc4eVdoZFpkMUxzMDZ3d0pydXBiZzdmOUYzbzJ6T3I2QU1BQUFBQUFBQUFMVEVCQUFBQUFBQT0nO1xuXG4gICAgICBjb25zdCBjb2lucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGRpZ2VzdDogJzR4WFRHaGh0TlVqQlU4bk1pdnNMV1RNUld2WlJjNVJXRE1neVRNbm5SRFlTJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4NzcwMWI4ODhjMTYzMzk5YWNkNWI4MDQ2MzNjMWQwZTUzMmJjMzE0M2NmZWYzNGNhMzYwYmU2MDdjNjhkY2RlZicsXG4gICAgICAgICAgdmVyc2lvbjogMTEyNixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRpZ2VzdDogJzNGRzFOZms1SHJRMXRXWUtTOEJYOXluWlRTcHJMNWhMbjNwZ3c3a2RqMVJVJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4YzlmNTY1NmJlNzE4MjMwMTNkOTM3ZTA2NTRlYjNlZGNiMjYxOTVhZmQyMzAwOWJlOWFiOTZlN2YzZjJkYzIwMycsXG4gICAgICAgICAgdmVyc2lvbjogMTEyNixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB0eEJ1aWxkZXJfMSA9IGZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcl8xLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmRlcihzZW5kZXJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcl8xLnN0YWtlKHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZU1hbnkpO1xuICAgICAgY29uc3QgZ2FzRGF0YTogR2FzRGF0YSA9IHtcbiAgICAgICAgcGF5bWVudDogY29pbnMsXG4gICAgICAgIG93bmVyOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIHByaWNlOiAxMDAwLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlcl8xLmdhc0RhdGEoZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4XzEgPSBhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMSA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlXzEgPSBrZXlQYWlyU2VuZGVyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlXzEpO1xuICAgICAgdHhCdWlsZGVyXzEuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzEpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzEgPSAoYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKSkgYXMgU3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMSA9IHNpZ25lZFR4XzEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18xID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMS5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlckZyb21SYXdfMiA9IGZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlckZyb21SYXdfMi5mcm9tKHR4SGV4XzEpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMiA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeF8yID0gKGF3YWl0IHR4QnVpbGRlckZyb21SYXdfMi5idWlsZCgpKSBhcyBTdGFraW5nVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8yID0gc2lnbmVkVHhfMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzIgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8yLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzEpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmFibGVfMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCB0eEhleF8yKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCBleHBlY3RlZFN0YWtpbmdUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMiwgZXhwZWN0ZWRTdGFraW5nVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBzaWdfMik7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzEsIGV4cGVjdGVkU3Rha2luZ1R4U2lnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMiwgZXhwZWN0ZWRTdGFraW5nVHhTaWcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndHlwZSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlXSk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlXSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBwYXltZW50IGNvaW5zIGluIGdhc0RhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgYGdhcyBwYXltZW50IGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZ2BcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzZW5kIGZyb20gcmF3VHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQUREX1NUQUtFKTtcbiAgICAgIGNvbnN0IGJ1aWx0VHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCAnYlA3OGJvWjQ4c0RkSnNnMlYxdEphaHBHeUJ3YUM5R1NUTDJydnlBRG5zaCcpO1xuICAgICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IFNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB2YWx1ZTogU1RBS0lOR19BTU9VTlQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBqc29uVHggPSBidWlsdFR4LnRvSnNvbigpO1xuICAgICAganNvblR4Lmdhc0RhdGEuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGpzb25UeC5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IHRlc3REYXRhLnR4SW5wdXRzQWRkU3Rha2UsXG4gICAgICAgIHRyYW5zYWN0aW9uczogdGVzdERhdGEudHhUcmFuc2FjdGlvbnNBZGRTdGFrZSxcbiAgICAgIH0pO1xuICAgICAganNvblR4LnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAganNvblR4Lmdhc0RhdGEuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREX1NUQUtFKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdVbnN0YWtpbmcgVFgnLCBhc3luYyAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYnVpbGRlcnMgPSBbZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCldO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiB1bnN0YWtpbmcgdHJhbnNhY3Rpb24gYW5kIHNlcmlhbGl6ZSBpdCBhbmQgZGVzZXJpYWxpemUgaXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFVuc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuV0lUSERSQVdfU1RBS0VEX1NVSSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCk7XG4gICAgICByZXNlcmlhbGl6ZWQudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBhIHN0YWtpbmcgdHggd2l0aCBnYXNQYXltZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICdSaXh6OUMyeVE2akRGRnNvdlVzODRZNnl3MmRjbzhISDRRaEs3UkNRWU5vJyk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQ2xhaW0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlkLCAnUml4ejlDMnlRNmpERkZzb3ZVczg0WTZ5dzJkY284SEg0UWhLN1JDUVlObycpO1xuXG4gICAgICBjb25zdCByYXdTaWduZWRUeCA9IHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3U2lnbmVkVHgsIHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkVHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1NpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZFR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHNpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdTaWduZWRUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgc3Rha2luZyB0cmFuc2FjdGlvbiB3aXRoIHByaXZhdGUga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXJTZW5kZXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBrZXlQYWlyU2VuZGVyLmdldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1R4U2lnID1cbiAgICAgICAgJ0FCcXdhT0lzeFpqZi9MSUU5ODVTSksybEg1Nm9OeEl1SFZwWmhOKzZMOXVaRllGdWlwYTZ6c2c1Zm5wcnh1QlBJVVZUb3J3M3lFSmNvS05HWndPcFFnS2x6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFN0YWtpbmdUeEhleCA9XG4gICAgICAgICdBQUFDQVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUUVBQUFBQUFBQUFBUUVBN20zOFBhTXVJVlFhS3VyZnpTVVBpZ29qdTNxOXFjaVloQWY4TWdhTU4wWmhCQUFBQUFBQUFDREpZQ1dVRmlzNkhhd3p4R3lFcnZSVDAzcFlheVJsaUxraTBrWXNWMFhDQkFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1LYzNWcFgzTjVjM1JsYlJaeVpYRjFaWE4wWDNkcGRHaGtjbUYzWDNOMFlXdGxBQUlCQUFBQkFRQ1FCMEs3a2o2cEJxVnZNbG9YV1hkUzdOT3NNQ2E3cVc0TzMvUmQ2TnN6cXdKM0FiaUl3V001bXMxYmdFWXp3ZERsTXJ3eFE4L3ZOTW8yQytZSHhvM043MllFQUFBQUFBQUFJRHJNY0VPVGlkak9kcDdhMUovampKOXRPamI2UDJXVHlCU3dRcUFIaUExL3lmVmxhK2NZSXdFOWszNEdWT3MrM0xKaGxhL1NNQW0rbXJsdWZ6OHR3Z05tQkFBQUFBQUFBQ0FoWG5rWG9iUzJFL1JaL2NMRFEvbjNCSC9UeEFqS3Y1VnhzYkxFWkNVeHU1QUhRcnVTUHFrR3BXOHlXaGRaZDFMczA2d3dKcnVwYmc3ZjlGM28yek9yNkFNQUFBQUFBQUFBTFRFQkFBQUFBQUE9JztcblxuICAgICAgY29uc3QgY29pbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICc0eFhUR2hodE5VakJVOG5NaXZzTFdUTVJXdlpSYzVSV0RNZ3lUTW5uUkRZUycsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc3MDFiODg4YzE2MzM5OWFjZDViODA0NjMzYzFkMGU1MzJiYzMxNDNjZmVmMzRjYTM2MGJlNjA3YzY4ZGNkZWYnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICczRkcxTmZrNUhyUTF0V1lLUzhCWDl5blpUU3ByTDVoTG4zcGd3N2tkajFSVScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGM5ZjU2NTZiZTcxODIzMDEzZDkzN2UwNjU0ZWIzZWRjYjI2MTk1YWZkMjMwMDliZTlhYjk2ZTdmM2YyZGMyMDMnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgdHhCdWlsZGVyXzEgPSBmYWN0b3J5LmdldFVuc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcl8xLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZGVyKHNlbmRlckFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyXzEudW5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWkpO1xuICAgICAgY29uc3QgZ2FzRGF0YTogR2FzRGF0YSA9IHtcbiAgICAgICAgcGF5bWVudDogY29pbnMsXG4gICAgICAgIG93bmVyOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIHByaWNlOiAxMDAwLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlcl8xLmdhc0RhdGEoZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4XzEgPSBhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMSA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlXzEgPSBrZXlQYWlyU2VuZGVyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlXzEpO1xuICAgICAgdHhCdWlsZGVyXzEuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzEpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzEgPSAoYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKSkgYXMgVW5zdGFraW5nVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8xID0gc2lnbmVkVHhfMS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzEgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8xLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyRnJvbVJhd18yID0gZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuZnJvbSh0eEhleF8xKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzIgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHR4QnVpbGRlckZyb21SYXdfMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMiA9IChhd2FpdCB0eEJ1aWxkZXJGcm9tUmF3XzIuYnVpbGQoKSkgYXMgVW5zdGFraW5nVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8yID0gc2lnbmVkVHhfMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzIgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8yLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzEpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmFibGVfMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCB0eEhleF8yKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCBleHBlY3RlZFN0YWtpbmdUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMiwgZXhwZWN0ZWRTdGFraW5nVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBzaWdfMik7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzEsIGV4cGVjdGVkU3Rha2luZ1R4U2lnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMiwgZXhwZWN0ZWRTdGFraW5nVHhTaWcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudW5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWkpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndHlwZSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3NlbmRlciBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIGdhc0RhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpO1xuICAgICAgICB0eEJ1aWxkZXIudW5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWkpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgcGF5bWVudCBjb2lucyBpbiBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgYGdhcyBwYXltZW50IGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZ2BcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzZW5kIGZyb20gcmF3VHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuV0lUSERSQVdfU1RBS0VEX1NVSSk7XG4gICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCAnUml4ejlDMnlRNmpERkZzb3ZVczg0WTZ5dzJkY284SEg0UWhLN1JDUVlObycpO1xuICAgICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWkuc3Rha2VkU3VpLm9iamVjdElkLFxuICAgICAgICB2YWx1ZTogQU1PVU5UX1VOS05PV05fVEVYVCxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBidWlsdFR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGJ1aWx0VHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiBBTU9VTlRfVU5LTk9XTl9URVhULFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAgICBqc29uVHguZ2FzRGF0YS5zaG91bGQuZGVlcEVxdWFsKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAganNvblR4LmtpbmQuUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogdGVzdERhdGEudHhJbnB1dFdpdGhkcmF3U3Rha2VkLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IHRlc3REYXRhLnR4VHJhbnNhY3Rpb25zV2l0aGRyYXdTdGFrZWQsXG4gICAgICB9KTtcbiAgICAgIGpzb25UeC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXRlcm1pbmUgY29ycmVjdCB0eXBlIGZvciB3aXRoZHJhd2FsIHdpdGggYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUlfV0lUSF9BTU9VTlQpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdDdXN0b20gVFgnLCBhc3luYyAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGEgY3VzdG9tIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5UGFpclNlbmRlciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oQ1VTVE9NX1RYX1NUQUtJTkdfUE9PTF9TUExJVCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWduYWJsZSA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0ga2V5UGFpclNlbmRlci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZSk7XG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlQnl0ZXMpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHNpZ25lZFR4SGV4ID0gc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeEhleCwgdW5zaWduZWRUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHguc2lnbmF0dXJlWzBdLCBCdWZmZXIuZnJvbShzaWduYXR1cmVCeXRlcykudG9TdHJpbmcoJ2hleCcpKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplZFNpZyA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4LnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgc2VyaWFsaXplZFNpZyxcbiAgICAgICAgJ0FQR1FIb1liVlN5TDZNN2xPUUw1dzJZWXplZVZjVE1FYmUwWTRqVnBoUUErMFFIcTNWRURvWFZ3SXVra0w0NHordnFzZWt2aVM0Z1EwWndVUFRXSEZRaWx6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgdW5zdXBwb3J0ZWQgdHhuIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKFVOU1VQUE9SVEVEX1RYKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ3Vuc3VwcG9ydGVkIHRhcmdldCBtZXRob2QgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzo6c3Rha2luZ19wb29sOjpzcGxpdF9zdGFrZWRfc3VpJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==