@bitgo-beta/sdk-coin-sol 2.4.3-beta.999 → 7.6.4-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/src/bigint-buffer-guard.d.ts +1 -0
  2. package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
  3. package/dist/src/bigint-buffer-guard.js +29 -0
  4. package/dist/src/config/token2022StaticConfig.d.ts +3 -0
  5. package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
  6. package/dist/src/config/token2022StaticConfig.js +50 -0
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/lib/constants.d.ts +37 -2
  11. package/dist/src/lib/constants.d.ts.map +1 -1
  12. package/dist/src/lib/constants.js +44 -2
  13. package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
  14. package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/customInstructionBuilder.js +289 -0
  16. package/dist/src/lib/iface.d.ts +85 -5
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +1 -1
  19. package/dist/src/lib/index.d.ts +1 -0
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +4 -2
  22. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  23. package/dist/src/lib/instructionParamsFactory.js +374 -78
  24. package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
  25. package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  26. package/dist/src/lib/jitoStakePoolOperations.js +200 -0
  27. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  28. package/dist/src/lib/solInstructionFactory.js +274 -69
  29. package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
  30. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/stakingActivateBuilder.js +23 -10
  32. package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
  33. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  34. package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
  35. package/dist/src/lib/token2022Config.d.ts +44 -0
  36. package/dist/src/lib/token2022Config.d.ts.map +1 -0
  37. package/dist/src/lib/token2022Config.js +27 -0
  38. package/dist/src/lib/tokenTransferBuilder.js +7 -7
  39. package/dist/src/lib/transaction.d.ts +31 -4
  40. package/dist/src/lib/transaction.d.ts.map +1 -1
  41. package/dist/src/lib/transaction.js +136 -46
  42. package/dist/src/lib/transactionBuilder.d.ts +18 -2
  43. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  44. package/dist/src/lib/transactionBuilder.js +78 -2
  45. package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
  46. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  47. package/dist/src/lib/transactionBuilderFactory.js +10 -1
  48. package/dist/src/lib/utils.d.ts +34 -1
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +91 -24
  51. package/dist/src/sol.d.ts +36 -13
  52. package/dist/src/sol.d.ts.map +1 -1
  53. package/dist/src/sol.js +230 -38
  54. package/dist/test/fixtures/sol.d.ts +1152 -0
  55. package/dist/test/fixtures/sol.d.ts.map +1 -0
  56. package/dist/test/fixtures/sol.js +1433 -0
  57. package/dist/test/resources/sol.d.ts +238 -0
  58. package/dist/test/resources/sol.d.ts.map +1 -0
  59. package/dist/test/resources/sol.js +320 -0
  60. package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
  61. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  62. package/dist/test/unit/fixtures/solBackupKey.js +8 -0
  63. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  64. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  65. package/dist/test/unit/getBuilderFactory.js +10 -0
  66. package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
  67. package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
  68. package/dist/test/unit/instructionParamsFactory.js +412 -0
  69. package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
  70. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  71. package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
  72. package/dist/test/unit/keyPair.d.ts +2 -0
  73. package/dist/test/unit/keyPair.d.ts.map +1 -0
  74. package/dist/test/unit/keyPair.js +177 -0
  75. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  76. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  77. package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
  78. package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
  79. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  80. package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
  81. package/dist/test/unit/sol.d.ts +2 -0
  82. package/dist/test/unit/sol.d.ts.map +1 -0
  83. package/dist/test/unit/sol.js +3108 -0
  84. package/dist/test/unit/solInstructionFactory.d.ts +2 -0
  85. package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
  86. package/dist/test/unit/solInstructionFactory.js +454 -0
  87. package/dist/test/unit/solToken.d.ts +2 -0
  88. package/dist/test/unit/solToken.d.ts.map +1 -0
  89. package/dist/test/unit/solToken.js +31 -0
  90. package/dist/test/unit/transaction.d.ts +2 -0
  91. package/dist/test/unit/transaction.d.ts.map +1 -0
  92. package/dist/test/unit/transaction.js +983 -0
  93. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
  94. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  96. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
  97. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  99. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
  100. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  101. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  102. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
  103. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  104. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  105. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
  106. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  107. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  108. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
  109. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  110. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  111. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  114. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  117. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
  120. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  121. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  123. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  124. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
  126. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
  127. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  128. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
  129. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
  130. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  132. package/dist/test/unit/utils.d.ts +2 -0
  133. package/dist/test/unit/utils.d.ts.map +1 -0
  134. package/dist/test/unit/utils.js +517 -0
  135. package/dist/test/unit/versionedTransaction.d.ts +2 -0
  136. package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
  137. package/dist/test/unit/versionedTransaction.js +207 -0
  138. package/dist/tsconfig.tsbuildinfo +1 -0
  139. package/package.json +14 -9
  140. package/.eslintignore +0 -5
  141. package/.mocharc.yml +0 -8
  142. package/CHANGELOG.md +0 -1223
@@ -0,0 +1,862 @@
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 src_1 = require("../../../src");
41
+ const testData = __importStar(require("../../resources/sol"));
42
+ const should_1 = __importDefault(require("should"));
43
+ describe('Sol Transfer Builder V2', () => {
44
+ let ataAddress;
45
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
46
+ const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
47
+ const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
48
+ const otherAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
49
+ const feePayerAccount = new src_1.KeyPair(testData.feePayerAccount).getKeys();
50
+ const invalidPubKey = testData.pubKeys.invalidPubKeys[0];
51
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
52
+ const amount = '300000';
53
+ const memo = 'test memo';
54
+ const nameUSDC = testData.tokenTransfers.nameUSDC;
55
+ const mintUSDC = testData.tokenTransfers.mintUSDC;
56
+ const nameAMS = testData.amsTokenTransfers.nameAMSToken;
57
+ const mintAMS = testData.amsTokenTransfers.mintAMS;
58
+ const amsProgramID = testData.amsTokenTransfers.programID;
59
+ const owner = testData.tokenTransfers.owner;
60
+ const walletPK = testData.associatedTokenAccounts.accounts[0].pub;
61
+ const walletSK = testData.associatedTokenAccounts.accounts[0].prv;
62
+ const prioFeeMicroLamports = '10000000';
63
+ const priorityFee = {
64
+ amount: prioFeeMicroLamports,
65
+ };
66
+ const transferBuilderV2 = () => {
67
+ const txBuilder = factory.getTransferBuilderV2();
68
+ txBuilder.nonce(recentBlockHash);
69
+ txBuilder.sender(authAccount.pub);
70
+ return txBuilder;
71
+ };
72
+ describe('Succeed Native Transfer', () => {
73
+ it('build a transfer tx unsigned with memo', async () => {
74
+ const txBuilder = factory.getTransferBuilderV2();
75
+ txBuilder.nonce(recentBlockHash);
76
+ txBuilder.feePayer(feePayerAccount.pub);
77
+ txBuilder.sender(authAccount.pub);
78
+ txBuilder.send({ address: otherAccount.pub, amount });
79
+ txBuilder.memo(memo);
80
+ const tx = await txBuilder.build();
81
+ tx.inputs.length.should.equal(1);
82
+ tx.inputs[0].should.deepEqual({
83
+ address: authAccount.pub,
84
+ value: amount,
85
+ coin: 'tsol',
86
+ });
87
+ tx.outputs.length.should.equal(1);
88
+ tx.outputs[0].should.deepEqual({
89
+ address: otherAccount.pub,
90
+ value: amount,
91
+ coin: 'tsol',
92
+ });
93
+ const rawTx = tx.toBroadcastFormat();
94
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
95
+ should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_UNSIGNED_WITH_MEMO);
96
+ const reserialized = await factory.from(rawTx).build();
97
+ // reserialized.should.be.deepEqual(tx); // we have extra param _useTokenAddressTokenName for factory.from method
98
+ reserialized.toBroadcastFormat().should.equal(rawTx);
99
+ });
100
+ it('build a transfer tx unsigned with durable nonce', async () => {
101
+ const txBuilder = factory.getTransferBuilderV2();
102
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
103
+ txBuilder.feePayer(feePayerAccount.pub);
104
+ txBuilder.sender(authAccount.pub);
105
+ txBuilder.send({ address: otherAccount.pub, amount });
106
+ const tx = await txBuilder.build();
107
+ tx.inputs.length.should.equal(1);
108
+ tx.inputs[0].should.deepEqual({
109
+ address: authAccount.pub,
110
+ value: amount,
111
+ coin: 'tsol',
112
+ });
113
+ tx.outputs.length.should.equal(1);
114
+ tx.outputs[0].should.deepEqual({
115
+ address: otherAccount.pub,
116
+ value: amount,
117
+ coin: 'tsol',
118
+ });
119
+ const rawTx = tx.toBroadcastFormat();
120
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
121
+ should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_WITH_DURABLE_NONCE);
122
+ const txJson = tx.toJson();
123
+ txJson.durableNonce.should.deepEqual({
124
+ walletNonceAddress: nonceAccount.pub,
125
+ authWalletAddress: authAccount.pub,
126
+ });
127
+ });
128
+ it('build a transfer tx unsigned with memo and durable nonce', async () => {
129
+ const txBuilder = factory.getTransferBuilderV2();
130
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
131
+ txBuilder.sender(authAccount.pub);
132
+ txBuilder.feePayer(feePayerAccount.pub);
133
+ txBuilder.send({ address: otherAccount.pub, amount });
134
+ txBuilder.memo(memo);
135
+ const tx = await txBuilder.build();
136
+ tx.inputs.length.should.equal(1);
137
+ tx.inputs[0].should.deepEqual({
138
+ address: authAccount.pub,
139
+ value: amount,
140
+ coin: 'tsol',
141
+ });
142
+ tx.outputs.length.should.equal(1);
143
+ tx.outputs[0].should.deepEqual({
144
+ address: otherAccount.pub,
145
+ value: amount,
146
+ coin: 'tsol',
147
+ });
148
+ const rawTx = tx.toBroadcastFormat();
149
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
150
+ should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
151
+ });
152
+ it('build a transfer tx unsigned without memo or durable nonce', async () => {
153
+ const txBuilder = factory.getTransferBuilderV2();
154
+ txBuilder.nonce(recentBlockHash);
155
+ txBuilder.feePayer(feePayerAccount.pub);
156
+ txBuilder.sender(authAccount.pub);
157
+ txBuilder.send({ address: otherAccount.pub, amount });
158
+ const tx = await txBuilder.build();
159
+ tx.inputs.length.should.equal(1);
160
+ tx.inputs[0].should.deepEqual({
161
+ address: authAccount.pub,
162
+ value: amount,
163
+ coin: 'tsol',
164
+ });
165
+ tx.outputs.length.should.equal(1);
166
+ tx.outputs[0].should.deepEqual({
167
+ address: otherAccount.pub,
168
+ value: amount,
169
+ coin: 'tsol',
170
+ });
171
+ const rawTx = tx.toBroadcastFormat();
172
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
173
+ should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_UNSIGNED_TX_WITHOUT_MEMO);
174
+ });
175
+ it('build a transfer tx signed with memo and durable nonce', async () => {
176
+ const txBuilder = factory.getTransferBuilderV2();
177
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
178
+ txBuilder.feePayer(feePayerAccount.pub);
179
+ txBuilder.sender(authAccount.pub);
180
+ txBuilder.send({ address: otherAccount.pub, amount });
181
+ txBuilder.memo(memo);
182
+ txBuilder.sign({ key: authAccount.prv });
183
+ const tx = await txBuilder.build();
184
+ tx.inputs.length.should.equal(1);
185
+ tx.inputs[0].should.deepEqual({
186
+ address: authAccount.pub,
187
+ value: amount,
188
+ coin: 'tsol',
189
+ });
190
+ tx.outputs.length.should.equal(1);
191
+ tx.outputs[0].should.deepEqual({
192
+ address: otherAccount.pub,
193
+ value: amount,
194
+ coin: 'tsol',
195
+ });
196
+ const rawTx = tx.toBroadcastFormat();
197
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
198
+ should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
199
+ });
200
+ it('build a multi transfer tx signed with memo and durable nonce', async () => {
201
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
202
+ const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
203
+ const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
204
+ const account4 = new src_1.KeyPair({ prv: testData.extraAccounts.prv4 }).getKeys();
205
+ const account5 = new src_1.KeyPair({ prv: testData.extraAccounts.prv5 }).getKeys();
206
+ const txBuilder = factory.getTransferBuilderV2();
207
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
208
+ txBuilder.sender(authAccount.pub);
209
+ txBuilder.feePayer(feePayerAccount.pub);
210
+ txBuilder.send({ address: otherAccount.pub, amount });
211
+ txBuilder.send({ address: account1.pub, amount });
212
+ txBuilder.send({ address: account2.pub, amount });
213
+ txBuilder.send({ address: account3.pub, amount });
214
+ txBuilder.send({ address: account4.pub, amount });
215
+ txBuilder.send({ address: account5.pub, amount });
216
+ txBuilder.memo(memo);
217
+ txBuilder.sign({ key: authAccount.prv });
218
+ const tx = await txBuilder.build();
219
+ tx.inputs.length.should.equal(6);
220
+ tx.inputs[0].should.deepEqual({
221
+ address: authAccount.pub,
222
+ value: amount,
223
+ coin: 'tsol',
224
+ });
225
+ tx.inputs[1].should.deepEqual({
226
+ address: authAccount.pub,
227
+ value: amount,
228
+ coin: 'tsol',
229
+ });
230
+ tx.inputs[2].should.deepEqual({
231
+ address: authAccount.pub,
232
+ value: amount,
233
+ coin: 'tsol',
234
+ });
235
+ tx.inputs[3].should.deepEqual({
236
+ address: authAccount.pub,
237
+ value: amount,
238
+ coin: 'tsol',
239
+ });
240
+ tx.inputs[4].should.deepEqual({
241
+ address: authAccount.pub,
242
+ value: amount,
243
+ coin: 'tsol',
244
+ });
245
+ tx.inputs[5].should.deepEqual({
246
+ address: authAccount.pub,
247
+ value: amount,
248
+ coin: 'tsol',
249
+ });
250
+ tx.outputs.length.should.equal(6);
251
+ tx.outputs[0].should.deepEqual({
252
+ address: otherAccount.pub,
253
+ value: amount,
254
+ coin: 'tsol',
255
+ });
256
+ tx.outputs[1].should.deepEqual({
257
+ address: account1.pub,
258
+ value: amount,
259
+ coin: 'tsol',
260
+ });
261
+ tx.outputs[2].should.deepEqual({
262
+ address: account2.pub,
263
+ value: amount,
264
+ coin: 'tsol',
265
+ });
266
+ tx.outputs[3].should.deepEqual({
267
+ address: account3.pub,
268
+ value: amount,
269
+ coin: 'tsol',
270
+ });
271
+ tx.outputs[4].should.deepEqual({
272
+ address: account4.pub,
273
+ value: amount,
274
+ coin: 'tsol',
275
+ });
276
+ tx.outputs[5].should.deepEqual({
277
+ address: account5.pub,
278
+ value: amount,
279
+ coin: 'tsol',
280
+ });
281
+ const rawTx = tx.toBroadcastFormat();
282
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
283
+ should_1.default.equal(rawTx, testData.NATIVE_MULTI_TRANSFERV2_SIGNED);
284
+ });
285
+ });
286
+ describe('Fail Native Transfer', () => {
287
+ it('for invalid sender', () => {
288
+ const txBuilder = transferBuilderV2();
289
+ (0, should_1.default)(() => txBuilder.sender(invalidPubKey)).throwError('Invalid or missing sender, got: ' + invalidPubKey);
290
+ });
291
+ it('for invalid toAddress', () => {
292
+ const txBuilder = transferBuilderV2();
293
+ (0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount })).throwError('Invalid or missing address, got: ' + invalidPubKey);
294
+ });
295
+ it('for invalid amount', () => {
296
+ const invalidAmount = 'randomstring';
297
+ const txBuilder = transferBuilderV2();
298
+ (0, should_1.default)(() => txBuilder.send({ address: nonceAccount.pub, amount: invalidAmount })).throwError('Invalid or missing amount, got: ' + invalidAmount);
299
+ });
300
+ it('to sign twice with the same key', () => {
301
+ const txBuilder = factory.from(testData.TRANSFER_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
302
+ txBuilder.sign({ key: authAccount.prv });
303
+ (0, should_1.default)(() => txBuilder.sign({ key: authAccount.prv })).throwError('Duplicated signer: ' + authAccount.prv?.toString());
304
+ });
305
+ });
306
+ describe('Succeed Token Transfer', () => {
307
+ before(async () => {
308
+ ataAddress = await src_1.Utils.getAssociatedTokenAccountAddress(mintUSDC, otherAccount.pub);
309
+ });
310
+ it('build a token transfer tx unsigned with memo', async () => {
311
+ const txBuilder = factory.getTransferBuilderV2();
312
+ txBuilder.nonce(recentBlockHash);
313
+ txBuilder.feePayer(feePayerAccount.pub);
314
+ txBuilder.sender(walletPK);
315
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
316
+ txBuilder.memo(memo);
317
+ txBuilder.setPriorityFee(priorityFee);
318
+ const tx = await txBuilder.build();
319
+ tx.inputs.length.should.equal(1);
320
+ tx.inputs[0].should.deepEqual({
321
+ address: walletPK,
322
+ value: amount,
323
+ coin: nameUSDC,
324
+ });
325
+ tx.outputs.length.should.equal(1);
326
+ tx.outputs[0].should.deepEqual({
327
+ address: otherAccount.pub,
328
+ value: amount,
329
+ coin: nameUSDC,
330
+ });
331
+ const rawTx = tx.toBroadcastFormat();
332
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
333
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITH_MEMO);
334
+ });
335
+ it('build a token transfer tx unsigned with durable nonce', async () => {
336
+ const txBuilder = factory.getTransferBuilderV2();
337
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
338
+ txBuilder.feePayer(feePayerAccount.pub);
339
+ txBuilder.sender(walletPK);
340
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
341
+ txBuilder.setPriorityFee(priorityFee);
342
+ const tx = await txBuilder.build();
343
+ tx.inputs.length.should.equal(1);
344
+ tx.inputs[0].should.deepEqual({
345
+ address: walletPK,
346
+ value: amount,
347
+ coin: nameUSDC,
348
+ });
349
+ tx.outputs.length.should.equal(1);
350
+ tx.outputs[0].should.deepEqual({
351
+ address: otherAccount.pub,
352
+ value: amount,
353
+ coin: nameUSDC,
354
+ });
355
+ const rawTx = tx.toBroadcastFormat();
356
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
357
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITH_DURABLE_NONCE);
358
+ const txJson = tx.toJson();
359
+ txJson.durableNonce.should.deepEqual({
360
+ walletNonceAddress: nonceAccount.pub,
361
+ authWalletAddress: walletPK,
362
+ });
363
+ });
364
+ it('build a token transfer tx unsigned with memo and durable nonce', async () => {
365
+ const txBuilder = factory.getTransferBuilderV2();
366
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
367
+ txBuilder.feePayer(feePayerAccount.pub);
368
+ txBuilder.sender(walletPK);
369
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
370
+ txBuilder.memo(memo);
371
+ txBuilder.setPriorityFee(priorityFee);
372
+ const tx = await txBuilder.build();
373
+ tx.inputs.length.should.equal(1);
374
+ tx.inputs[0].should.deepEqual({
375
+ address: walletPK,
376
+ value: amount,
377
+ coin: nameUSDC,
378
+ });
379
+ tx.outputs.length.should.equal(1);
380
+ tx.outputs[0].should.deepEqual({
381
+ address: otherAccount.pub,
382
+ value: amount,
383
+ coin: nameUSDC,
384
+ });
385
+ const rawTx = tx.toBroadcastFormat();
386
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
387
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
388
+ });
389
+ it('build a token transfer tx unsigned without memo or durable nonce', async () => {
390
+ const txBuilder = factory.getTransferBuilderV2();
391
+ txBuilder.nonce(recentBlockHash);
392
+ txBuilder.feePayer(feePayerAccount.pub);
393
+ txBuilder.sender(walletPK);
394
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
395
+ txBuilder.setPriorityFee(priorityFee);
396
+ const tx = await txBuilder.build();
397
+ tx.inputs.length.should.equal(1);
398
+ tx.inputs[0].should.deepEqual({
399
+ address: walletPK,
400
+ value: amount,
401
+ coin: nameUSDC,
402
+ });
403
+ tx.outputs.length.should.equal(1);
404
+ tx.outputs[0].should.deepEqual({
405
+ address: otherAccount.pub,
406
+ value: amount,
407
+ coin: nameUSDC,
408
+ });
409
+ const rawTx = tx.toBroadcastFormat();
410
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
411
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITHOUT_MEMO);
412
+ });
413
+ it('build a token transfer tx signed with memo and durable nonce', async () => {
414
+ const txBuilder = factory.getTransferBuilderV2();
415
+ txBuilder.nonce(recentBlockHash, {
416
+ walletNonceAddress: nonceAccount.pub,
417
+ authWalletAddress: walletPK,
418
+ });
419
+ txBuilder.feePayer(feePayerAccount.pub);
420
+ txBuilder.sender(walletPK);
421
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
422
+ txBuilder.memo(memo);
423
+ txBuilder.sign({ key: walletSK });
424
+ txBuilder.setPriorityFee(priorityFee);
425
+ const tx = await txBuilder.build();
426
+ tx.id.should.not.equal(undefined);
427
+ tx.inputs.length.should.equal(1);
428
+ tx.inputs[0].should.deepEqual({
429
+ address: walletPK,
430
+ value: amount,
431
+ coin: nameUSDC,
432
+ });
433
+ tx.outputs.length.should.equal(1);
434
+ tx.outputs[0].should.deepEqual({
435
+ address: otherAccount.pub,
436
+ value: amount,
437
+ coin: nameUSDC,
438
+ });
439
+ const rawTx = tx.toBroadcastFormat();
440
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
441
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
442
+ });
443
+ it('build a token transfer tx unsigned with create ATA, memo and durable nonce', async () => {
444
+ const txBuilder = factory.getTransferBuilderV2();
445
+ txBuilder.nonce(recentBlockHash, {
446
+ walletNonceAddress: nonceAccount.pub,
447
+ authWalletAddress: walletPK,
448
+ });
449
+ txBuilder.feePayer(feePayerAccount.pub);
450
+ txBuilder.sender(walletPK);
451
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
452
+ txBuilder.memo(memo);
453
+ txBuilder.createAssociatedTokenAccount({ ownerAddress: otherAccount.pub, tokenName: nameUSDC });
454
+ txBuilder.sign({ key: walletSK });
455
+ txBuilder.setPriorityFee(priorityFee);
456
+ const tx = await txBuilder.build();
457
+ tx.id.should.not.equal(undefined);
458
+ tx.inputs.length.should.equal(1);
459
+ tx.inputs[0].should.deepEqual({
460
+ address: walletPK,
461
+ value: amount,
462
+ coin: nameUSDC,
463
+ });
464
+ tx.outputs.length.should.equal(1);
465
+ tx.outputs[0].should.deepEqual({
466
+ address: otherAccount.pub,
467
+ value: amount,
468
+ coin: nameUSDC,
469
+ });
470
+ const txJson = tx.toJson();
471
+ txJson.instructionsData.length.should.equal(4);
472
+ txJson.instructionsData[0].type.should.equal('SetPriorityFee');
473
+ txJson.instructionsData[1].type.should.equal('CreateAssociatedTokenAccount');
474
+ txJson.instructionsData[1].params.should.deepEqual({
475
+ mintAddress: mintUSDC,
476
+ ataAddress: ataAddress,
477
+ ownerAddress: otherAccount.pub,
478
+ payerAddress: walletPK,
479
+ tokenName: nameUSDC,
480
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
481
+ });
482
+ txJson.instructionsData[2].type.should.equal('TokenTransfer');
483
+ txJson.instructionsData[2].params.should.deepEqual({
484
+ fromAddress: walletPK,
485
+ toAddress: otherAccount.pub,
486
+ amount: amount,
487
+ tokenName: nameUSDC,
488
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
489
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
490
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
491
+ decimalPlaces: 9,
492
+ });
493
+ txJson.instructionsData[3].type.should.equal('Memo');
494
+ txJson.instructionsData[3].params.memo.should.equal(memo);
495
+ const rawTx = tx.toBroadcastFormat();
496
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
497
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_SIGNED_TX_WITH_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE);
498
+ });
499
+ it('build a token transfer tx unsigned with create ATA, memo, tokenAddress and durable nonce', async () => {
500
+ const txBuilder = factory.getTransferBuilderV2();
501
+ txBuilder.nonce(recentBlockHash, {
502
+ walletNonceAddress: nonceAccount.pub,
503
+ authWalletAddress: walletPK,
504
+ });
505
+ txBuilder.feePayer(feePayerAccount.pub);
506
+ txBuilder.sender(walletPK);
507
+ txBuilder.send({
508
+ address: otherAccount.pub,
509
+ amount,
510
+ tokenName: nameAMS,
511
+ tokenAddress: mintAMS,
512
+ programId: amsProgramID,
513
+ decimalPlaces: 9,
514
+ });
515
+ txBuilder.memo(memo);
516
+ txBuilder.createAssociatedTokenAccount({
517
+ ownerAddress: otherAccount.pub,
518
+ tokenName: nameAMS,
519
+ tokenAddress: mintAMS,
520
+ programId: amsProgramID,
521
+ });
522
+ txBuilder.sign({ key: walletSK });
523
+ txBuilder.setPriorityFee(priorityFee);
524
+ const tx = await txBuilder.build();
525
+ tx.id.should.not.equal(undefined);
526
+ tx.inputs.length.should.equal(1);
527
+ tx.inputs[0].should.deepEqual({
528
+ address: walletPK,
529
+ value: amount,
530
+ coin: nameAMS,
531
+ });
532
+ tx.outputs.length.should.equal(1);
533
+ tx.outputs[0].should.deepEqual({
534
+ address: otherAccount.pub,
535
+ value: amount,
536
+ coin: nameAMS,
537
+ });
538
+ const txJson = tx.toJson();
539
+ txJson.instructionsData.length.should.equal(4);
540
+ txJson.instructionsData[0].type.should.equal('SetPriorityFee');
541
+ txJson.instructionsData[1].type.should.equal('CreateAssociatedTokenAccount');
542
+ txJson.instructionsData[1].params.should.deepEqual({
543
+ mintAddress: mintAMS,
544
+ ataAddress: '8KLnroP6hHkr1ZsQL4k6A3i2yhhnv2kr2Teedx7a26Eg',
545
+ ownerAddress: otherAccount.pub,
546
+ payerAddress: walletPK,
547
+ tokenName: nameAMS,
548
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
549
+ });
550
+ txJson.instructionsData[2].type.should.equal('TokenTransfer');
551
+ txJson.instructionsData[2].params.should.deepEqual({
552
+ fromAddress: walletPK,
553
+ toAddress: otherAccount.pub,
554
+ amount: amount,
555
+ tokenName: nameAMS,
556
+ sourceAddress: 'EytHm3gWSmaTkuF1datepgDzx7grGuDG7ws5QA7tCmU4',
557
+ tokenAddress: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
558
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
559
+ decimalPlaces: 9,
560
+ });
561
+ txJson.instructionsData[3].type.should.equal('Memo');
562
+ txJson.instructionsData[3].params.memo.should.equal(memo);
563
+ const rawTx = tx.toBroadcastFormat();
564
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
565
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_SIGNED_TX_WITH_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE_WITH_OPTIONAL_PARAMS);
566
+ });
567
+ it('build a token multi transfer tx signed with memo and durable nonce', async () => {
568
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
569
+ const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
570
+ const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
571
+ const account4 = new src_1.KeyPair({ prv: testData.extraAccounts.prv4 }).getKeys();
572
+ const account5 = new src_1.KeyPair({ prv: testData.extraAccounts.prv5 }).getKeys();
573
+ const txBuilder = factory.getTransferBuilderV2();
574
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
575
+ txBuilder.sender(owner);
576
+ txBuilder.feePayer(feePayerAccount.pub);
577
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
578
+ txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
579
+ txBuilder.send({ address: account2.pub, amount, tokenName: nameUSDC });
580
+ txBuilder.send({ address: account3.pub, amount, tokenName: nameUSDC });
581
+ txBuilder.send({ address: account4.pub, amount, tokenName: nameUSDC });
582
+ txBuilder.send({ address: account5.pub, amount, tokenName: nameUSDC });
583
+ txBuilder.memo(memo);
584
+ txBuilder.sign({ key: authAccount.prv });
585
+ txBuilder.setPriorityFee(priorityFee);
586
+ const tx = await txBuilder.build();
587
+ tx.inputs.length.should.equal(6);
588
+ tx.inputs[0].should.deepEqual({
589
+ address: owner,
590
+ value: amount,
591
+ coin: nameUSDC,
592
+ });
593
+ tx.inputs[1].should.deepEqual({
594
+ address: owner,
595
+ value: amount,
596
+ coin: nameUSDC,
597
+ });
598
+ tx.inputs[2].should.deepEqual({
599
+ address: owner,
600
+ value: amount,
601
+ coin: nameUSDC,
602
+ });
603
+ tx.inputs[3].should.deepEqual({
604
+ address: owner,
605
+ value: amount,
606
+ coin: nameUSDC,
607
+ });
608
+ tx.inputs[4].should.deepEqual({
609
+ address: owner,
610
+ value: amount,
611
+ coin: nameUSDC,
612
+ });
613
+ tx.inputs[5].should.deepEqual({
614
+ address: owner,
615
+ value: amount,
616
+ coin: nameUSDC,
617
+ });
618
+ tx.outputs.length.should.equal(6);
619
+ tx.outputs[0].should.deepEqual({
620
+ address: otherAccount.pub,
621
+ value: amount,
622
+ coin: nameUSDC,
623
+ });
624
+ tx.outputs[1].should.deepEqual({
625
+ address: account1.pub,
626
+ value: amount,
627
+ coin: nameUSDC,
628
+ });
629
+ tx.outputs[2].should.deepEqual({
630
+ address: account2.pub,
631
+ value: amount,
632
+ coin: nameUSDC,
633
+ });
634
+ tx.outputs[3].should.deepEqual({
635
+ address: account3.pub,
636
+ value: amount,
637
+ coin: nameUSDC,
638
+ });
639
+ tx.outputs[4].should.deepEqual({
640
+ address: account4.pub,
641
+ value: amount,
642
+ coin: nameUSDC,
643
+ });
644
+ tx.outputs[5].should.deepEqual({
645
+ address: account5.pub,
646
+ value: amount,
647
+ coin: nameUSDC,
648
+ });
649
+ const rawTx = tx.toBroadcastFormat();
650
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
651
+ should_1.default.equal(rawTx, testData.MULTI_TOKEN_TRANSFERV2_SIGNED);
652
+ });
653
+ it('build a token multi asset transfer tx unsigned', async () => {
654
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
655
+ const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
656
+ const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
657
+ const txBuilder = factory.getTransferBuilderV2();
658
+ const nameSRM = 'tsol:srm';
659
+ const nameRAY = 'tsol:ray';
660
+ txBuilder.nonce(recentBlockHash);
661
+ txBuilder.feePayer(feePayerAccount.pub);
662
+ txBuilder.sender(owner);
663
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
664
+ txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
665
+ txBuilder.send({ address: account2.pub, amount, tokenName: nameSRM });
666
+ txBuilder.send({ address: account3.pub, amount, tokenName: nameRAY });
667
+ txBuilder.setPriorityFee(priorityFee);
668
+ const tx = await txBuilder.build();
669
+ tx.inputs.length.should.equal(4);
670
+ tx.inputs[0].should.deepEqual({
671
+ address: owner,
672
+ value: amount,
673
+ coin: nameUSDC,
674
+ });
675
+ tx.inputs[1].should.deepEqual({
676
+ address: owner,
677
+ value: amount,
678
+ coin: nameUSDC,
679
+ });
680
+ tx.inputs[2].should.deepEqual({
681
+ address: owner,
682
+ value: amount,
683
+ coin: nameSRM,
684
+ });
685
+ tx.inputs[3].should.deepEqual({
686
+ address: owner,
687
+ value: amount,
688
+ coin: nameRAY,
689
+ });
690
+ tx.outputs.length.should.equal(4);
691
+ tx.outputs[0].should.deepEqual({
692
+ address: otherAccount.pub,
693
+ value: amount,
694
+ coin: nameUSDC,
695
+ });
696
+ tx.outputs[1].should.deepEqual({
697
+ address: account1.pub,
698
+ value: amount,
699
+ coin: nameUSDC,
700
+ });
701
+ tx.outputs[2].should.deepEqual({
702
+ address: account2.pub,
703
+ value: amount,
704
+ coin: nameSRM,
705
+ });
706
+ tx.outputs[3].should.deepEqual({
707
+ address: account3.pub,
708
+ value: amount,
709
+ coin: nameRAY,
710
+ });
711
+ const txJson = tx.toJson();
712
+ txJson.instructionsData.length.should.equal(5);
713
+ txJson.instructionsData[1].params.sourceAddress.should.equal(testData.tokenTransfers.sourceUSDC);
714
+ txJson.instructionsData[2].params.sourceAddress.should.equal(testData.tokenTransfers.sourceUSDC);
715
+ txJson.instructionsData[3].params.sourceAddress.should.equal(testData.tokenTransfers.sourceSRM);
716
+ txJson.instructionsData[4].params.sourceAddress.should.equal(testData.tokenTransfers.sourceRAY);
717
+ const rawTx = tx.toBroadcastFormat();
718
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
719
+ should_1.default.equal(rawTx, testData.MULTI_ASSET_TOKEN_TRANSFERV2_UNSIGNED);
720
+ });
721
+ });
722
+ describe('Fail Token Transfer', () => {
723
+ it('for invalid sender', () => {
724
+ const txBuilder = transferBuilderV2();
725
+ (0, should_1.default)(() => txBuilder.sender(invalidPubKey)).throwError('Invalid or missing sender, got: ' + invalidPubKey);
726
+ });
727
+ it('for invalid toAddress', () => {
728
+ const txBuilder = transferBuilderV2();
729
+ (0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount, tokenName: nameUSDC })).throwError('Invalid or missing address, got: ' + invalidPubKey);
730
+ });
731
+ it('for invalid amount', () => {
732
+ const invalidAmount = 'randomstring';
733
+ const txBuilder = transferBuilderV2();
734
+ (0, should_1.default)(() => txBuilder.send({
735
+ address: nonceAccount.pub,
736
+ amount: invalidAmount,
737
+ tokenName: nameUSDC,
738
+ })).throwError('Invalid or missing amount, got: ' + invalidAmount);
739
+ });
740
+ });
741
+ describe('Suceed Native and Token Transfer', () => {
742
+ it('build a transfer tx with both native and token', async () => {
743
+ const txBuilder = factory.getTransferBuilderV2();
744
+ txBuilder.nonce(recentBlockHash);
745
+ txBuilder.feePayer(feePayerAccount.pub);
746
+ txBuilder.sender(authAccount.pub);
747
+ txBuilder.send({ address: otherAccount.pub, amount });
748
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
749
+ txBuilder.setPriorityFee(priorityFee);
750
+ const tx = await txBuilder.build();
751
+ tx.inputs.length.should.equal(2);
752
+ tx.inputs[0].should.deepEqual({
753
+ address: authAccount.pub,
754
+ value: amount,
755
+ coin: 'tsol',
756
+ });
757
+ tx.inputs[1].should.deepEqual({
758
+ address: authAccount.pub,
759
+ value: amount,
760
+ coin: nameUSDC,
761
+ });
762
+ tx.outputs.length.should.equal(2);
763
+ tx.outputs[0].should.deepEqual({
764
+ address: otherAccount.pub,
765
+ value: amount,
766
+ coin: 'tsol',
767
+ });
768
+ tx.outputs[1].should.deepEqual({
769
+ address: otherAccount.pub,
770
+ value: amount,
771
+ coin: nameUSDC,
772
+ });
773
+ const rawTx = tx.toBroadcastFormat();
774
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
775
+ should_1.default.equal(rawTx, testData.NATIVE_AND_TOKEN_TRANSFERV2_UNSIGNED);
776
+ });
777
+ it('build a multi transfer tx with both native and multiple token', async () => {
778
+ const txBuilder = factory.getTransferBuilderV2();
779
+ txBuilder.nonce(recentBlockHash);
780
+ txBuilder.feePayer(feePayerAccount.pub);
781
+ txBuilder.sender(authAccount.pub);
782
+ txBuilder.send({ address: otherAccount.pub, amount });
783
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
784
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
785
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
786
+ txBuilder.setPriorityFee(priorityFee);
787
+ const tx = await txBuilder.build();
788
+ tx.inputs.length.should.equal(4);
789
+ tx.inputs[0].should.deepEqual({
790
+ address: authAccount.pub,
791
+ value: amount,
792
+ coin: 'tsol',
793
+ });
794
+ tx.inputs[1].should.deepEqual({
795
+ address: authAccount.pub,
796
+ value: amount,
797
+ coin: nameUSDC,
798
+ });
799
+ tx.inputs[2].should.deepEqual({
800
+ address: authAccount.pub,
801
+ value: amount,
802
+ coin: nameUSDC,
803
+ });
804
+ tx.inputs[3].should.deepEqual({
805
+ address: authAccount.pub,
806
+ value: amount,
807
+ coin: nameUSDC,
808
+ });
809
+ tx.outputs.length.should.equal(4);
810
+ tx.outputs[0].should.deepEqual({
811
+ address: otherAccount.pub,
812
+ value: amount,
813
+ coin: 'tsol',
814
+ });
815
+ tx.outputs[1].should.deepEqual({
816
+ address: otherAccount.pub,
817
+ value: amount,
818
+ coin: nameUSDC,
819
+ });
820
+ tx.outputs[2].should.deepEqual({
821
+ address: otherAccount.pub,
822
+ value: amount,
823
+ coin: nameUSDC,
824
+ });
825
+ tx.outputs[3].should.deepEqual({
826
+ address: otherAccount.pub,
827
+ value: amount,
828
+ coin: nameUSDC,
829
+ });
830
+ const rawTx = tx.toBroadcastFormat();
831
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
832
+ should_1.default.equal(rawTx, testData.MULTI_NATIVE_AND_TOKEN_TRANSFERV2_UNSIGNED);
833
+ });
834
+ });
835
+ describe('Fail Native and Token Transfer', () => {
836
+ it('for invalid toAddress', () => {
837
+ const txBuilder = transferBuilderV2();
838
+ txBuilder.send({ address: otherAccount.pub, amount });
839
+ (0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount, tokenName: nameUSDC })).throwError('Invalid or missing address, got: ' + invalidPubKey);
840
+ });
841
+ it('for invalid amount', () => {
842
+ const invalidAmount = 'randomstring';
843
+ const txBuilder = transferBuilderV2();
844
+ txBuilder.send({ address: otherAccount.pub, amount });
845
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
846
+ (0, should_1.default)(() => txBuilder.send({
847
+ address: nonceAccount.pub,
848
+ amount: invalidAmount,
849
+ tokenName: nameUSDC,
850
+ })).throwError('Invalid or missing amount, got: ' + invalidAmount);
851
+ const excessiveTokenAmount = '18446744073709551616';
852
+ (0, should_1.default)(() => txBuilder.send({
853
+ address: nonceAccount.pub,
854
+ amount: excessiveTokenAmount,
855
+ tokenName: nameUSDC,
856
+ })).throwError(`input amount ${excessiveTokenAmount} exceeds big int limit 18446744073709551615`);
857
+ const excessiveAmount = '9007199254740992';
858
+ (0, should_1.default)(() => txBuilder.send({ address: nonceAccount.pub, amount: excessiveAmount })).throwError(`input amount ${excessiveAmount} exceeds max safe int 9007199254740991`);
859
+ });
860
+ });
861
+ });
862
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3RyYW5zZmVyQnVpbGRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNERBQXlEO0FBQ3pELHNDQUE4QztBQUM5Qyw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBRzVCLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7SUFDdkMsSUFBSSxVQUFVLENBQUM7SUFDZixNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGVBQWUsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEUsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsTUFBTSxlQUFlLEdBQUcsOENBQThDLENBQUM7SUFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUN6QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxD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LEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxD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QUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUc7Z0JBQ3pCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2Ys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QUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDekIsTUFBTSxFQUFFLG9CQUFvQjtnQkFDNUIsU0FBUyxFQUFFLFFBQVE7YUFDcEIsQ0FBQyxDQUNILENBQUMsVUFBVSxDQUFDLGdCQUFnQixvQkFBb0IsNkNBQTZDLENBQUMsQ0FBQztZQUVoRyxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztZQUMzQyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUM3RixnQkFBZ0IsZUFBZSx3Q0FBd0MsQ0FDeEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgS2V5UGFpciwgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBGZWVPcHRpb25zIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5kZXNjcmliZSgnU29sIFRyYW5zZmVyIEJ1aWxkZXIgVjInLCAoKSA9PiB7XG4gIGxldCBhdGFBZGRyZXNzO1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcblxuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBvdGhlckFjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IGZlZVBheWVyQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmZlZVBheWVyQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBpbnZhbGlkUHViS2V5ID0gdGVzdERhdGEucHViS2V5cy5pbnZhbGlkUHViS2V5c1swXTtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgY29uc3QgYW1vdW50ID0gJzMwMDAwMCc7XG4gIGNvbnN0IG1lbW8gPSAndGVzdCBtZW1vJztcbiAgY29uc3QgbmFtZVVTREMgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5uYW1lVVNEQztcbiAgY29uc3QgbWludFVTREMgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5taW50VVNEQztcbiAgY29uc3QgbmFtZUFNUyA9IHRlc3REYXRhLmFtc1Rva2VuVHJhbnNmZXJzLm5hbWVBTVNUb2tlbjtcbiAgY29uc3QgbWludEFNUyA9IHRlc3REYXRhLmFtc1Rva2VuVHJhbnNmZXJzLm1pbnRBTVM7XG4gIGNvbnN0IGFtc1Byb2dyYW1JRCA9IHRlc3REYXRhLmFtc1Rva2VuVHJhbnNmZXJzLnByb2dyYW1JRDtcbiAgY29uc3Qgb3duZXIgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5vd25lcjtcbiAgY29uc3Qgd2FsbGV0UEsgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWI7XG4gIGNvbnN0IHdhbGxldFNLID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHJ2O1xuICBjb25zdCBwcmlvRmVlTWljcm9MYW1wb3J0cyA9ICcxMDAwMDAwMCc7XG4gIGNvbnN0IHByaW9yaXR5RmVlOiBGZWVPcHRpb25zID0ge1xuICAgIGFtb3VudDogcHJpb0ZlZU1pY3JvTGFtcG9ydHMsXG4gIH07XG4gIGNvbnN0IHRyYW5zZmVyQnVpbGRlclYyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCBOYXRpdmUgVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1VOU0lHTkVEX1dJVEhfTUVNTyk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCk7XG4gICAgICAvLyByZXNlcmlhbGl6ZWQuc2hvdWxkLmJlLmRlZXBFcXVhbCh0eCk7IC8vIHdlIGhhdmUgZXh0cmEgcGFyYW0gX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSBmb3IgZmFjdG9yeS5mcm9tIG1ldGhvZFxuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YiB9KTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1dJVEhfRFVSQUJMRV9OT05DRSk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5kdXJhYmxlTm9uY2Uuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRob3V0IG1lbW8gb3IgZHVyYWJsZSBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihhdXRoQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTkFUSVZFX1RSQU5TRkVSVjJfVU5TSUdORURfVFhfV0lUSE9VVF9NRU1PKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zZmVyIHR4IHNpZ25lZCB3aXRoIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YiB9KTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYXV0aEFjY291bnQucHJ2IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1NJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgbXVsdGkgdHJhbnNmZXIgdHggc2lnbmVkIHdpdGggbWVtbyBhbmQgZHVyYWJsZSBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFjY291bnQxID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MSB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjIgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDMgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYzIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQ0ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2NCB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50NSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjUgfSkuZ2V0S2V5cygpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YiB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDIucHViLCBhbW91bnQgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQzLnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50NC5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDUucHViLCBhbW91bnQgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNik7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbM10uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYWNjb3VudDMucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQ0LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzVdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50NS5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5OQVRJVkVfTVVMVElfVFJBTlNGRVJWMl9TSUdORUQpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ0ZhaWwgTmF0aXZlIFRyYW5zZmVyJywgKCkgPT4ge1xuICAgIGl0KCdmb3IgaW52YWxpZCBzZW5kZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0cmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kZXIoaW52YWxpZFB1YktleSkpLnRocm93RXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBzZW5kZXIsIGdvdDogJyArIGludmFsaWRQdWJLZXkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnZhbGlkIHRvQWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBpbnZhbGlkUHViS2V5LCBhbW91bnQgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIG9yIG1pc3NpbmcgYWRkcmVzcywgZ290OiAnICsgaW52YWxpZFB1YktleVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkQW1vdW50ID0gJ3JhbmRvbXN0cmluZyc7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0cmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiBpbnZhbGlkQW1vdW50IH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgaW52YWxpZEFtb3VudFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0byBzaWduIHR3aWNlIHdpdGggdGhlIHNhbWUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlRSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYXV0aEFjY291bnQucHJ2IH0pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICdEdXBsaWNhdGVkIHNpZ25lcjogJyArIGF1dGhBY2NvdW50LnBydj8udG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdTdWNjZWVkIFRva2VuIFRyYW5zZmVyJywgKCkgPT4ge1xuICAgIGJlZm9yZShhc3luYyAoKSA9PiB7XG4gICAgICBhdGFBZGRyZXNzID0gYXdhaXQgVXRpbHMuZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MobWludFVTREMsIG90aGVyQWNjb3VudC5wdWIpO1xuICAgIH0pO1xuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHVuc2lnbmVkIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUlYyX1VOU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLIH0pO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRF9UWF9XSVRIX0RVUkFCTEVfTk9OQ0UpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uZHVyYWJsZU5vbmNlLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyB9KTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aG91dCBtZW1vIG9yIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSVjJfVU5TSUdORURfVFhfV0lUSE9VVF9NRU1PKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHNpZ25lZCB3aXRoIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0U0sgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlkLnNob3VsZC5ub3QuZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSVjJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIGNyZWF0ZSBBVEEsIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7IG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXRTSyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaWQuc2hvdWxkLm5vdC5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdTZXRQcmlvcml0eUZlZScpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMV0udHlwZS5zaG91bGQuZXF1YWwoJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbWludEFkZHJlc3M6IG1pbnRVU0RDLFxuICAgICAgICBhdGFBZGRyZXNzOiBhdGFBZGRyZXNzLFxuICAgICAgICBvd25lckFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHByb2dyYW1JZDogJ0FUb2tlbkdQdmJkR1Z4cjFiMmh2WmJzaXFXNXhXSDI1ZWZUTnNMSkE4a25MJyxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0udHlwZS5zaG91bGQuZXF1YWwoJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzJdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZnJvbUFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB0b0FkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICBzb3VyY2VBZGRyZXNzOiAnQjVySmp1Vmk3RW42M2lLNm8zaWpLZEp3QW9UZTJnd0NZbUpzVmRIUTJhS1YnLFxuICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhKb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVszXS50eXBlLnNob3VsZC5lcXVhbCgnTWVtbycpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbM10ucGFyYW1zLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSVjJfU0lHTkVEX1RYX1dJVEhfV0lUSF9DUkVBVEVfQVRBX0FORF9NRU1PX0FORF9EVVJBQkxFX05PTkNFKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHVuc2lnbmVkIHdpdGggY3JlYXRlIEFUQSwgbWVtbywgdG9rZW5BZGRyZXNzIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwge1xuICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lQU1TLFxuICAgICAgICB0b2tlbkFkZHJlc3M6IG1pbnRBTVMsXG4gICAgICAgIHByb2dyYW1JZDogYW1zUHJvZ3JhbUlELFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVBTVMsXG4gICAgICAgIHRva2VuQWRkcmVzczogbWludEFNUyxcbiAgICAgICAgcHJvZ3JhbUlkOiBhbXNQcm9ncmFtSUQsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXRTSyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaWQuc2hvdWxkLm5vdC5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lQU1TLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lQU1TLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVswXS50eXBlLnNob3VsZC5lcXVhbCgnU2V0UHJpb3JpdHlGZWUnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdDcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50Jyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QU1TLFxuICAgICAgICBhdGFBZGRyZXNzOiAnOEtMbnJvUDZoSGtyMVpzUUw0azZBM2kyeWhobnYya3IyVGVlZHg3YTI2RWcnLFxuICAgICAgICBvd25lckFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZUFNUyxcbiAgICAgICAgcHJvZ3JhbUlkOiAnQVRva2VuR1B2YmRHVnhyMWIyaHZaYnNpcVc1eFdIMjVlZlROc0xKQThrbkwnLFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsyXS50eXBlLnNob3VsZC5lcXVhbCgnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0ucGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBmcm9tQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRvQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgIHRva2VuTmFtZTogbmFtZUFNUyxcbiAgICAgICAgc291cmNlQWRkcmVzczogJ0V5dEhtM2dXU21hVGt1RjFkYXRlcGdEeng3Z3JHdURHN3dzNVFBN3RDbVU0JyxcbiAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYaW9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogOSxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbM10udHlwZS5zaG91bGQuZXF1YWwoJ01lbW8nKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzNdLnBhcmFtcy5tZW1vLnNob3VsZC5lcXVhbChtZW1vKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICByYXdUeCxcbiAgICAgICAgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJWMl9TSUdORURfVFhfV0lUSF9XSVRIX0NSRUFURV9BVEFfQU5EX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0VfV0lUSF9PUFRJT05BTF9QQVJBTVNcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiBtdWx0aSB0cmFuc2ZlciB0eCBzaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWNjb3VudDEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYxIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MiB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MyA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjMgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnY0IH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQ1ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2NSB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhdXRoV2FsbGV0QWRkcmVzczogYXV0aEFjY291bnQucHViIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihvd25lcik7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDEucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQyLnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50My5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQ1LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYXV0aEFjY291bnQucHJ2IH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg2KTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzVdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg2KTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50MS5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzNdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50My5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzRdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50NC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzVdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50NS5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX1RPS0VOX1RSQU5TRkVSVjJfU0lHTkVEKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIG11bHRpIGFzc2V0IHRyYW5zZmVyIHR4IHVuc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWNjb3VudDEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYxIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MiB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MyA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjMgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgY29uc3QgbmFtZVNSTSA9ICd0c29sOnNybSc7XG4gICAgICBjb25zdCBuYW1lUkFZID0gJ3Rzb2w6cmF5JztcblxuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKG93bmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDIucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVNSTSB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDMucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVJBWSB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1syXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVTUk0sXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVSQVksXG4gICAgICB9KTtcblxuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQyLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVNSTSxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYWNjb3VudDMucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lUkFZLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg1KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy5zb3VyY2VBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VVU0RDKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzJdLnBhcmFtcy5zb3VyY2VBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VVU0RDKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzNdLnBhcmFtcy5zb3VyY2VBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VTUk0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbNF0ucGFyYW1zLnNvdXJjZUFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLnNvdXJjZVJBWSk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVNTRVRfVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnRmFpbCBUb2tlbiBUcmFuc2ZlcicsICgpID0+IHtcbiAgICBpdCgnZm9yIGludmFsaWQgc2VuZGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZGVyKGludmFsaWRQdWJLZXkpKS50aHJvd0Vycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgc2VuZGVyLCBnb3Q6ICcgKyBpbnZhbGlkUHViS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW52YWxpZCB0b0FkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0cmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogaW52YWxpZFB1YktleSwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIGFkZHJlc3MsIGdvdDogJyArIGludmFsaWRQdWJLZXlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudCA9ICdyYW5kb21zdHJpbmcnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuc2VuZCh7XG4gICAgICAgICAgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgICBhbW91bnQ6IGludmFsaWRBbW91bnQsXG4gICAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgfSlcbiAgICAgICkudGhyb3dFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgaW52YWxpZEFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnU3VjZWVkIE5hdGl2ZSBhbmQgVG9rZW4gVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgdHggd2l0aCBib3RoIG5hdGl2ZSBhbmQgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9BTkRfVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRCk7XG4gICAgfSk7XG4gICAgaXQoJ2J1aWxkIGEgbXVsdGkgdHJhbnNmZXIgdHggd2l0aCBib3RoIG5hdGl2ZSBhbmQgbXVsdGlwbGUgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYXV0aEFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYXV0aEFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbM10uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzNdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5NVUxUSV9OQVRJVkVfQU5EX1RPS0VOX1RSQU5TRkVSVjJfVU5TSUdORUQpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ0ZhaWwgTmF0aXZlIGFuZCBUb2tlbiBUcmFuc2ZlcicsICgpID0+IHtcbiAgICBpdCgnZm9yIGludmFsaWQgdG9BZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogaW52YWxpZFB1YktleSwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIGFkZHJlc3MsIGdvdDogJyArIGludmFsaWRQdWJLZXlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudCA9ICdyYW5kb21zdHJpbmcnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYW1vdW50OiBpbnZhbGlkQW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQsIGdvdDogJyArIGludmFsaWRBbW91bnQpO1xuXG4gICAgICBjb25zdCBleGNlc3NpdmVUb2tlbkFtb3VudCA9ICcxODQ0Njc0NDA3MzcwOTU1MTYxNic7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYW1vdW50OiBleGNlc3NpdmVUb2tlbkFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKGBpbnB1dCBhbW91bnQgJHtleGNlc3NpdmVUb2tlbkFtb3VudH0gZXhjZWVkcyBiaWcgaW50IGxpbWl0IDE4NDQ2NzQ0MDczNzA5NTUxNjE1YCk7XG5cbiAgICAgIGNvbnN0IGV4Y2Vzc2l2ZUFtb3VudCA9ICc5MDA3MTk5MjU0NzQwOTkyJztcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGFtb3VudDogZXhjZXNzaXZlQW1vdW50IH0pKS50aHJvd0Vycm9yKFxuICAgICAgICBgaW5wdXQgYW1vdW50ICR7ZXhjZXNzaXZlQW1vdW50fSBleGNlZWRzIG1heCBzYWZlIGludCA5MDA3MTk5MjU0NzQwOTkxYFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==