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

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 +35 -2
  11. package/dist/src/lib/constants.d.ts.map +1 -1
  12. package/dist/src/lib/constants.js +41 -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 +79 -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 +364 -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 +266 -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 +134 -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 +88 -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 +505 -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transactionBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,495 @@
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 should_1 = __importDefault(require("should"));
40
+ const bs58 = __importStar(require("bs58"));
41
+ const public_types_1 = require("@bitgo/public-types");
42
+ const getBuilderFactory_1 = require("../getBuilderFactory");
43
+ const src_1 = require("../../../src");
44
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
45
+ const testData = __importStar(require("../../resources/sol"));
46
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
47
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
48
+ describe('Sol Transaction Builder', async () => {
49
+ let builders;
50
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
51
+ const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
52
+ const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
53
+ const validBlockhash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
54
+ beforeEach(function (done) {
55
+ builders = [
56
+ factory.getWalletInitializationBuilder(),
57
+ factory.getTransferBuilder(),
58
+ factory.getStakingActivateBuilder(),
59
+ factory.getStakingWithdrawBuilder(),
60
+ ];
61
+ done();
62
+ });
63
+ it('start and build an empty a transfer tx with fee', async () => {
64
+ const txBuilder = factory.getTransferBuilder();
65
+ txBuilder.sender(authAccount.pub);
66
+ txBuilder.nonce(validBlockhash);
67
+ txBuilder.fee({ amount: 5000 });
68
+ const tx = await txBuilder.build();
69
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
70
+ const txJson = tx.toJson();
71
+ txJson.lamportsPerSignature?.should.equal(5000);
72
+ });
73
+ it('should fail to build if missing sender', async () => {
74
+ for (const txBuilder of builders) {
75
+ txBuilder.nonce(validBlockhash);
76
+ await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
77
+ }
78
+ });
79
+ it('should fail to build if missing nonce', async () => {
80
+ for (const txBuilder of builders) {
81
+ txBuilder.sender(authAccount.pub);
82
+ await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
83
+ }
84
+ });
85
+ it('build a wallet init from rawTx', async () => {
86
+ const txBuilder = factory.from(testData.WALLET_INIT_SIGNED_TX);
87
+ const builtTx = await txBuilder.build();
88
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.WalletInitialization);
89
+ should_1.default.equal(builtTx.id, '7TkU8wLgXDeLFbVydtg6mqMsp9GatsetitSngysgjxFhofKSUcLPBoKPHciLeGEfJFMsqezpZmGRSFQTBy7ZDsg');
90
+ builtTx.inputs.length.should.equal(1);
91
+ builtTx.inputs[0].should.deepEqual({
92
+ address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
93
+ value: testData.tokenTransfers.amount.toString(),
94
+ coin: 'tsol',
95
+ });
96
+ builtTx.outputs.length.should.equal(0);
97
+ const jsonTx = builtTx.toJson();
98
+ jsonTx.id.should.equal('7TkU8wLgXDeLFbVydtg6mqMsp9GatsetitSngysgjxFhofKSUcLPBoKPHciLeGEfJFMsqezpZmGRSFQTBy7ZDsg');
99
+ jsonTx.feePayer.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
100
+ jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
101
+ jsonTx.numSignatures.should.equal(2);
102
+ jsonTx.instructionsData.should.deepEqual([
103
+ {
104
+ type: 'CreateNonceAccount',
105
+ params: {
106
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
107
+ nonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
108
+ authAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
109
+ amount: '300000',
110
+ },
111
+ },
112
+ ]);
113
+ builtTx.toBroadcastFormat().should.equal(testData.WALLET_INIT_SIGNED_TX);
114
+ });
115
+ it('build a staking activate from rawTx', async () => {
116
+ const txBuilder = factory.from(testData.STAKING_ACTIVATE_SIGNED_TX);
117
+ const builtTx = await txBuilder.build();
118
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingActivate);
119
+ should_1.default.equal(builtTx.id, 'DCsSiGuKiWgtFRF2ZCh5x6xukApffYDs5Y9CyvYBEebMVnXH5TydKpT76srTSr1AhvDZqsnS5EVhvkS8Rzh91hH');
120
+ builtTx.inputs.length.should.equal(1);
121
+ builtTx.inputs[0].should.deepEqual({
122
+ address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
123
+ value: testData.tokenTransfers.amount.toString(),
124
+ coin: 'tsol',
125
+ });
126
+ builtTx.outputs.length.should.equal(1);
127
+ const jsonTx = builtTx.toJson();
128
+ jsonTx.id.should.equal('DCsSiGuKiWgtFRF2ZCh5x6xukApffYDs5Y9CyvYBEebMVnXH5TydKpT76srTSr1AhvDZqsnS5EVhvkS8Rzh91hH');
129
+ jsonTx.feePayer.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
130
+ jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
131
+ jsonTx.numSignatures.should.equal(2);
132
+ jsonTx.instructionsData.should.deepEqual([
133
+ {
134
+ type: 'Activate',
135
+ params: {
136
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
137
+ stakingAddress: '7dRuGFbU2y2kijP6o1LYNzVyz4yf13MooqoionCzv5Za',
138
+ amount: '300000',
139
+ validator: 'CyjoLt3kjqB57K7ewCBHmnHq3UgEj3ak6A7m6EsBsuhA',
140
+ stakingType: public_types_1.SolStakingTypeEnum.NATIVE,
141
+ },
142
+ },
143
+ ]);
144
+ builtTx.toBroadcastFormat().should.equal(testData.STAKING_ACTIVATE_SIGNED_TX);
145
+ });
146
+ it('build a send from rawTx', async () => {
147
+ const txBuilder = factory.from(testData.TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
148
+ const builtTx = await txBuilder.build();
149
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
150
+ should_1.default.equal(builtTx.id, '2XFxGfXddKWnqGaMAsfNL8HgXqDvjBL2Ae28KWrRvg9bQBmCrpHYVDacuZFeAUyYwjXG6ey2jTARX5VQCnj7SF4L');
151
+ builtTx.inputs.length.should.equal(1);
152
+ builtTx.inputs[0].should.deepEqual({
153
+ address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
154
+ value: testData.tokenTransfers.amount.toString(),
155
+ coin: 'tsol',
156
+ });
157
+ builtTx.outputs.length.should.equal(1);
158
+ builtTx.outputs[0].should.deepEqual({
159
+ address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
160
+ value: testData.tokenTransfers.amount.toString(),
161
+ coin: 'tsol',
162
+ });
163
+ const jsonTx = builtTx.toJson();
164
+ jsonTx.id.should.equal('2XFxGfXddKWnqGaMAsfNL8HgXqDvjBL2Ae28KWrRvg9bQBmCrpHYVDacuZFeAUyYwjXG6ey2jTARX5VQCnj7SF4L');
165
+ jsonTx.feePayer.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
166
+ jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
167
+ jsonTx.numSignatures.should.equal(1);
168
+ jsonTx.durableNonce.should.deepEqual({
169
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
170
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
171
+ });
172
+ jsonTx.instructionsData.should.deepEqual([
173
+ {
174
+ type: 'Transfer',
175
+ params: {
176
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
177
+ toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
178
+ amount: '300000',
179
+ },
180
+ },
181
+ {
182
+ type: 'Memo',
183
+ params: { memo: 'test memo' },
184
+ },
185
+ ]);
186
+ builtTx.toBroadcastFormat().should.equal(testData.TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
187
+ });
188
+ it('build a send from raw token transaction', async () => {
189
+ const txBuilder = factory.from(testData.TOKEN_TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
190
+ const prioFeeMicroLamports = '10000000';
191
+ // We don't have to manually set the priority fee here as the raw txn already has the priority fee instruction;
192
+ // therefore once initBuilder is called (it's called within fromImplementation), it will set the txBuilder's priorityFee field
193
+ // which will then be used in txBuilder.build() by tokenTransferBuilder to add the set compute fee instruction
194
+ const builtTx = await txBuilder.build();
195
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
196
+ should_1.default.equal(builtTx.id, '2ticU4ZkEqdTHULr6LobTgWBhim6E7wSscDhM4gzyuGUmQyUwLYhoqaifuvwmNzzEf1T5aefVcgMQkSHdJ5nsrfZ');
197
+ builtTx.inputs.length.should.equal(1);
198
+ builtTx.inputs[0].should.deepEqual({
199
+ address: testData.associatedTokenAccounts.accounts[0].pub,
200
+ value: testData.tokenTransfers.amount.toString(),
201
+ coin: 'tsol:usdc',
202
+ });
203
+ builtTx.outputs.length.should.equal(1);
204
+ builtTx.outputs[0].should.deepEqual({
205
+ address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
206
+ value: testData.tokenTransfers.amount.toString(),
207
+ coin: 'tsol:usdc',
208
+ });
209
+ const jsonTx = builtTx.toJson();
210
+ jsonTx.id.should.equal('2ticU4ZkEqdTHULr6LobTgWBhim6E7wSscDhM4gzyuGUmQyUwLYhoqaifuvwmNzzEf1T5aefVcgMQkSHdJ5nsrfZ');
211
+ jsonTx.feePayer.should.equal(testData.associatedTokenAccounts.accounts[0].pub);
212
+ jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
213
+ jsonTx.numSignatures.should.equal(1);
214
+ jsonTx.durableNonce.should.deepEqual({
215
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
216
+ authWalletAddress: testData.associatedTokenAccounts.accounts[0].pub,
217
+ });
218
+ const priorityFeeBigInt = BigInt(prioFeeMicroLamports);
219
+ jsonTx.instructionsData.should.deepEqual([
220
+ {
221
+ params: {
222
+ fee: priorityFeeBigInt,
223
+ },
224
+ type: 'SetPriorityFee',
225
+ },
226
+ {
227
+ type: 'TokenTransfer',
228
+ params: {
229
+ fromAddress: testData.associatedTokenAccounts.accounts[0].pub,
230
+ toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
231
+ amount: testData.tokenTransfers.amount.toString(),
232
+ tokenName: testData.tokenTransfers.nameUSDC.toString(),
233
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
234
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
235
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
236
+ decimalPlaces: 9,
237
+ },
238
+ },
239
+ {
240
+ type: 'Memo',
241
+ params: { memo: 'test memo' },
242
+ },
243
+ ]);
244
+ builtTx.toBroadcastFormat().should.equal(testData.TOKEN_TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
245
+ });
246
+ describe('Nonce tests', async () => {
247
+ it('should throw for invalid nonce', () => {
248
+ const blockHash = 'randomstring';
249
+ for (const txBuilder of builders) {
250
+ (0, should_1.default)(() => txBuilder.nonce(blockHash)).throw('Invalid or missing blockHash, got: ' + blockHash);
251
+ }
252
+ });
253
+ it('should throw for invalid params using durable nonce', () => {
254
+ const invalidPubKey = 'randomstring';
255
+ for (const txBuilder of builders) {
256
+ (0, should_1.default)(() => txBuilder.nonce(validBlockhash, {
257
+ walletNonceAddress: invalidPubKey,
258
+ authWalletAddress: authAccount.pub,
259
+ })).throw('Invalid or missing walletNonceAddress, got: ' + invalidPubKey);
260
+ (0, should_1.default)(() => txBuilder.nonce(validBlockhash, {
261
+ walletNonceAddress: nonceAccount.pub,
262
+ authWalletAddress: invalidPubKey,
263
+ })).throw('Invalid or missing authWalletAddress, got: ' + invalidPubKey);
264
+ (0, should_1.default)(() => txBuilder.nonce(validBlockhash, {
265
+ walletNonceAddress: nonceAccount.pub,
266
+ authWalletAddress: nonceAccount.pub,
267
+ })).throw('Invalid params: walletNonceAddress cannot be equal to authWalletAddress');
268
+ }
269
+ });
270
+ it('should succeed for valid nonce', () => {
271
+ for (const txBuilder of builders) {
272
+ should_1.default.doesNotThrow(() => txBuilder.nonce(validBlockhash));
273
+ }
274
+ });
275
+ it('should succeed for valid durable nonce', () => {
276
+ for (const txBuilder of builders) {
277
+ should_1.default.doesNotThrow(() => txBuilder.nonce(validBlockhash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub }));
278
+ }
279
+ });
280
+ });
281
+ describe('sender tests', async () => {
282
+ it('should throw for invalid sender', () => {
283
+ const invalidPublicKey = 'randomstring';
284
+ for (const txBuilder of builders) {
285
+ (0, should_1.default)(() => txBuilder.sender(invalidPublicKey)).throw('Invalid or missing sender, got: ' + invalidPublicKey);
286
+ }
287
+ });
288
+ it('should succeed for valid sender', () => {
289
+ for (const txBuilder of builders) {
290
+ should_1.default.doesNotThrow(() => txBuilder.sender(authAccount.pub));
291
+ }
292
+ });
293
+ });
294
+ it('validateAddress', () => {
295
+ const validAddress = { address: authAccount.pub };
296
+ const invalidAddress = { address: testData.pubKeys.invalidPubKeys[0] };
297
+ for (const builder of builders) {
298
+ should_1.default.doesNotThrow(() => builder.validateAddress(validAddress));
299
+ (0, should_1.default)(() => builder.validateAddress(invalidAddress)).throwError('Invalid address ' + testData.pubKeys.invalidPubKeys[0]);
300
+ }
301
+ });
302
+ it('validateKey', () => {
303
+ const validKey = { key: testData.authAccount.prv };
304
+ const invalidKey = { key: testData.authAccount.pub };
305
+ for (const builder of builders) {
306
+ should_1.default.doesNotThrow(() => builder.validateKey(validKey));
307
+ (0, should_1.default)(() => builder.validateKey(invalidKey)).throwError('Invalid key');
308
+ }
309
+ });
310
+ it('validateRawTransaction', () => {
311
+ const validRawTx = testData.RAW_TX_SIGNED;
312
+ const invalidRawTx = 'AAAAAAAAAAAAAAAAAAA';
313
+ for (const builder of builders) {
314
+ should_1.default.doesNotThrow(() => builder.validateRawTransaction(validRawTx));
315
+ (0, should_1.default)(() => builder.validateRawTransaction(invalidRawTx)).throwError('Invalid raw transaction');
316
+ }
317
+ });
318
+ it('validateValue', () => {
319
+ const validValue = new bignumber_js_1.default('100000');
320
+ const invalidValue = new bignumber_js_1.default('-100000');
321
+ for (const builder of builders) {
322
+ should_1.default.doesNotThrow(() => builder.validateValue(validValue));
323
+ (0, should_1.default)(() => builder.validateValue(invalidValue)).throwError('Value cannot be less than zero');
324
+ }
325
+ });
326
+ it('validateMemo', () => {
327
+ const validMemo = 'test memo';
328
+ const invalidMemo = 'ooawindaonmawñdamwdoianwdonalskdnaiouwbdoinowadn90awndoawndaowdnaioiuwbdioauwndaoudnbawodnba9owudbnaowdnaasdijhaksdkjasdkjhaskdjhkasdasdasdasdasd';
329
+ for (const builder of builders) {
330
+ builder._instructionsData.push({
331
+ type: 'Transfer',
332
+ params: {
333
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
334
+ toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
335
+ amount: '300000',
336
+ },
337
+ });
338
+ builder.validateMemo(validMemo);
339
+ (0, should_1.default)(() => builder.validateMemo(invalidMemo)).throwError('Memo is too long');
340
+ (0, should_1.default)((memo) => builder.validateMemo(memo)).throwError('Invalid memo, got: undefined');
341
+ }
342
+ });
343
+ describe('add signature', () => {
344
+ let MPC;
345
+ it('should add signature to transaction', async () => {
346
+ const transferBuilder = factory
347
+ .getTransferBuilder()
348
+ .sender(authAccount.pub)
349
+ .nonce(validBlockhash)
350
+ .fee({ amount: 5000 })
351
+ .send({ address: nonceAccount.pub, amount: '1000' });
352
+ transferBuilder.sign({ key: authAccount.prv });
353
+ const signedTransaction = await transferBuilder.build();
354
+ // signature is base58 encoded
355
+ const signature = signedTransaction.signature[0];
356
+ // verify rebuilt transaction contains signature
357
+ const rawTransaction = signedTransaction.toBroadcastFormat();
358
+ const rebuiltSignedTransaction = await factory.from(rawTransaction).build();
359
+ rebuiltSignedTransaction.signature.should.deepEqual(signedTransaction.signature);
360
+ const transferBuilder2 = factory
361
+ .getTransferBuilder()
362
+ .sender(authAccount.pub)
363
+ .nonce(validBlockhash)
364
+ .fee({ amount: 5000 })
365
+ .send({ address: nonceAccount.pub, amount: '1000' });
366
+ transferBuilder2.addSignature({ pub: authAccount.pub }, Buffer.from(bs58.decode(signature)));
367
+ const signedTransaction2 = await transferBuilder2.build();
368
+ // verify signatures are correct
369
+ signedTransaction.signature.should.deepEqual(signedTransaction2.signature);
370
+ // verify rebuilt transaction contains signature
371
+ const rawTransaction2 = signedTransaction2.toBroadcastFormat();
372
+ const rebuiltTransaction2 = await factory.from(rawTransaction2).build();
373
+ rebuiltTransaction2.signature.should.deepEqual(signedTransaction2.signature);
374
+ });
375
+ before('initialize mpc module', async () => {
376
+ const hdTree = await sdk_lib_mpc_1.Ed25519Bip32HdTree.initialize();
377
+ MPC = await sdk_core_1.Eddsa.initialize(hdTree);
378
+ });
379
+ it('should add TSS signature', async () => {
380
+ const A = MPC.keyShare(1, 2, 3);
381
+ const B = MPC.keyShare(2, 2, 3);
382
+ const C = MPC.keyShare(3, 2, 3);
383
+ const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
384
+ const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
385
+ const C_combine = MPC.keyCombine(C.uShare, [A.yShares[3], B.yShares[3]]);
386
+ const commonPub = A_combine.pShare.y;
387
+ const solPublicKey = new src_1.KeyPair({ pub: commonPub });
388
+ const sender = solPublicKey.getAddress();
389
+ let transferBuilder = factory
390
+ .getTransferBuilder()
391
+ .sender(sender)
392
+ .nonce(validBlockhash)
393
+ .fee({ amount: 5000 })
394
+ .send({ address: nonceAccount.pub, amount: '1000' });
395
+ const unsignedTransaction = await transferBuilder.build();
396
+ const signablePayload = unsignedTransaction.signablePayload;
397
+ // signing with A and B
398
+ let A_sign_share = MPC.signShare(signablePayload, A_combine.pShare, [A_combine.jShares[2]]);
399
+ let B_sign_share = MPC.signShare(signablePayload, B_combine.pShare, [B_combine.jShares[1]]);
400
+ let A_sign = MPC.sign(signablePayload, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
401
+ let B_sign = MPC.sign(signablePayload, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
402
+ let signature = MPC.signCombine([A_sign, B_sign]);
403
+ let rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
404
+ transferBuilder = factory
405
+ .getTransferBuilder()
406
+ .sender(sender)
407
+ .nonce(validBlockhash)
408
+ .fee({ amount: 5000 })
409
+ .send({ address: nonceAccount.pub, amount: '1000' });
410
+ transferBuilder.addSignature({ pub: sender }, rawSignature);
411
+ let signedTransaction = await transferBuilder.build();
412
+ signedTransaction.signature.length.should.equal(1);
413
+ signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
414
+ signedTransaction.id.should.equal(bs58.encode(rawSignature));
415
+ // signing with A and C
416
+ A_sign_share = MPC.signShare(signablePayload, A_combine.pShare, [A_combine.jShares[3]]);
417
+ let C_sign_share = MPC.signShare(signablePayload, C_combine.pShare, [C_combine.jShares[1]]);
418
+ A_sign = MPC.sign(signablePayload, A_sign_share.xShare, [C_sign_share.rShares[1]], [B.yShares[1]]);
419
+ let C_sign = MPC.sign(signablePayload, C_sign_share.xShare, [A_sign_share.rShares[3]], [B.yShares[3]]);
420
+ signature = MPC.signCombine([A_sign, C_sign]);
421
+ rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
422
+ transferBuilder = factory
423
+ .getTransferBuilder()
424
+ .sender(sender)
425
+ .nonce(validBlockhash)
426
+ .fee({ amount: 5000 })
427
+ .send({ address: nonceAccount.pub, amount: '1000' });
428
+ transferBuilder.addSignature({ pub: sender }, rawSignature);
429
+ signedTransaction = await transferBuilder.build();
430
+ signedTransaction.signature.length.should.equal(1);
431
+ signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
432
+ signedTransaction.id.should.equal(bs58.encode(rawSignature));
433
+ // signing with B and C
434
+ B_sign_share = MPC.signShare(signablePayload, B_combine.pShare, [B_combine.jShares[3]]);
435
+ C_sign_share = MPC.signShare(signablePayload, C_combine.pShare, [C_combine.jShares[2]]);
436
+ B_sign = MPC.sign(signablePayload, B_sign_share.xShare, [C_sign_share.rShares[2]], [A.yShares[2]]);
437
+ C_sign = MPC.sign(signablePayload, C_sign_share.xShare, [B_sign_share.rShares[3]], [A.yShares[3]]);
438
+ signature = MPC.signCombine([B_sign, C_sign]);
439
+ rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
440
+ transferBuilder = factory
441
+ .getTransferBuilder()
442
+ .sender(sender)
443
+ .nonce(validBlockhash)
444
+ .fee({ amount: 5000 })
445
+ .send({ address: nonceAccount.pub, amount: '1000' });
446
+ transferBuilder.addSignature({ pub: sender }, rawSignature);
447
+ signedTransaction = await transferBuilder.build();
448
+ signedTransaction.signature.length.should.equal(1);
449
+ signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
450
+ signedTransaction.id.should.equal(bs58.encode(rawSignature));
451
+ const rawTransaction = signedTransaction.toBroadcastFormat();
452
+ const rebuiltTransaction = await factory.from(rawTransaction).build();
453
+ rebuiltTransaction.id.should.equal(signedTransaction.id);
454
+ rebuiltTransaction.signature.should.deepEqual(signedTransaction.signature);
455
+ });
456
+ it('should add TSS HD signature', async () => {
457
+ const A = MPC.keyShare(1, 2, 3);
458
+ const B = MPC.keyShare(2, 2, 3);
459
+ const C = MPC.keyShare(3, 2, 3);
460
+ const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
461
+ const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
462
+ for (let index = 0; index < 10; index++) {
463
+ const path = `m/${index}`;
464
+ const A_subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
465
+ const B_subkey = MPC.keyCombine(B.uShare, [A_subkey.yShares[2], C.yShares[2]]);
466
+ const solPublicKey = new src_1.KeyPair({ pub: A_subkey.pShare.y });
467
+ const sender = solPublicKey.getAddress();
468
+ const transferBuilder = factory
469
+ .getTransferBuilder()
470
+ .sender(sender)
471
+ .nonce(validBlockhash)
472
+ .fee({ amount: 5000 })
473
+ .send({ address: nonceAccount.pub, amount: '1000' });
474
+ const unsignedTransaction = await transferBuilder.build();
475
+ const signablePayload = unsignedTransaction.signablePayload;
476
+ const A_sign_share = MPC.signShare(signablePayload, A_subkey.pShare, [A_combine.jShares[2]]);
477
+ const B_sign_share = MPC.signShare(signablePayload, B_subkey.pShare, [B_combine.jShares[1]]);
478
+ const A_sign = MPC.sign(signablePayload, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
479
+ const B_sign = MPC.sign(signablePayload, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
480
+ const signature = MPC.signCombine([A_sign, B_sign]);
481
+ const rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
482
+ transferBuilder.addSignature({ pub: sender }, rawSignature);
483
+ const signedTransaction = await transferBuilder.build();
484
+ signedTransaction.signature.length.should.equal(1);
485
+ signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
486
+ signedTransaction.id.should.equal(bs58.encode(rawSignature));
487
+ const rawTransaction = signedTransaction.toBroadcastFormat();
488
+ const rebuiltTransaction = await factory.from(rawTransaction).build();
489
+ rebuiltTransaction.id.should.equal(signedTransaction.id);
490
+ rebuiltTransaction.signature.should.deepEqual(signedTransaction.signature);
491
+ }
492
+ });
493
+ });
494
+ });
495
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMkNBQTZCO0FBRTdCLHNEQUF5RDtBQUN6RCw0REFBeUQ7QUFDekQsc0NBQTZEO0FBQzdELG1EQUE4RDtBQUM5RCw4REFBZ0Q7QUFDaEQsZ0VBQXFDO0FBQ3JDLHlEQUE2RDtBQUU3RCxRQUFRLENBQUMseUJBQXlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDN0MsSUFBSSxRQUFRLENBQUM7SUFDYixNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQUcsOENBQThDLENBQUM7SUFFdEUsVUFBVSxDQUFDLFVBQVUsSUFBSTtRQUN2QixRQUFRLEdBQUc7WUFDVCxPQUFPLENBQUMsOEJBQThCLEVBQUU7WUFDeEMsT0FBTyxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRTtZQUNuQyxPQUFPLENBQUMseUJBQXlCLEVBQUU7U0FDcEMsQ0FBQztRQUNGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixF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SyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgYnM1OCBmcm9tICdiczU4JztcblxuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFRva2VuVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IEVkZHNhLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEVkMjU1MTlCaXAzMkhkVHJlZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcblxuZGVzY3JpYmUoJ1NvbCBUcmFuc2FjdGlvbiBCdWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICBsZXQgYnVpbGRlcnM7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHNvbCcpO1xuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCB2YWxpZEJsb2NraGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoZG9uZSkge1xuICAgIGJ1aWxkZXJzID0gW1xuICAgICAgZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKSxcbiAgICAgIGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCksXG4gICAgICBmYWN0b3J5LmdldFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIoKSxcbiAgICAgIGZhY3RvcnkuZ2V0U3Rha2luZ1dpdGhkcmF3QnVpbGRlcigpLFxuICAgIF07XG4gICAgZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc3RhcnQgYW5kIGJ1aWxkIGFuIGVtcHR5IGEgdHJhbnNmZXIgdHggd2l0aCBmZWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHZhbGlkQmxvY2toYXNoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgYW1vdW50OiA1MDAwIH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgIHR4SnNvbi5sYW1wb3J0c1BlclNpZ25hdHVyZT8uc2hvdWxkLmVxdWFsKDUwMDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3Npbmcgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnYnVpbGQgYSB3YWxsZXQgaW5pdCBmcm9tIHJhd1R4JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5XQUxMRVRfSU5JVF9TSUdORURfVFgpO1xuICAgIGNvbnN0IGJ1aWx0VHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCAnN1RrVTh3TGdYRGVMRmJWeWR0ZzZtcU1zcDlHYXRzZXRpdFNuZ3lzZ2p4RmhvZktTVWNMUEJvS1BIY2lMZUdFZkpGTXNxZXpwWm1HUlNGUVRCeTdaRHNnJyk7XG4gICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICB2YWx1ZTogdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiAndHNvbCcsXG4gICAgfSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICBqc29uVHguaWQuc2hvdWxkLmVxdWFsKCc3VGtVOHdMZ1hEZUxGYlZ5ZHRnNm1xTXNwOUdhdHNldGl0U25neXNnanhGaG9mS1NVY0xQQm9LUEhjaUxlR0VmSkZNc3FlenBabUdSU0ZRVEJ5N1pEc2cnKTtcbiAgICBqc29uVHguZmVlUGF5ZXIuc2hvdWxkLmVxdWFsKCc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScpO1xuICAgIGpzb25UeC5ub25jZS5zaG91bGQuZXF1YWwoJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJyk7XG4gICAganNvblR4Lm51bVNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKDIpO1xuICAgIGpzb25UeC5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnQ3JlYXRlTm9uY2VBY2NvdW50JyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgbm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICAgIGF1dGhBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIGFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuV0FMTEVUX0lOSVRfU0lHTkVEX1RYKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkIGEgc3Rha2luZyBhY3RpdmF0ZSBmcm9tIHJhd1R4JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TVEFLSU5HX0FDVElWQVRFX1NJR05FRF9UWCk7XG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCAnRENzU2lHdUtpV2d0RlJGMlpDaDV4Nnh1a0FwZmZZRHM1WTlDeXZZQkVlYk1WblhINVR5ZEtwVDc2c3JUU3IxQWh2RFpxc25TNUVWaHZrUzhSemg5MWhIJyk7XG4gICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICB2YWx1ZTogdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiAndHNvbCcsXG4gICAgfSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICBqc29uVHguaWQuc2hvdWxkLmVxdWFsKCdEQ3NTaUd1S2lXZ3RGUkYyWkNoNXg2eHVrQXBmZllEczVZOUN5dllCRWViTVZuWEg1VHlkS3BUNzZzclRTcjFBaHZEWnFzblM1RVZodmtTOFJ6aDkxaEgnKTtcbiAgICBqc29uVHguZmVlUGF5ZXIuc2hvdWxkLmVxdWFsKCc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScpO1xuICAgIGpzb25UeC5ub25jZS5zaG91bGQuZXF1YWwoJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJyk7XG4gICAganNvblR4Lm51bVNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKDIpO1xuICAgIGpzb25UeC5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnQWN0aXZhdGUnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogJzdkUnVHRmJVMnkya2lqUDZvMUxZTnpWeXo0eWYxM01vb3FvaW9uQ3p2NVphJyxcbiAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIHZhbGlkYXRvcjogJ0N5am9MdDNranFCNTdLN2V3Q0JIbW5IcTNVZ0VqM2FrNkE3bTZFc0JzdWhBJyxcbiAgICAgICAgICBzdGFraW5nVHlwZTogU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5TVEFLSU5HX0FDVElWQVRFX1NJR05FRF9UWCk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZCBhIHNlbmQgZnJvbSByYXdUeCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVFJBTlNGRVJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBidWlsdFR4LmlkLFxuICAgICAgJzJYRnhHZlhkZEtXbnFHYU1Bc2ZOTDhIZ1hxRHZqQkwyQWUyOEtXclJ2ZzliUUJtQ3JwSFlWRGFjdVpGZUFVeVl3alhHNmV5MmpUQVJYNVZRQ25qN1NGNEwnXG4gICAgKTtcbiAgICBidWlsdFR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46ICd0c29sJyxcbiAgICB9KTtcbiAgICBidWlsdFR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdFR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICBhZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogJ3Rzb2wnLFxuICAgIH0pO1xuICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAganNvblR4LmlkLnNob3VsZC5lcXVhbCgnMlhGeEdmWGRkS1ducUdhTUFzZk5MOEhnWHFEdmpCTDJBZTI4S1dyUnZnOWJRQm1DcnBIWVZEYWN1WkZlQVV5WXdqWEc2ZXkyalRBUlg1VlFDbmo3U0Y0TCcpO1xuICAgIGpzb25UeC5mZWVQYXllci5zaG91bGQuZXF1YWwoJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyk7XG4gICAganNvblR4Lm5vbmNlLnNob3VsZC5lcXVhbCgnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknKTtcbiAgICBqc29uVHgubnVtU2lnbmF0dXJlcy5zaG91bGQuZXF1YWwoMSk7XG4gICAganNvblR4LmR1cmFibGVOb25jZS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgIH0pO1xuICAgIGpzb25UeC5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB0b0FkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdNZW1vJyxcbiAgICAgICAgcGFyYW1zOiB7IG1lbW86ICd0ZXN0IG1lbW8nIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuVFJBTlNGRVJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZCBhIHNlbmQgZnJvbSByYXcgdG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKFxuICAgICAgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRVxuICAgICkgYXMgVG9rZW5UcmFuc2ZlckJ1aWxkZXI7XG4gICAgY29uc3QgcHJpb0ZlZU1pY3JvTGFtcG9ydHMgPSAnMTAwMDAwMDAnO1xuICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gbWFudWFsbHkgc2V0IHRoZSBwcmlvcml0eSBmZWUgaGVyZSBhcyB0aGUgcmF3IHR4biBhbHJlYWR5IGhhcyB0aGUgcHJpb3JpdHkgZmVlIGluc3RydWN0aW9uO1xuICAgIC8vIHRoZXJlZm9yZSBvbmNlIGluaXRCdWlsZGVyIGlzIGNhbGxlZCAoaXQncyBjYWxsZWQgd2l0aGluIGZyb21JbXBsZW1lbnRhdGlvbiksIGl0IHdpbGwgc2V0IHRoZSB0eEJ1aWxkZXIncyBwcmlvcml0eUZlZSBmaWVsZFxuICAgIC8vIHdoaWNoIHdpbGwgdGhlbiBiZSB1c2VkIGluIHR4QnVpbGRlci5idWlsZCgpIGJ5IHRva2VuVHJhbnNmZXJCdWlsZGVyIHRvIGFkZCB0aGUgc2V0IGNvbXB1dGUgZmVlIGluc3RydWN0aW9uXG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBidWlsdFR4LmlkLFxuICAgICAgJzJ0aWNVNFprRXFkVEhVTHI2TG9iVGdXQmhpbTZFN3dTc2NEaE00Z3p5dUdVbVF5VXdMWWhvcWFpZnV2d21OenpFZjFUNWFlZlZjZ01Ra1NIZEo1bnNyZlonXG4gICAgKTtcbiAgICBidWlsdFR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogJ3Rzb2w6dXNkYycsXG4gICAgfSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46ICd0c29sOnVzZGMnLFxuICAgIH0pO1xuICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAganNvblR4LmlkLnNob3VsZC5lcXVhbCgnMnRpY1U0WmtFcWRUSFVMcjZMb2JUZ1dCaGltNkU3d1NzY0RoTTRnenl1R1VtUXlVd0xZaG9xYWlmdXZ3bU56ekVmMVQ1YWVmVmNnTVFrU0hkSjVuc3JmWicpO1xuICAgIGpzb25UeC5mZWVQYXllci5zaG91bGQuZXF1YWwodGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViKTtcbiAgICBqc29uVHgubm9uY2Uuc2hvdWxkLmVxdWFsKCdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScpO1xuICAgIGpzb25UeC5udW1TaWduYXR1cmVzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBqc29uVHguZHVyYWJsZU5vbmNlLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YixcbiAgICB9KTtcbiAgICBjb25zdCBwcmlvcml0eUZlZUJpZ0ludCA9IEJpZ0ludChwcmlvRmVlTWljcm9MYW1wb3J0cyk7XG4gICAganNvblR4Lmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZlZTogcHJpb3JpdHlGZWVCaWdJbnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdTZXRQcmlvcml0eUZlZScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWIsXG4gICAgICAgICAgdG9BZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgdG9rZW5OYW1lOiB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5uYW1lVVNEQy50b1N0cmluZygpLFxuICAgICAgICAgIHNvdXJjZUFkZHJlc3M6ICdCNXJKanVWaTdFbjYzaUs2bzNpaktkSndBb1RlMmd3Q1ltSnNWZEhRMmFLVicsXG4gICAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYSm9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IDksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnTWVtbycsXG4gICAgICAgIHBhcmFtczogeyBtZW1vOiAndGVzdCBtZW1vJyB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSX1NJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICB9KTtcblxuICBkZXNjcmliZSgnTm9uY2UgdGVzdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBub25jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJsb2NrSGFzaCA9ICdyYW5kb21zdHJpbmcnO1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5ub25jZShibG9ja0hhc2gpKS50aHJvdygnSW52YWxpZCBvciBtaXNzaW5nIGJsb2NrSGFzaCwgZ290OiAnICsgYmxvY2tIYXNoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgcGFyYW1zIHVzaW5nIGR1cmFibGUgbm9uY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkUHViS2V5ID0gJ3JhbmRvbXN0cmluZyc7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICB0eEJ1aWxkZXIubm9uY2UodmFsaWRCbG9ja2hhc2gsIHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogaW52YWxpZFB1YktleSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKS50aHJvdygnSW52YWxpZCBvciBtaXNzaW5nIHdhbGxldE5vbmNlQWRkcmVzcywgZ290OiAnICsgaW52YWxpZFB1YktleSk7XG5cbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHZhbGlkQmxvY2toYXNoLCB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogaW52YWxpZFB1YktleSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93KCdJbnZhbGlkIG9yIG1pc3NpbmcgYXV0aFdhbGxldEFkZHJlc3MsIGdvdDogJyArIGludmFsaWRQdWJLZXkpO1xuXG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCwge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQucHViLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKS50aHJvdygnSW52YWxpZCBwYXJhbXM6IHdhbGxldE5vbmNlQWRkcmVzcyBjYW5ub3QgYmUgZXF1YWwgdG8gYXV0aFdhbGxldEFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCBmb3IgdmFsaWQgbm9uY2UnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGZvciB2YWxpZCBkdXJhYmxlIG5vbmNlJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PlxuICAgICAgICAgIHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlbmRlciB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIHNlbmRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRQdWJsaWNLZXkgPSAncmFuZG9tc3RyaW5nJztcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZGVyKGludmFsaWRQdWJsaWNLZXkpKS50aHJvdygnSW52YWxpZCBvciBtaXNzaW5nIHNlbmRlciwgZ290OiAnICsgaW52YWxpZFB1YmxpY0tleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGZvciB2YWxpZCBzZW5kZXInLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZUFkZHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRBZGRyZXNzID0geyBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfTtcbiAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9IHsgYWRkcmVzczogdGVzdERhdGEucHViS2V5cy5pbnZhbGlkUHViS2V5c1swXSB9O1xuICAgIGZvciAoY29uc3QgYnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh2YWxpZEFkZHJlc3MpKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyhpbnZhbGlkQWRkcmVzcykpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIGFkZHJlc3MgJyArIHRlc3REYXRhLnB1YktleXMuaW52YWxpZFB1YktleXNbMF1cbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICBpdCgndmFsaWRhdGVLZXknLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRLZXkgPSB7IGtleTogdGVzdERhdGEuYXV0aEFjY291bnQucHJ2IH07XG4gICAgY29uc3QgaW52YWxpZEtleSA9IHsga2V5OiB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWIgfTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUtleSh2YWxpZEtleSkpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoaW52YWxpZEtleSkpLnRocm93RXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgndmFsaWRhdGVSYXdUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZFJhd1R4ID0gdGVzdERhdGEuUkFXX1RYX1NJR05FRDtcbiAgICBjb25zdCBpbnZhbGlkUmF3VHggPSAnQUFBQUFBQUFBQUFBQUFBQUFBQSc7XG4gICAgZm9yIChjb25zdCBidWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih2YWxpZFJhd1R4KSk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKGludmFsaWRSYXdUeCkpLnRocm93RXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgndmFsaWRhdGVWYWx1ZScsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZFZhbHVlID0gbmV3IEJpZ051bWJlcignMTAwMDAwJyk7XG4gICAgY29uc3QgaW52YWxpZFZhbHVlID0gbmV3IEJpZ051bWJlcignLTEwMDAwMCcpO1xuICAgIGZvciAoY29uc3QgYnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlVmFsdWUodmFsaWRWYWx1ZSkpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVWYWx1ZShpbnZhbGlkVmFsdWUpKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZU1lbW8nLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRNZW1vID0gJ3Rlc3QgbWVtbyc7XG4gICAgY29uc3QgaW52YWxpZE1lbW8gPVxuICAgICAgJ29vYXdpbmRhb25tYXfDsWRhbXdkb2lhbndkb25hbHNrZG5haW91d2Jkb2lub3dhZG45MGF3bmRvYXduZGFvd2RuYWlvaXV3YmRpb2F1d25kYW91ZG5iYXdvZG5iYTlvd3VkYm5hb3dkbmFhc2Rpamhha3Nka2phc2Rramhhc2tkamhrYXNkYXNkYXNkYXNkYXNkJztcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIGJ1aWxkZXIuX2luc3RydWN0aW9uc0RhdGEucHVzaCh7XG4gICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIHRvQWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyLnZhbGlkYXRlTWVtbyh2YWxpZE1lbW8pO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVNZW1vKGludmFsaWRNZW1vKSkudGhyb3dFcnJvcignTWVtbyBpcyB0b28gbG9uZycpO1xuICAgICAgc2hvdWxkKChtZW1vOiBzdHJpbmcpID0+IGJ1aWxkZXIudmFsaWRhdGVNZW1vKG1lbW8pKS50aHJvd0Vycm9yKCdJbnZhbGlkIG1lbW8sIGdvdDogdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgnYWRkIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICBsZXQgTVBDOiBFZGRzYTtcblxuICAgIGl0KCdzaG91bGQgYWRkIHNpZ25hdHVyZSB0byB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVyQnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoYXV0aEFjY291bnQucHViKVxuICAgICAgICAubm9uY2UodmFsaWRCbG9ja2hhc2gpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhbW91bnQ6ICcxMDAwJyB9KTtcbiAgICAgIHRyYW5zZmVyQnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNmZXJCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAvLyBzaWduYXR1cmUgaXMgYmFzZTU4IGVuY29kZWRcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZVswXTtcblxuICAgICAgLy8gdmVyaWZ5IHJlYnVpbHQgdHJhbnNhY3Rpb24gY29udGFpbnMgc2lnbmF0dXJlXG4gICAgICBjb25zdCByYXdUcmFuc2FjdGlvbiA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcmVidWlsdFNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1RyYW5zYWN0aW9uKS5idWlsZCgpO1xuICAgICAgcmVidWlsdFNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyQnVpbGRlcjIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKGF1dGhBY2NvdW50LnB1YilcbiAgICAgICAgLm5vbmNlKHZhbGlkQmxvY2toYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiAnMTAwMCcgfSk7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXIyLmFkZFNpZ25hdHVyZSh7IHB1YjogYXV0aEFjY291bnQucHViIH0sIEJ1ZmZlci5mcm9tKGJzNTguZGVjb2RlKHNpZ25hdHVyZSkpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uMiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgLy8gdmVyaWZ5IHNpZ25hdHVyZXMgYXJlIGNvcnJlY3RcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKHNpZ25lZFRyYW5zYWN0aW9uMi5zaWduYXR1cmUpO1xuXG4gICAgICAvLyB2ZXJpZnkgcmVidWlsdCB0cmFuc2FjdGlvbiBjb250YWlucyBzaWduYXR1cmVcbiAgICAgIGNvbnN0IHJhd1RyYW5zYWN0aW9uMiA9IHNpZ25lZFRyYW5zYWN0aW9uMi50b0Jyb2FkY2FzdEZvcm1hdCgpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbjIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHJhbnNhY3Rpb24yKS5idWlsZCgpO1xuICAgICAgcmVidWlsdFRyYW5zYWN0aW9uMi5zaWduYXR1cmUuc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUcmFuc2FjdGlvbjIuc2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGJlZm9yZSgnaW5pdGlhbGl6ZSBtcGMgbW9kdWxlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGRUcmVlID0gYXdhaXQgRWQyNTUxOUJpcDMySGRUcmVlLmluaXRpYWxpemUoKTtcbiAgICAgIE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIFRTUyBzaWduYXR1cmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IENfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEMudVNoYXJlLCBbQS55U2hhcmVzWzNdLCBCLnlTaGFyZXNbM11dKTtcblxuICAgICAgY29uc3QgY29tbW9uUHViID0gQV9jb21iaW5lLnBTaGFyZS55O1xuICAgICAgY29uc3Qgc29sUHVibGljS2V5ID0gbmV3IEtleVBhaXIoeyBwdWI6IGNvbW1vblB1YiB9KTtcbiAgICAgIGNvbnN0IHNlbmRlciA9IHNvbFB1YmxpY0tleS5nZXRBZGRyZXNzKCk7XG5cbiAgICAgIGxldCB0cmFuc2ZlckJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKHZhbGlkQmxvY2toYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiAnMTAwMCcgfSk7XG4gICAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNmZXJCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcblxuICAgICAgLy8gc2lnbmluZyB3aXRoIEEgYW5kIEJcbiAgICAgIGxldCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKHNpZ25hYmxlUGF5bG9hZCwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgICBsZXQgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1sxXV0pO1xuICAgICAgbGV0IEFfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IEJfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgICAgbGV0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICAgIGxldCByYXdTaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWduYXR1cmUuUiwgJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYXR1cmUuc2lnbWEsICdoZXgnKV0pO1xuXG4gICAgICB0cmFuc2ZlckJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKHZhbGlkQmxvY2toYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiAnMTAwMCcgfSk7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIgfSwgcmF3U2lnbmF0dXJlKTtcbiAgICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uaWQuc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQ1xuICAgICAgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEFfY29tYmluZS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgICAgbGV0IENfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUoc2lnbmFibGVQYXlsb2FkLCBDX2NvbWJpbmUucFNoYXJlLCBbQ19jb21iaW5lLmpTaGFyZXNbMV1dKTtcbiAgICAgIEFfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0IueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IENfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQ19zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzNdXSwgW0IueVNoYXJlc1szXV0pO1xuICAgICAgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIENfc2lnbl0pO1xuICAgICAgcmF3U2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oc2lnbmF0dXJlLlIsICdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlLnNpZ21hLCAnaGV4JyldKTtcblxuICAgICAgdHJhbnNmZXJCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5ub25jZSh2YWxpZEJsb2NraGFzaClcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuc2VuZCh7IGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGFtb3VudDogJzEwMDAnIH0pO1xuICAgICAgdHJhbnNmZXJCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyIH0sIHJhd1NpZ25hdHVyZSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uaWQuc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQiBhbmQgQ1xuICAgICAgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgICAgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIENfY29tYmluZS5wU2hhcmUsIFtDX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgICAgQl9zaWduID0gTVBDLnNpZ24oc2lnbmFibGVQYXlsb2FkLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQS55U2hhcmVzWzJdXSk7XG4gICAgICBDX3NpZ24gPSBNUEMuc2lnbihzaWduYWJsZVBheWxvYWQsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtBLnlTaGFyZXNbM11dKTtcbiAgICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQl9zaWduLCBDX3NpZ25dKTtcbiAgICAgIHJhd1NpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKHNpZ25hdHVyZS5SLCAnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5zaWdtYSwgJ2hleCcpXSk7XG5cbiAgICAgIHRyYW5zZmVyQnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAubm9uY2UodmFsaWRCbG9ja2hhc2gpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhbW91bnQ6ICcxMDAwJyB9KTtcbiAgICAgIHRyYW5zZmVyQnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlciB9LCByYXdTaWduYXR1cmUpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0cmFuc2ZlckJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChiczU4LmVuY29kZShyYXdTaWduYXR1cmUpKTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLmlkLnNob3VsZC5lcXVhbChiczU4LmVuY29kZShyYXdTaWduYXR1cmUpKTtcblxuICAgICAgY29uc3QgcmF3VHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbiA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUcmFuc2FjdGlvbikuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUcmFuc2FjdGlvbi5pZC5zaG91bGQuZXF1YWwoc2lnbmVkVHJhbnNhY3Rpb24uaWQpO1xuICAgICAgcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBUU1MgSEQgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICAgIGNvbnN0IEIgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgICBjb25zdCBDID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuXG4gICAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBwYXRoID0gYG0vJHtpbmRleH1gO1xuXG4gICAgICAgIGNvbnN0IEFfc3Via2V5ID0gTVBDLmtleURlcml2ZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSwgcGF0aCk7XG4gICAgICAgIGNvbnN0IEJfc3Via2V5ID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBX3N1YmtleS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcblxuICAgICAgICBjb25zdCBzb2xQdWJsaWNLZXkgPSBuZXcgS2V5UGFpcih7IHB1YjogQV9zdWJrZXkucFNoYXJlLnkgfSk7XG4gICAgICAgIGNvbnN0IHNlbmRlciA9IHNvbFB1YmxpY0tleS5nZXRBZGRyZXNzKCk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAgIC5ub25jZSh2YWxpZEJsb2NraGFzaClcbiAgICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhbW91bnQ6ICcxMDAwJyB9KTtcbiAgICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcblxuICAgICAgICBjb25zdCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKHNpZ25hYmxlUGF5bG9hZCwgQV9zdWJrZXkucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dKTtcbiAgICAgICAgY29uc3QgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEJfc3Via2V5LnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgICAgIGNvbnN0IEFfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgICBjb25zdCBCX3NpZ24gPSBNUEMuc2lnbihzaWduYWJsZVBheWxvYWQsIEJfc2lnbl9zaGFyZS54U2hhcmUsIFtBX3NpZ25fc2hhcmUuclNoYXJlc1syXV0sIFtDLnlTaGFyZXNbMl1dKTtcblxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQl9zaWduXSk7XG4gICAgICAgIGNvbnN0IHJhd1NpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKHNpZ25hdHVyZS5SLCAnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5zaWdtYSwgJ2hleCcpXSk7XG5cbiAgICAgICAgdHJhbnNmZXJCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyIH0sIHJhd1NpZ25hdHVyZSk7XG5cbiAgICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0cmFuc2ZlckJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoYnM1OC5lbmNvZGUocmF3U2lnbmF0dXJlKSk7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLmlkLnNob3VsZC5lcXVhbChiczU4LmVuY29kZShyYXdTaWduYXR1cmUpKTtcblxuICAgICAgICBjb25zdCByYXdUcmFuc2FjdGlvbiA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHJhbnNhY3Rpb24pLmJ1aWxkKCk7XG4gICAgICAgIHJlYnVpbHRUcmFuc2FjdGlvbi5pZC5zaG91bGQuZXF1YWwoc2lnbmVkVHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmF0dXJlLnNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}