@bitgo-beta/sdk-coin-avaxc 2.2.3-alpha.48 → 2.2.3-alpha.481

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 (51) hide show
  1. package/dist/src/avaxc.d.ts +46 -17
  2. package/dist/src/avaxc.d.ts.map +1 -1
  3. package/dist/src/avaxc.js +244 -91
  4. package/dist/src/avaxcToken.d.ts +1 -1
  5. package/dist/src/avaxcToken.d.ts.map +1 -1
  6. package/dist/src/avaxcToken.js +3 -3
  7. package/dist/src/iface.d.ts +8 -3
  8. package/dist/src/iface.d.ts.map +1 -1
  9. package/dist/src/iface.js +1 -1
  10. package/dist/src/index.js +6 -2
  11. package/dist/src/lib/index.js +23 -9
  12. package/dist/src/lib/keyPair.js +10 -11
  13. package/dist/src/lib/transactionBuilder.js +2 -2
  14. package/dist/src/lib/utils.d.ts +2 -1
  15. package/dist/src/lib/utils.d.ts.map +1 -1
  16. package/dist/src/lib/utils.js +31 -10
  17. package/dist/test/resources/avaxc.d.ts +122 -0
  18. package/dist/test/resources/avaxc.d.ts.map +1 -0
  19. package/dist/test/resources/avaxc.js +137 -0
  20. package/dist/test/unit/avaxc.d.ts +2 -0
  21. package/dist/test/unit/avaxc.d.ts.map +1 -0
  22. package/dist/test/unit/avaxc.js +1271 -0
  23. package/dist/test/unit/avaxcToken.d.ts +2 -0
  24. package/dist/test/unit/avaxcToken.d.ts.map +1 -0
  25. package/dist/test/unit/avaxcToken.js +68 -0
  26. package/dist/test/unit/getBuilder.d.ts +3 -0
  27. package/dist/test/unit/getBuilder.d.ts.map +1 -0
  28. package/dist/test/unit/getBuilder.js +10 -0
  29. package/dist/test/unit/helpers.d.ts +15 -0
  30. package/dist/test/unit/helpers.d.ts.map +1 -0
  31. package/dist/test/unit/helpers.js +54 -0
  32. package/dist/test/unit/keyPair.d.ts +2 -0
  33. package/dist/test/unit/keyPair.d.ts.map +1 -0
  34. package/dist/test/unit/keyPair.js +135 -0
  35. package/dist/test/unit/transactionBuilder/transfer.d.ts +2 -0
  36. package/dist/test/unit/transactionBuilder/transfer.d.ts.map +1 -0
  37. package/dist/test/unit/transactionBuilder/transfer.js +223 -0
  38. package/dist/test/unit/transactionBuilder/walletInitializationBuilder.d.ts +2 -0
  39. package/dist/test/unit/transactionBuilder/walletInitializationBuilder.d.ts.map +1 -0
  40. package/dist/test/unit/transactionBuilder/walletInitializationBuilder.js +174 -0
  41. package/dist/test/unit/transferBuilder.d.ts +2 -0
  42. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  43. package/dist/test/unit/transferBuilder.js +119 -0
  44. package/dist/test/unit/util.d.ts +2 -0
  45. package/dist/test/unit/util.d.ts.map +1 -0
  46. package/dist/test/unit/util.js +235 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/package.json +22 -16
  49. package/.eslintignore +0 -5
  50. package/.mocharc.yml +0 -8
  51. package/CHANGELOG.md +0 -135
@@ -0,0 +1,1271 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
37
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
38
+ const src_1 = require("../../src");
39
+ const getBuilder_1 = require("./getBuilder");
40
+ const secp256k1 = __importStar(require("secp256k1"));
41
+ const secp256k1_1 = require("@bitgo-beta/secp256k1");
42
+ const nock = __importStar(require("nock"));
43
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
+ const sdk_coin_eth_1 = require("@bitgo-beta/sdk-coin-eth");
45
+ const should = __importStar(require("should"));
46
+ const avaxc_1 = require("../resources/avaxc");
47
+ const sdk_coin_avaxp_1 = require("@bitgo-beta/sdk-coin-avaxp");
48
+ const helpers_1 = require("./helpers");
49
+ const sinon = __importStar(require("sinon"));
50
+ const ethereumjs_util_1 = require("ethereumjs-util");
51
+ nock.enableNetConnect();
52
+ describe('Avalanche C-Chain', function () {
53
+ let bitgo;
54
+ let tavaxCoin;
55
+ let avaxCoin;
56
+ let hopTxBitgoSignature;
57
+ let hopExportTxBitgoSignature;
58
+ const address1 = '0x174cfd823af8ce27ed0afee3fcf3c3ba259116be';
59
+ const address2 = '0x7e85bdc27c050e3905ebf4b8e634d9ad6edd0de6';
60
+ const hopContractAddress = '0x47ce7cc86efefef19f8fb516b11735d183da8635';
61
+ const hopDestinationAddress = '0x9c7e8ce6825bD48278B3Ab59228EE26f8BE7925b';
62
+ const hopTx = '0xf86b808504a817c8ff8252ff949c7e8ce6825bd48278b3ab59228ee26f8be7925b87038d7ea4c68000801ca011bc22c664570133dfca4f08a0b8d02339cf467046d6a4152f04f368d0eaf99ea01d6dc5cf0c897c8d4c3e1df53d0d042784c424536a4cc5b802552b7d64fee8b5';
63
+ const hopTxid = '0x4af65143bc77da2b50f35b3d13cacb4db18f026bf84bc0743550bc57b9b53351';
64
+ const userReqSig = '0x404db307f6147f0d8cd338c34c13906ef46a6faa7e0e119d5194ef05aec16e6f3d710f9b7901460f97e924066b62efd74443bd34402c6d40b49c203a559ff2c8';
65
+ const hopExportTx = '0x000000000001000000057fc93d85c6d62c5b2ac0b519c87010ea5294012d1e407030d6acd0021cac10d50000000000000000000000000000000000000000000000000000000000000000000000011fe3de7886be9e53072d6762e9fa1fc27dddfb0500000000061465b23d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa0000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000070000000006052340000000000000000000000002000000038b2ce3381003fdf86900280a4ec86b384b5d5c99b7fc1f65220b9a0b2f431578b8bb6ee130bf563af1fab1503135fbd423e442d5e9b73abd5622fe02000000010000000900000001af20066197fa3b72bea3d7cc503c60918c098378b958fbb5da8c6f438d0f4e380e506bb2c38dc88dd97c81e982706c48623937c2fe22b31248ed9fd34951480b0173b4e9ca';
66
+ const hopExportTxId = '0xc4b5ca6e7d8c9c24bb9934afcb5c87e6db472dbe31111b778445f8f9c5352966';
67
+ before(function () {
68
+ const bitgoKeyXprv = 'xprv9s21ZrQH143K3tpWBHWe31sLoXNRQ9AvRYJgitkKxQ4ATFQMwvr7hHNqYRUnS7PsjzB7aK1VxqHLuNQjj1sckJ2Jwo2qxmsvejwECSpFMfC';
69
+ const bitgoKey = secp256k1_1.bip32.fromBase58(bitgoKeyXprv);
70
+ if (!bitgoKey.privateKey) {
71
+ throw new Error('no privateKey');
72
+ }
73
+ const bitgoXpub = bitgoKey.neutered().toBase58();
74
+ hopTxBitgoSignature =
75
+ '0xaa' +
76
+ Buffer.from(secp256k1.ecdsaSign(Buffer.from(hopTxid.slice(2), 'hex'), bitgoKey.privateKey).signature).toString('hex');
77
+ hopExportTxBitgoSignature =
78
+ '0xaa' +
79
+ Buffer.from(secp256k1.ecdsaSign(Buffer.from(hopExportTxId.slice(2), 'hex'), bitgoKey.privateKey).signature).toString('hex');
80
+ const env = 'test';
81
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env });
82
+ bitgo.safeRegister('avaxc', src_1.AvaxC.createInstance);
83
+ bitgo.safeRegister('tavaxc', src_1.TavaxC.createInstance);
84
+ bitgo.safeRegister('teth', sdk_coin_eth_1.Eth.createInstance);
85
+ bitgo.safeRegister('tavaxp', sdk_coin_avaxp_1.TavaxP.createInstance);
86
+ sdk_core_1.common.Environments[bitgo.getEnv()].hsmXpub = bitgoXpub;
87
+ bitgo.initializeTestVars();
88
+ });
89
+ beforeEach(() => {
90
+ tavaxCoin = bitgo.coin('tavaxc');
91
+ avaxCoin = bitgo.coin('avaxc');
92
+ });
93
+ after(function () {
94
+ nock.cleanAll();
95
+ });
96
+ describe('Instantiate & Statics', () => {
97
+ it('should instantiate the coin', function () {
98
+ let localBasecoin = bitgo.coin('tavaxc');
99
+ localBasecoin.should.be.an.instanceof(src_1.TavaxC);
100
+ localBasecoin = bitgo.coin('avaxc');
101
+ localBasecoin.should.be.an.instanceof(src_1.AvaxC);
102
+ });
103
+ it('should get hop digest', () => {
104
+ const digest = src_1.AvaxC.getHopDigest(['1', '2', '3']);
105
+ digest.toString('hex').should.equal('231cda5f050c841322b9df536afb633ca062400a8f393bf654a48bdd1dfd825b');
106
+ });
107
+ });
108
+ describe('KeyPair', () => {
109
+ it('should generate tavax keyPair without aguments', () => {
110
+ const kp = tavaxCoin.generateKeyPair();
111
+ kp.should.have.property('prv');
112
+ kp.should.have.property('pub');
113
+ });
114
+ it('should generate avax keyPair without aguments', () => {
115
+ const kp = avaxCoin.generateKeyPair();
116
+ kp.should.have.property('prv');
117
+ kp.should.have.property('pub');
118
+ });
119
+ it('should generate avax keyPair from seed', () => {
120
+ const seed = '4b3b89f6ca897cb729d2146913877f71';
121
+ const tAvaxKeyPair = tavaxCoin.generateKeyPair(Buffer.from(seed, 'hex'));
122
+ const avaxKeyPair = avaxCoin.generateKeyPair(Buffer.from(seed, 'hex'));
123
+ tAvaxKeyPair.should.have.property('prv');
124
+ tAvaxKeyPair.should.have.property('pub');
125
+ tAvaxKeyPair.prv.should.equals('xprv9s21ZrQH143K2MJE1yvV8UhjfLQcaDPPipMYvfYjrPbHLptLsnt1FbbCrCT9E5LCmRrS593YZ1CKgf3rf3C2hYTynZN5au3VvBvLcWh8sV2');
126
+ tAvaxKeyPair.pub.should.equals('xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ');
127
+ tAvaxKeyPair.should.deepEqual(avaxKeyPair);
128
+ });
129
+ });
130
+ describe('keys validations success cases', () => {
131
+ it('validate valid eth uncompressed public key', () => {
132
+ const uncompressedPublicKey = '043BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E227874E8075353564D83047566EEA6CF5A7313816AF004DDA8CA529DE8C94BC6A';
133
+ tavaxCoin.isValidPub(uncompressedPublicKey).should.be.true();
134
+ avaxCoin.isValidPub(uncompressedPublicKey).should.be.true();
135
+ });
136
+ it('validate valid eth compressed public key', () => {
137
+ const compressedPublicKey = '023BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E2';
138
+ tavaxCoin.isValidPub(compressedPublicKey).should.be.true();
139
+ avaxCoin.isValidPub(compressedPublicKey).should.be.true();
140
+ });
141
+ it('validate valid extended public key', () => {
142
+ const extendedPublicKey = 'xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ';
143
+ tavaxCoin.isValidPub(extendedPublicKey).should.be.true();
144
+ avaxCoin.isValidPub(extendedPublicKey).should.be.true();
145
+ });
146
+ it('validate valid eth address', () => {
147
+ const address = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
148
+ tavaxCoin.isValidAddress(address).should.be.true();
149
+ avaxCoin.isValidAddress(address).should.be.true();
150
+ });
151
+ it('should validate an array of p-chain addresses', function () {
152
+ const address = [
153
+ 'P-fuji15x3z4rvk8e7vwa6g9lkyg89v5dwknp44858uex',
154
+ 'P-avax143q8lsy3y4ke9d6zeltre8u2ateed6uk9ka0nu',
155
+ 'NodeID-143q8lsy3y4ke9d6zeltre8u2ateed6uk9ka0nu',
156
+ ];
157
+ tavaxCoin.isValidAddress(address).should.be.true();
158
+ avaxCoin.isValidAddress(address).should.be.true();
159
+ });
160
+ it('should validate a p-chain multsig address string', function () {
161
+ const address = 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59~P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822~P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4';
162
+ tavaxCoin.isValidAddress(address).should.be.true();
163
+ avaxCoin.isValidAddress(address).should.be.true();
164
+ });
165
+ });
166
+ describe('keys validations failure cases', () => {
167
+ it('validate empty eth public key', () => {
168
+ tavaxCoin.isValidPub('').should.be.false();
169
+ avaxCoin.isValidPub('').should.be.false();
170
+ tavaxCoin.isValidPub(undefined).should.be.false();
171
+ avaxCoin.isValidPub(undefined).should.be.false();
172
+ });
173
+ it('validate empty eth address', () => {
174
+ tavaxCoin.isValidAddress(undefined).should.be.false();
175
+ avaxCoin.isValidAddress(undefined).should.be.false();
176
+ });
177
+ it('validate eth uncompressed public key too short', () => {
178
+ const uncompressedPublicKey = '043BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E227874E8075353564D83047566EEA6CF5A7313816AF004DDA8CA529DE8C94BC6A';
179
+ tavaxCoin.isValidPub(uncompressedPublicKey.slice(1)).should.be.false();
180
+ avaxCoin.isValidPub(uncompressedPublicKey.slice(1)).should.be.false();
181
+ });
182
+ it('validate eth compressed public key too short', () => {
183
+ const compressedPublicKey = '023BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E2';
184
+ tavaxCoin.isValidPub(compressedPublicKey.slice(1)).should.be.false();
185
+ avaxCoin.isValidPub(compressedPublicKey.slice(1)).should.be.false();
186
+ });
187
+ it('validate invalid extended private key', () => {
188
+ const extendedPublicKey = 'xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ';
189
+ tavaxCoin.isValidPub(extendedPublicKey.substr(0, extendedPublicKey.length - 1)).should.be.false();
190
+ avaxCoin.isValidPub(extendedPublicKey.substr(0, extendedPublicKey.length - 1)).should.be.false();
191
+ });
192
+ it('validate eth address too short', () => {
193
+ const address = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
194
+ tavaxCoin.isValidAddress(address.slice(1)).should.be.false();
195
+ avaxCoin.isValidAddress(address.slice(1)).should.be.false();
196
+ });
197
+ it('validate eth uncompressed public key too long', () => {
198
+ const uncompressedPublicKey = '043BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E227874E8075353564D83047566EEA6CF5A7313816AF004DDA8CA529DE8C94BC6A';
199
+ tavaxCoin.isValidPub(uncompressedPublicKey + '00').should.be.false();
200
+ avaxCoin.isValidPub(uncompressedPublicKey + '00').should.be.false();
201
+ });
202
+ it('validate eth compressed public key too long', () => {
203
+ const compressedPublicKey = '023BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E2';
204
+ tavaxCoin.isValidPub(compressedPublicKey + '00').should.be.false();
205
+ avaxCoin.isValidPub(compressedPublicKey + '00').should.be.false();
206
+ });
207
+ it('validate extended public key too long', () => {
208
+ const extendedPublicKey = 'xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ';
209
+ tavaxCoin.isValidPub(extendedPublicKey + '00').should.be.false();
210
+ avaxCoin.isValidPub(extendedPublicKey + '00').should.be.false();
211
+ });
212
+ it('validate eth address too long', () => {
213
+ const address = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
214
+ tavaxCoin.isValidAddress(address + '00').should.be.false();
215
+ avaxCoin.isValidAddress(address + '00').should.be.false();
216
+ });
217
+ });
218
+ describe('Sign Transaction', () => {
219
+ const account_1 = {
220
+ address: '0xeeaf0F05f37891ab4a21208B105A0687d12c5aF7',
221
+ owner_1: '4ee089aceabf3ddbf748db79b1066c33b7d3ea1ab3eb7e325121bba2bff2f5ca',
222
+ owner_2: '5ca116d25aec5f765465432cc421ff25ef9ffdc330b10bb3d9ad61e3baad88d7',
223
+ owner_3: '1fae946cc84af8bd74d610a88537e24e19c3349d478d86fc5bb59ba4c88fb9cc',
224
+ };
225
+ const account_2 = {
226
+ address: '0x8Ce59c2d1702844F8EdED451AA103961bC37B4e8',
227
+ owner_1: '4ee089aceabf3ddbf748db79b1066c33b7d3ea1ab3eb7e325121bba2bff2f5ca',
228
+ owner_2: '5c7e4efff7304d4dfff6d5f1591844ec6f2adfa6a47e9fece6a3c1a4d755f1e3',
229
+ owner_3: '4421ab25dd91e1a3180d03d57c323a7886dcc313d3b3a4b4256a5791572bf597',
230
+ };
231
+ it('should use recipients from txPrebuild when available including data field', async function () {
232
+ const builder = (0, getBuilder_1.getBuilder)('tavaxc');
233
+ builder.fee({
234
+ fee: '280000000000',
235
+ gasLimit: '7000000',
236
+ });
237
+ builder.counter(1);
238
+ builder.type(sdk_core_1.TransactionType.Send);
239
+ builder.contract(account_1.address);
240
+ builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
241
+ const unsignedTx = await builder.build();
242
+ const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
243
+ // Test with recipients in txPrebuild including data field
244
+ const customRecipients = [
245
+ { address: '0x1234567890123456789012345678901234567890', amount: '500', data: '0xa9059cbb' },
246
+ { address: '0x0987654321098765432109876543210987654321', amount: '300', data: '0x23b872dd' },
247
+ ];
248
+ const halfSignedRawTx = await tavaxCoin.signTransaction({
249
+ txPrebuild: {
250
+ txHex: unsignedTxForBroadcasting,
251
+ recipients: customRecipients,
252
+ },
253
+ prv: account_1.owner_2,
254
+ });
255
+ // Should use recipients from txPrebuild, not from transaction outputs
256
+ halfSignedRawTx.halfSigned.recipients.length.should.equals(2);
257
+ halfSignedRawTx.halfSigned.recipients[0].address.should.equals(customRecipients[0].address);
258
+ halfSignedRawTx.halfSigned.recipients[0].amount.should.equals(customRecipients[0].amount);
259
+ halfSignedRawTx.halfSigned.recipients[0].data.should.equals(customRecipients[0].data);
260
+ halfSignedRawTx.halfSigned.recipients[1].address.should.equals(customRecipients[1].address);
261
+ halfSignedRawTx.halfSigned.recipients[1].amount.should.equals(customRecipients[1].amount);
262
+ halfSignedRawTx.halfSigned.recipients[1].data.should.equals(customRecipients[1].data);
263
+ });
264
+ it('should sign an unsigned test tx with eip1559', async function () {
265
+ const builder = (0, getBuilder_1.getBuilder)('tavaxc');
266
+ builder.fee({
267
+ fee: '280000000000',
268
+ gasLimit: '7000000',
269
+ eip1559: {
270
+ maxFeePerGas: '7593123',
271
+ maxPriorityFeePerGas: '150',
272
+ },
273
+ });
274
+ builder.counter(1);
275
+ builder.type(sdk_core_1.TransactionType.Send);
276
+ builder.contract(account_1.address);
277
+ builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
278
+ const unsignedTx = await builder.build();
279
+ const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
280
+ const halfSignedRawTx = await tavaxCoin.signTransaction({
281
+ txPrebuild: {
282
+ txHex: unsignedTxForBroadcasting,
283
+ eip1559: {
284
+ maxFeePerGas: '7593123',
285
+ maxPriorityFeePerGas: '150',
286
+ },
287
+ },
288
+ prv: account_1.owner_2,
289
+ });
290
+ builder.transfer().key(account_1.owner_2);
291
+ const halfSignedTx = await builder.build();
292
+ const halfSignedTxForBroadcasting = halfSignedTx.toBroadcastFormat();
293
+ halfSignedRawTx.halfSigned.txHex.should.equals(halfSignedTxForBroadcasting);
294
+ halfSignedRawTx.halfSigned.recipients.length.should.equals(1);
295
+ halfSignedRawTx.halfSigned.recipients[0].address.toLowerCase().should.equals(account_2.address.toLowerCase());
296
+ halfSignedRawTx.halfSigned.recipients[0].amount.toLowerCase().should.equals('1');
297
+ halfSignedRawTx.halfSigned.eip1559.maxFeePerGas.should.equal('7593123');
298
+ halfSignedRawTx.halfSigned.eip1559.maxPriorityFeePerGas.should.equal('150');
299
+ });
300
+ it('should preserve data field from txPrebuild recipients for contract interactions', async function () {
301
+ const builder = (0, getBuilder_1.getBuilder)('avaxc');
302
+ builder.fee({
303
+ fee: '280000000000',
304
+ gasLimit: '7000000',
305
+ });
306
+ builder.counter(1);
307
+ builder.type(sdk_core_1.TransactionType.Send);
308
+ builder.contract(account_1.address);
309
+ builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
310
+ const unsignedTx = await builder.build();
311
+ const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
312
+ // Test with complex contract interaction data
313
+ const contractCallData = '0xa9059cbb000000000000000000000000abcdef1234567890abcdef1234567890abcdef120000000000000000000000000000000000000000000000000de0b6b3a7640000';
314
+ const customRecipients = [
315
+ {
316
+ address: '0x1234567890123456789012345678901234567890',
317
+ amount: '0', // Contract call with 0 value
318
+ data: contractCallData,
319
+ },
320
+ ];
321
+ const halfSignedRawTx = await avaxCoin.signTransaction({
322
+ txPrebuild: {
323
+ txHex: unsignedTxForBroadcasting,
324
+ recipients: customRecipients,
325
+ },
326
+ prv: account_1.owner_2,
327
+ });
328
+ // Should preserve the contract call data in half-signed transaction
329
+ halfSignedRawTx.halfSigned.recipients.length.should.equals(1);
330
+ halfSignedRawTx.halfSigned.recipients[0].address.should.equals(customRecipients[0].address);
331
+ halfSignedRawTx.halfSigned.recipients[0].amount.should.equals(customRecipients[0].amount);
332
+ halfSignedRawTx.halfSigned.recipients[0].data.should.equals(customRecipients[0].data);
333
+ });
334
+ it('should include isBatch, contractSequenceId, and sequenceId in half-signed txParams for batch transactions', async function () {
335
+ const builder = (0, getBuilder_1.getBuilder)('tavaxc');
336
+ builder.fee({
337
+ fee: '280000000000',
338
+ gasLimit: '7000000',
339
+ });
340
+ builder.counter(1);
341
+ builder.type(sdk_core_1.TransactionType.Send);
342
+ builder.contract(account_1.address);
343
+ builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
344
+ const unsignedTx = await builder.build();
345
+ const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
346
+ const halfSignedRawTx = await tavaxCoin.signTransaction({
347
+ txPrebuild: {
348
+ txHex: unsignedTxForBroadcasting,
349
+ isBatch: true,
350
+ nextContractSequenceId: 42,
351
+ },
352
+ prv: account_1.owner_2,
353
+ sequenceId: '7',
354
+ });
355
+ halfSignedRawTx.halfSigned.isBatch.should.equal(true);
356
+ halfSignedRawTx.halfSigned.contractSequenceId.should.equal(42);
357
+ halfSignedRawTx.halfSigned.sequenceId.should.equal('7');
358
+ });
359
+ });
360
+ describe('Transaction Verification', () => {
361
+ it('should verify a hop txPrebuild from the bitgo server that matches the client txParams', async function () {
362
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
363
+ const txParams = {
364
+ recipients: [{ amount: 1000000000000000, address: hopDestinationAddress }],
365
+ wallet: wallet,
366
+ walletPassphrase: 'fakeWalletPassphrase',
367
+ hop: true,
368
+ };
369
+ const txPrebuild = {
370
+ recipients: [{ amount: '5000000000000000', address: hopContractAddress }],
371
+ nextContractSequenceId: 0,
372
+ gasPrice: 20000000000,
373
+ gasLimit: 500000,
374
+ isBatch: false,
375
+ coin: 'tavaxc',
376
+ walletId: 'fakeWalletId',
377
+ walletContractAddress: 'fakeWalletContractAddress',
378
+ hopTransaction: {
379
+ tx: hopTx,
380
+ id: hopTxid,
381
+ signature: hopTxBitgoSignature,
382
+ paymentId: '2773928196',
383
+ gasPrice: 20000000000,
384
+ gasLimit: 500000,
385
+ amount: '1000000000000000',
386
+ recipient: hopDestinationAddress,
387
+ nonce: 0,
388
+ userReqSig: userReqSig,
389
+ gasPriceMax: 500000000000,
390
+ },
391
+ };
392
+ const verification = {};
393
+ const isTransactionVerified = await tavaxCoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
394
+ isTransactionVerified.should.equal(true);
395
+ });
396
+ describe('Hop export tx verify', () => {
397
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
398
+ const hopDestinationAddress = 'P-fuji13vkwxwqsq07ls6gq9q9yajrt8p946hye5zq3w3~P-fuji178atz5p3xhaagglygt27nde6h4tz9lsznwq2dh~P-fuji1kl7p7efzpwdqkt6rz4ut3wmwuyct7436q6l9h5';
399
+ const hopAddress = '0x1fe3de7886be9e53072d6762e9fa1fc27dddfb05';
400
+ const importTxFee = 1e6;
401
+ const amount = 100000000000000000;
402
+ const txParams = {
403
+ recipients: [{ amount, address: hopDestinationAddress }],
404
+ wallet: wallet,
405
+ walletPassphrase: 'fakeWalletPassphrase',
406
+ hop: true,
407
+ type: 'Export',
408
+ };
409
+ const txPrebuild = {
410
+ recipients: [{ amount: '102000050000000000', address: hopAddress }],
411
+ nextContractSequenceId: 0,
412
+ gasPrice: 20000000000,
413
+ gasLimit: 500000,
414
+ isBatch: false,
415
+ coin: 'tavaxc',
416
+ walletId: 'fakeWalletId',
417
+ walletContractAddress: 'fakeWalletContractAddress',
418
+ hopTransaction: {
419
+ tx: hopExportTx,
420
+ id: hopExportTxId,
421
+ signature: hopExportTxBitgoSignature,
422
+ paymentId: '4933349984',
423
+ gasPrice: '50',
424
+ gasLimit: 1,
425
+ amount: '101000000',
426
+ recipient: hopDestinationAddress,
427
+ nonce: 0,
428
+ userReqSig: '0x06fd0b1f8859a40d9fb2d1a65d54da5d645a1d81bbb8c1c5b037051843ec0d3c22433ec7f50cc97fa041cbf8d9ff5ddf7ed41f72a08fa3f1983fd651a33a4441',
429
+ gasPriceMax: 7187500000,
430
+ type: 'Export',
431
+ },
432
+ };
433
+ const verification = {};
434
+ before(() => {
435
+ txPrebuild.hopTransaction.signature = hopExportTxBitgoSignature;
436
+ });
437
+ it('should verify successfully', async function () {
438
+ const verifyAvaxcTransactionOptions = { txParams, txPrebuild, wallet, verification };
439
+ const isTransactionVerified = await tavaxCoin.verifyTransaction(verifyAvaxcTransactionOptions);
440
+ isTransactionVerified.should.equal(true);
441
+ });
442
+ it('should fail verify for amount plus 1', async function () {
443
+ const verifyAvaxcTransactionOptions = {
444
+ txParams: { ...txParams, recipients: [{ amount: amount + 1e9, address: hopDestinationAddress }] },
445
+ txPrebuild,
446
+ wallet,
447
+ verification,
448
+ };
449
+ await tavaxCoin
450
+ .verifyTransaction(verifyAvaxcTransactionOptions)
451
+ .should.be.rejectedWith(`Hop amount: ${amount / 1e9 + importTxFee} does not equal original amount: ${amount / 1e9 + importTxFee + 1}`);
452
+ });
453
+ it('should fail verify for changed prebuild hop address', async function () {
454
+ const verifyAvaxcTransactionOptions = {
455
+ txParams,
456
+ txPrebuild: { ...txPrebuild, recipients: [{ address: address2, amount: '102000050000000000' }] },
457
+ wallet,
458
+ verification,
459
+ };
460
+ await tavaxCoin
461
+ .verifyTransaction(verifyAvaxcTransactionOptions)
462
+ .should.be.rejectedWith(`recipient address of txPrebuild does not match hop address`);
463
+ });
464
+ it('should fail verify for changed address', async function () {
465
+ const hopDestinationAddressDiff = 'P-fuji13vkwxwqsq07ls6gq8q9yajrt8p946hye5zq3w3~P-fuji178atz5p3xhabgglygt27nde6h4tz9lsznwq2dh~P-fuji1kl7p7efzpwdqkt6rz4ut3wmwuyct7436q6l9h6';
466
+ const verifyAvaxcTransactionOptions = {
467
+ txParams: { ...txParams, recipients: [{ amount: amount, address: hopDestinationAddressDiff }] },
468
+ txPrebuild,
469
+ wallet,
470
+ verification,
471
+ };
472
+ await tavaxCoin
473
+ .verifyTransaction(verifyAvaxcTransactionOptions)
474
+ .should.be.rejectedWith(`Hop destination: ${hopDestinationAddress} does not equal original recipient: ${hopDestinationAddressDiff}`);
475
+ });
476
+ it('should verify if walletId is used instead of address', async function () {
477
+ const verifyAvaxcTransactionOptions = {
478
+ txParams: { ...txParams, recipients: [{ amount: amount, walletId: 'same wallet' }] },
479
+ txPrebuild,
480
+ wallet,
481
+ verification,
482
+ };
483
+ const isTransactionVerified = await tavaxCoin.verifyTransaction(verifyAvaxcTransactionOptions);
484
+ isTransactionVerified.should.equal(true);
485
+ });
486
+ });
487
+ it('should reject when client txParams are missing', async function () {
488
+ const coin = bitgo.coin('teth');
489
+ const wallet = new sdk_core_1.Wallet(bitgo, coin, {});
490
+ const txParams = null;
491
+ const txPrebuild = {
492
+ recipients: [{ amount: '1000000000000', address: address1 }],
493
+ nextContractSequenceId: 0,
494
+ gasPrice: 20000000000,
495
+ gasLimit: 500000,
496
+ isBatch: false,
497
+ coin: 'tavaxc',
498
+ walletId: 'fakeWalletId',
499
+ walletContractAddress: 'fakeWalletContractAddress',
500
+ };
501
+ const verification = {};
502
+ await coin
503
+ .verifyTransaction({ txParams: txParams, txPrebuild: txPrebuild, wallet, verification })
504
+ .should.be.rejectedWith('missing params');
505
+ });
506
+ it('should reject txPrebuild that is both batch and hop', async function () {
507
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
508
+ const txParams = {
509
+ recipients: [
510
+ { amount: '1000000000000', address: address1 },
511
+ { amount: '2500000000000', address: address2 },
512
+ ],
513
+ wallet: wallet,
514
+ walletPassphrase: 'fakeWalletPassphrase',
515
+ hop: true,
516
+ };
517
+ const txPrebuild = {
518
+ recipients: [{ amount: '3500000000000', address: address1 }],
519
+ nextContractSequenceId: 0,
520
+ gasPrice: 20000000000,
521
+ gasLimit: 500000,
522
+ isBatch: true,
523
+ coin: 'tavaxc',
524
+ walletId: 'fakeWalletId',
525
+ walletContractAddress: 'fakeWalletContractAddress',
526
+ hopTransaction: {
527
+ tx: hopTx,
528
+ id: hopTxid,
529
+ signature: hopTxBitgoSignature,
530
+ paymentId: '2773928196',
531
+ gasPrice: 20000000000,
532
+ gasLimit: 500000,
533
+ amount: '1000000000000000',
534
+ recipient: hopDestinationAddress,
535
+ nonce: 0,
536
+ userReqSig: userReqSig,
537
+ gasPriceMax: 500000000000,
538
+ },
539
+ };
540
+ const verification = {};
541
+ await tavaxCoin
542
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
543
+ .should.be.rejectedWith('tx cannot be both a batch and hop transaction');
544
+ });
545
+ it('should reject a txPrebuild with more than one recipient', async function () {
546
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
547
+ const txParams = {
548
+ recipients: [
549
+ { amount: '1000000000000', address: address1 },
550
+ { amount: '2500000000000', address: address2 },
551
+ ],
552
+ wallet: wallet,
553
+ walletPassphrase: 'fakeWalletPassphrase',
554
+ };
555
+ const txPrebuild = {
556
+ recipients: [
557
+ { amount: '1000000000000', address: address1 },
558
+ { amount: '2500000000000', address: address2 },
559
+ ],
560
+ nextContractSequenceId: 0,
561
+ gasPrice: 20000000000,
562
+ gasLimit: 500000,
563
+ isBatch: true,
564
+ coin: 'tavaxc',
565
+ walletId: 'fakeWalletId',
566
+ walletContractAddress: 'fakeWalletContractAddress',
567
+ };
568
+ const verification = {};
569
+ await tavaxCoin
570
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
571
+ .should.be.rejectedWith(`tavaxc doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
572
+ });
573
+ it('should reject a hop txPrebuild that does not send to its hop address', async function () {
574
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
575
+ const txParams = {
576
+ recipients: [{ amount: '1000000000000000', address: hopDestinationAddress }],
577
+ wallet: wallet,
578
+ walletPassphrase: 'fakeWalletPassphrase',
579
+ hop: true,
580
+ };
581
+ const txPrebuild = {
582
+ recipients: [{ amount: '5000000000000000', address: address1 }],
583
+ nextContractSequenceId: 0,
584
+ gasPrice: 20000000000,
585
+ gasLimit: 500000,
586
+ isBatch: false,
587
+ coin: 'tavaxc',
588
+ walletId: 'fakeWalletId',
589
+ walletContractAddress: 'fakeWalletContractAddress',
590
+ hopTransaction: {
591
+ tx: hopTx,
592
+ id: hopTxid,
593
+ signature: hopTxBitgoSignature,
594
+ paymentId: '0',
595
+ gasPrice: 20000000000,
596
+ gasLimit: 500000,
597
+ amount: '1000000000000000',
598
+ recipient: hopDestinationAddress,
599
+ nonce: 0,
600
+ userReqSig: userReqSig,
601
+ gasPriceMax: 500000000000,
602
+ },
603
+ };
604
+ const verification = {};
605
+ await tavaxCoin
606
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
607
+ .should.be.rejectedWith('recipient address of txPrebuild does not match hop address');
608
+ });
609
+ it('should reject a normal txPrebuild from the bitgo server with the wrong amount', async function () {
610
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
611
+ const txParams = {
612
+ recipients: [{ amount: '1000000000000', address: address1 }],
613
+ wallet: wallet,
614
+ walletPassphrase: 'fakeWalletPassphrase',
615
+ };
616
+ const txPrebuild = {
617
+ recipients: [{ amount: '2000000000000', address: address1 }],
618
+ nextContractSequenceId: 0,
619
+ gasPrice: 20000000000,
620
+ gasLimit: 500000,
621
+ isBatch: false,
622
+ coin: 'tavaxc',
623
+ walletId: 'fakeWalletId',
624
+ walletContractAddress: 'fakeWalletContractAddress',
625
+ };
626
+ const verification = {};
627
+ await tavaxCoin
628
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
629
+ .should.be.rejectedWith('normal transaction amount in txPrebuild received from BitGo servers does not match txParams supplied by client');
630
+ });
631
+ it('should reject a normal txPrebuild from the bitgo server with the wrong recipient', async function () {
632
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
633
+ const txParams = {
634
+ recipients: [{ amount: '1000000000000', address: address1 }],
635
+ wallet: wallet,
636
+ walletPassphrase: 'fakeWalletPassphrase',
637
+ };
638
+ const txPrebuild = {
639
+ recipients: [{ amount: '1000000000000', address: address2 }],
640
+ nextContractSequenceId: 0,
641
+ gasPrice: 20000000000,
642
+ gasLimit: 500000,
643
+ isBatch: false,
644
+ coin: 'tavaxc',
645
+ walletId: 'fakeWalletId',
646
+ walletContractAddress: 'fakeWalletContractAddress',
647
+ };
648
+ const verification = {};
649
+ await tavaxCoin
650
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
651
+ .should.be.rejectedWith('destination address in normal txPrebuild does not match that in txParams supplied by client');
652
+ });
653
+ it('should verify a token txPrebuild from the bitgo server that matches the client txParams', async function () {
654
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
655
+ const txParams = {
656
+ recipients: [{ amount: '1000000000000', address: address1 }],
657
+ wallet: wallet,
658
+ walletPassphrase: 'fakeWalletPassphrase',
659
+ };
660
+ const txPrebuild = {
661
+ recipients: [{ amount: '1000000000000', address: address1 }],
662
+ nextContractSequenceId: 0,
663
+ gasPrice: 20000000000,
664
+ gasLimit: 500000,
665
+ isBatch: false,
666
+ coin: 'tavaxc',
667
+ token: 'test',
668
+ walletId: 'fakeWalletId',
669
+ walletContractAddress: 'fakeWalletContractAddress',
670
+ };
671
+ const verification = {};
672
+ const isTransactionVerified = await tavaxCoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
673
+ isTransactionVerified.should.equal(true);
674
+ });
675
+ it('should reject a txPrebuild from the bitgo server with the wrong coin', async function () {
676
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
677
+ const txParams = {
678
+ recipients: [{ amount: '1000000000000', address: address1 }],
679
+ wallet: wallet,
680
+ walletPassphrase: 'fakeWalletPassphrase',
681
+ };
682
+ const txPrebuild = {
683
+ recipients: [{ amount: '1000000000000', address: address1 }],
684
+ nextContractSequenceId: 0,
685
+ gasPrice: 20000000000,
686
+ gasLimit: 500000,
687
+ isBatch: false,
688
+ coin: 'btc',
689
+ walletId: 'fakeWalletId',
690
+ walletContractAddress: 'fakeWalletContractAddress',
691
+ };
692
+ const verification = {};
693
+ await tavaxCoin
694
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
695
+ .should.be.rejectedWith('coin in txPrebuild did not match that in txParams supplied by client');
696
+ });
697
+ describe('Batch transaction verification', () => {
698
+ let batcherContractAddress;
699
+ beforeEach(function () {
700
+ batcherContractAddress = tavaxCoin.staticsCoin?.network?.batcherContractAddress;
701
+ });
702
+ it('should verify a native coin batch transaction with matching total amount', async function () {
703
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
704
+ const txParams = {
705
+ recipients: [
706
+ { amount: '1000000000000', address: address1 },
707
+ { amount: '2500000000000', address: address2 },
708
+ ],
709
+ wallet: wallet,
710
+ walletPassphrase: 'fakeWalletPassphrase',
711
+ };
712
+ const txPrebuild = {
713
+ recipients: [{ amount: '3500000000000', address: batcherContractAddress }],
714
+ nextContractSequenceId: 0,
715
+ gasPrice: 20000000000,
716
+ gasLimit: 500000,
717
+ isBatch: true,
718
+ coin: 'tavaxc',
719
+ walletId: 'fakeWalletId',
720
+ walletContractAddress: 'fakeWalletContractAddress',
721
+ };
722
+ const verification = {};
723
+ const isTransactionVerified = await tavaxCoin.verifyTransaction({
724
+ txParams,
725
+ txPrebuild,
726
+ wallet,
727
+ verification,
728
+ });
729
+ isTransactionVerified.should.equal(true);
730
+ });
731
+ it('should verify a token batch transaction with zero native amount', async function () {
732
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
733
+ const txParams = {
734
+ recipients: [
735
+ { amount: '1000000000000', address: address1 },
736
+ { amount: '2500000000000', address: address2 },
737
+ ],
738
+ wallet: wallet,
739
+ walletPassphrase: 'fakeWalletPassphrase',
740
+ tokenName: 'tavaxc:USDC',
741
+ };
742
+ const txPrebuild = {
743
+ recipients: [{ amount: '0', address: batcherContractAddress }],
744
+ nextContractSequenceId: 0,
745
+ gasPrice: 20000000000,
746
+ gasLimit: 500000,
747
+ isBatch: true,
748
+ coin: 'tavaxc',
749
+ walletId: 'fakeWalletId',
750
+ walletContractAddress: 'fakeWalletContractAddress',
751
+ };
752
+ const verification = {};
753
+ const isTransactionVerified = await tavaxCoin.verifyTransaction({
754
+ txParams,
755
+ txPrebuild,
756
+ wallet,
757
+ verification,
758
+ });
759
+ isTransactionVerified.should.equal(true);
760
+ });
761
+ it('should reject a token batch transaction with non-zero native amount', async function () {
762
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
763
+ const txParams = {
764
+ recipients: [
765
+ { amount: '1000000000000', address: address1 },
766
+ { amount: '2500000000000', address: address2 },
767
+ ],
768
+ wallet: wallet,
769
+ walletPassphrase: 'fakeWalletPassphrase',
770
+ tokenName: 'tavaxc:USDC',
771
+ };
772
+ const txPrebuild = {
773
+ recipients: [{ amount: '1000000000000', address: batcherContractAddress }],
774
+ nextContractSequenceId: 0,
775
+ gasPrice: 20000000000,
776
+ gasLimit: 500000,
777
+ isBatch: true,
778
+ coin: 'tavaxc',
779
+ walletId: 'fakeWalletId',
780
+ walletContractAddress: 'fakeWalletContractAddress',
781
+ };
782
+ const verification = {};
783
+ await tavaxCoin
784
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
785
+ .should.be.rejectedWith('batch token transaction amount in txPrebuild should be zero for token transfers');
786
+ });
787
+ it('should reject a native coin batch transaction with mismatched total amount', async function () {
788
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
789
+ const txParams = {
790
+ recipients: [
791
+ { amount: '1000000000000', address: address1 },
792
+ { amount: '2500000000000', address: address2 },
793
+ ],
794
+ wallet: wallet,
795
+ walletPassphrase: 'fakeWalletPassphrase',
796
+ };
797
+ const txPrebuild = {
798
+ recipients: [{ amount: '9999999999999', address: batcherContractAddress }],
799
+ nextContractSequenceId: 0,
800
+ gasPrice: 20000000000,
801
+ gasLimit: 500000,
802
+ isBatch: true,
803
+ coin: 'tavaxc',
804
+ walletId: 'fakeWalletId',
805
+ walletContractAddress: 'fakeWalletContractAddress',
806
+ };
807
+ const verification = {};
808
+ await tavaxCoin
809
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
810
+ .should.be.rejectedWith('batch transaction amount in txPrebuild received from BitGo servers does not match txParams supplied by client');
811
+ });
812
+ it('should reject a batch transaction sent to wrong batcher contract address', async function () {
813
+ const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
814
+ const wrongBatcherAddress = '0x0000000000000000000000000000000000000001';
815
+ const txParams = {
816
+ recipients: [
817
+ { amount: '1000000000000', address: address1 },
818
+ { amount: '2500000000000', address: address2 },
819
+ ],
820
+ wallet: wallet,
821
+ walletPassphrase: 'fakeWalletPassphrase',
822
+ };
823
+ const txPrebuild = {
824
+ recipients: [{ amount: '3500000000000', address: wrongBatcherAddress }],
825
+ nextContractSequenceId: 0,
826
+ gasPrice: 20000000000,
827
+ gasLimit: 500000,
828
+ isBatch: true,
829
+ coin: 'tavaxc',
830
+ walletId: 'fakeWalletId',
831
+ walletContractAddress: 'fakeWalletContractAddress',
832
+ };
833
+ const verification = {};
834
+ await tavaxCoin
835
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
836
+ .should.be.rejectedWith('recipient address of txPrebuild does not match batcher address');
837
+ });
838
+ });
839
+ });
840
+ describe('Hop Transaction Parameters', () => {
841
+ const sandBox = sinon.createSandbox();
842
+ afterEach(function () {
843
+ sandBox.restore();
844
+ });
845
+ it('should create hop transaction parameters with gasPriceMax > 0', async function () {
846
+ const mockFeeEstimate = {
847
+ feeEstimate: '120000',
848
+ gasLimitEstimate: 500000,
849
+ };
850
+ sandBox.stub(tavaxCoin, 'feeEstimate').resolves(mockFeeEstimate);
851
+ const recipients = [
852
+ {
853
+ address: 'P-fuji14xa0q4858ct3kfvpkwnw2dys3m63kt6famckf6~P-fuji1hljye3kesjtpj87m00e8vwkayg6eys6theuxfg~P-fuji1lelqx4cleh3dzk5kplstz6mwrt3duk7d7wwmpp',
854
+ amount: '100000000000000000',
855
+ },
856
+ ];
857
+ const result = await tavaxCoin.createHopTransactionParams({
858
+ recipients,
859
+ type: 'Export',
860
+ });
861
+ result.should.have.property('hopParams');
862
+ result.hopParams.should.have.properties(['userReqSig', 'gasPriceMax', 'paymentId', 'gasLimit']);
863
+ result.hopParams.userReqSig.should.equal('0x');
864
+ result.hopParams.gasPriceMax.should.be.above(0);
865
+ result.hopParams.paymentId.should.be.a.String();
866
+ result.hopParams.gasLimit.should.equal(500000);
867
+ });
868
+ });
869
+ describe('Explain Transaction', () => {
870
+ it('should explain a half signed import in C transaction', async () => {
871
+ const testData = avaxc_1.IMPORT_C;
872
+ const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.halfsigntxHex, crossChainType: 'import' });
873
+ txExplain.outputAmount.should.equal((Number(testData.amount) - txExplain.fee?.fee).toString());
874
+ txExplain.type.should.equal(sdk_core_1.TransactionType.Import);
875
+ txExplain.outputs[0].address.should.equal(testData.to);
876
+ txExplain.changeOutputs.should.be.empty();
877
+ should.not.exist(txExplain.memo);
878
+ });
879
+ it('should explain a signed import in C transaction', async () => {
880
+ const testData = avaxc_1.IMPORT_C;
881
+ const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.fullsigntxHex, crossChainType: 'import' });
882
+ txExplain.outputAmount.should.equal((Number(testData.amount) - txExplain.fee?.fee).toString());
883
+ txExplain.type.should.equal(sdk_core_1.TransactionType.Import);
884
+ txExplain.outputs[0].address.should.equal(testData.to);
885
+ txExplain.changeOutputs.should.be.empty();
886
+ should.not.exist(txExplain.memo);
887
+ });
888
+ it('should explain a unsigned export in C transaction', async () => {
889
+ const importInPFee = 1000000;
890
+ const testData = avaxc_1.EXPORT_C;
891
+ const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.unsignedTxHex, crossChainType: 'export' });
892
+ txExplain.outputAmount.should.equal((Number(testData.amount) + importInPFee).toString());
893
+ txExplain.type.should.equal(sdk_core_1.TransactionType.Export);
894
+ txExplain.inputs[0].address.should.equal(testData.cHexAddress);
895
+ txExplain.outputs[0].address.should.equal(testData.pAddresses.slice().sort().join('~'));
896
+ txExplain.fee.fee.should.equal(testData.fee);
897
+ txExplain.changeOutputs.should.be.empty();
898
+ should.not.exist(txExplain.memo);
899
+ });
900
+ it('should explain a signed export in C transaction', async () => {
901
+ const importInPFee = 1000000;
902
+ const testData = avaxc_1.EXPORT_C;
903
+ const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.fullsigntxHex, crossChainType: 'export' });
904
+ txExplain.outputAmount.should.equal((Number(testData.amount) + importInPFee).toString());
905
+ txExplain.type.should.equal(sdk_core_1.TransactionType.Export);
906
+ txExplain.inputs[0].address.should.equal(testData.cHexAddress);
907
+ txExplain.outputs[0].address.should.equal(testData.pAddresses.slice().sort().join('~'));
908
+ txExplain.fee.fee.should.equal(testData.fee);
909
+ txExplain.changeOutputs.should.be.empty();
910
+ should.not.exist(txExplain.memo);
911
+ });
912
+ });
913
+ // TODO(BG-56136): move to modules/bitgo/test/v2/integration/coins/avaxc.ts
914
+ describe('Recovery', function () {
915
+ // contract address for 'tavaxc:link'
916
+ const tokenContractAddress = '0x0b9d5d9136855f6fec3c0993fee6e9ce8a297846';
917
+ const sequenceIdData = '0xa0b7967b';
918
+ const sandBox = sinon.createSandbox();
919
+ beforeEach(function () {
920
+ const callBack = sandBox.stub(src_1.AvaxC.prototype, 'recoveryBlockchainExplorerQuery');
921
+ callBack
922
+ .withArgs({
923
+ jsonrpc: '2.0',
924
+ method: 'eth_getTransactionCount',
925
+ params: ['0xdfd95d01fc9c2cb744e2852256385bbe6d87b72b', 'latest'],
926
+ id: 1,
927
+ })
928
+ .resolves({ jsonrpc: '2.0', id: 1, result: '0x0' });
929
+ callBack
930
+ .withArgs({
931
+ jsonrpc: '2.0',
932
+ method: 'eth_getTransactionCount',
933
+ params: ['0x29d97ce344599825220a54a4bdf7b8aa7ca14fd1', 'latest'],
934
+ id: 1,
935
+ })
936
+ .resolves({ jsonrpc: '2.0', id: 1, result: '0x7' });
937
+ callBack
938
+ .withArgs({
939
+ jsonrpc: '2.0',
940
+ method: 'eth_getBalance',
941
+ params: ['0xdfd95d01fc9c2cb744e2852256385bbe6d87b72b', 'latest'],
942
+ id: 1,
943
+ })
944
+ .resolves({ jsonrpc: '2.0', id: 1, result: '0x0' });
945
+ callBack
946
+ .withArgs({
947
+ jsonrpc: '2.0',
948
+ method: 'eth_getBalance',
949
+ params: ['0x29d97ce344599825220a54a4bdf7b8aa7ca14fd1', 'latest'],
950
+ id: 1,
951
+ })
952
+ .resolves({ jsonrpc: '2.0', id: 1, result: '0x315f8cb9bc2ec00' });
953
+ callBack
954
+ .withArgs({
955
+ jsonrpc: '2.0',
956
+ method: 'eth_getBalance',
957
+ params: ['0xe0b1fe098050f2745b450de419b5cafc7e826699', 'latest'],
958
+ id: 1,
959
+ })
960
+ .resolves({ jsonrpc: '2.0', id: 1, result: '0x0' });
961
+ callBack
962
+ .withArgs({
963
+ jsonrpc: '2.0',
964
+ method: 'eth_call',
965
+ params: [{ to: '0xe0b1fe098050f2745b450de419b5cafc7e826699', data: '0xa0b7967b' }, 'latest'],
966
+ id: 1,
967
+ })
968
+ .resolves({
969
+ jsonrpc: '2.0',
970
+ id: 1,
971
+ result: '0x000000000000000000000000000000000000000000000000000000000000000f',
972
+ });
973
+ callBack
974
+ .withArgs({
975
+ jsonrpc: '2.0',
976
+ method: 'eth_getTransactionCount',
977
+ params: [avaxc_1.recoveryUsers.hotWalletRecoveryUser.backupKeyAddress, 'latest'],
978
+ id: 1,
979
+ })
980
+ .resolves(avaxc_1.endpointResponses.addressNonceResponse1);
981
+ callBack
982
+ .withArgs({
983
+ jsonrpc: '2.0',
984
+ method: 'eth_getTransactionCount',
985
+ params: [avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKeyAddress, 'latest'],
986
+ id: 1,
987
+ })
988
+ .resolves(avaxc_1.endpointResponses.addressNonceResponse2);
989
+ callBack
990
+ .withArgs({
991
+ jsonrpc: '2.0',
992
+ method: 'eth_getBalance',
993
+ params: [avaxc_1.recoveryUsers.hotWalletRecoveryUser.backupKeyAddress, 'latest'],
994
+ id: 1,
995
+ })
996
+ .resolves(avaxc_1.endpointResponses.backupAddressBalanceResponse);
997
+ callBack
998
+ .withArgs({
999
+ jsonrpc: '2.0',
1000
+ method: 'eth_getBalance',
1001
+ params: [avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKeyAddress, 'latest'],
1002
+ id: 1,
1003
+ })
1004
+ .resolves(avaxc_1.endpointResponses.backupAddressBalanceResponse);
1005
+ callBack
1006
+ .withArgs({
1007
+ jsonrpc: '2.0',
1008
+ method: 'eth_call',
1009
+ params: [
1010
+ {
1011
+ to: tokenContractAddress,
1012
+ data: sdk_coin_eth_1.optionalDeps.ethUtil.addHexPrefix(sdk_coin_eth_1.optionalDeps.ethAbi
1013
+ .simpleEncode('balanceOf(address)', avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress)
1014
+ .toString('hex')),
1015
+ },
1016
+ 'latest',
1017
+ ],
1018
+ id: 1,
1019
+ })
1020
+ .resolves(avaxc_1.endpointResponses.addressTokenBalanceResponse);
1021
+ callBack
1022
+ .withArgs({
1023
+ jsonrpc: '2.0',
1024
+ method: 'eth_call',
1025
+ params: [
1026
+ {
1027
+ to: tokenContractAddress,
1028
+ data: sdk_coin_eth_1.optionalDeps.ethUtil.addHexPrefix(sdk_coin_eth_1.optionalDeps.ethAbi
1029
+ .simpleEncode('balanceOf(address)', avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress)
1030
+ .toString('hex')),
1031
+ },
1032
+ 'latest',
1033
+ ],
1034
+ id: 1,
1035
+ })
1036
+ .resolves(avaxc_1.endpointResponses.addressTokenBalanceResponse);
1037
+ callBack
1038
+ .withArgs({
1039
+ jsonrpc: '2.0',
1040
+ method: 'eth_call',
1041
+ params: [{ to: avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress, data: sequenceIdData }, 'latest'],
1042
+ id: 1,
1043
+ })
1044
+ .resolves(avaxc_1.endpointResponses.sequenceIdResponse1);
1045
+ callBack
1046
+ .withArgs({
1047
+ jsonrpc: '2.0',
1048
+ method: 'eth_call',
1049
+ params: [{ to: avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress, data: sequenceIdData }, 'latest'],
1050
+ id: 1,
1051
+ })
1052
+ .resolves(avaxc_1.endpointResponses.sequenceIdResponse2);
1053
+ });
1054
+ afterEach(function () {
1055
+ sandBox.restore();
1056
+ });
1057
+ describe('Non-BitGo', async function () {
1058
+ it('should error when the backup key is unfunded (cannot pay gas)', async function () {
1059
+ await tavaxCoin
1060
+ .recover({
1061
+ userKey: '{"iv":"ntd9/urFjryqxd4rzREB2Q==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
1062
+ ':"ccm","adata":"","cipher":"aes","salt":"LTqZ47b1BwE=","ct":"JSbJIBTkHoKR3L\n' +
1063
+ 'oT2QTkDx3X1OBIPxiSL6WoMiIrKA+aKTgmutXnWC2GTEIyfbLeajw6D2UZ+U0Y8viv7mgITgSz1\n' +
1064
+ 'u9Gdj97Btm8WsZ0e+KmsbdB/gYucCZoPUZCFqG4bEkdfZ8ZvDI9XvVv4xPzNb/AoSijosA="}',
1065
+ backupKey: '{"iv":"Axs+G9gsZ5PENUHx1YY5cg==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
1066
+ ':"ccm","adata":"","cipher":"aes","salt":"awQshUvFi7Q=","ct":"sWQ0bHmruUTI8C\n' +
1067
+ 'lwGneHObdNfo3WQ/mrz3p84Fo07HgizvgLd+E3wFA3Z1LRbHozRjfstV/qJMRqrFvEgKOcG+SKd\n' +
1068
+ 'gx6BbmXWfKhFHEerSYluBgU5OrXMfOkbExnMywEWrCKEvoNL+wyNHoRaMNbbDogo36J8PE="}',
1069
+ walletContractAddress: '0x22c1ab44371985e49294d1a40e92c8ad00f5be8e',
1070
+ // walletPassphrase: TestBitGo.V2.TEST_RECOVERY_PASSCODE,
1071
+ walletPassphrase: 'Ghghjkg!455544llll',
1072
+ recoveryDestination: '0x94b51ebb8c3b90404ad262f42c1588bd94242ecb',
1073
+ })
1074
+ .should.be.rejectedWith('Backup key address 0xdfd95d01fc9c2cb744e2852256385bbe6d87b72b has balance 0 Gwei.This address must have a balance of at least 10000000 Gwei to perform recoveries. Try sending some AVAX to this address then retry.');
1075
+ });
1076
+ it('should build recovery tx', async function () {
1077
+ const recovery = await tavaxCoin.recover({
1078
+ userKey: '{"iv":"o27pBl7IP+ibe39xYg/cXg==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
1079
+ ':"ccm","adata":"","cipher":"aes","salt":"992R6padf2I=","ct":"6wkn1PdwtWcCWR\n' +
1080
+ 'VdOdaiGMCMS5RhurGI9eF4tdgzaMzOpgw56eYRmKTzldj5Vh1Cnz6RoqFlVSfnwR+tFjOyqDn3O\n' +
1081
+ '8K3NUD5YlMGoCdfvcrCbPF3tCdKl2DyoLv+ZWPo5sKVjjgUOZgI7pn7iBtXRDvqaWylawY="}',
1082
+ backupKey: '{"iv":"mwj9ld8svgRBsWS+5NZQqA==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
1083
+ ':"ccm","adata":"","cipher":"aes","salt":"XuMxbqa/yNg=","ct":"lqLnjsVSBR/4ue\n' +
1084
+ 'ztYahAvEEV+ltDXLoyIEMCmFMycba+3mPtiAM8HrF/84AzJOjwKyvK1pm+CFuuWCTXssAQxRCuc\n' +
1085
+ 'HujrBvrKunY4hfIJHJsyBr+l1PNNSUB/aYL1aW/n7tdvwL8fOCNqFqEPBCbxXoOlSgCAUw="}',
1086
+ walletContractAddress: '0xe0b1fe098050f2745b450de419b5cafc7e826699',
1087
+ walletPassphrase: 'Ghghjkg!455544llll',
1088
+ recoveryDestination: '0x94b51ebb8c3b90404ad262f42c1588bd94242ecb',
1089
+ gasPrice: '30000000000',
1090
+ });
1091
+ // id and tx will always be different because of expireTime
1092
+ recovery.should.not.be.undefined();
1093
+ recovery.should.have.property('id');
1094
+ recovery.should.have.property('tx');
1095
+ const txBuilder = tavaxCoin.getTransactionBuilder();
1096
+ txBuilder.from(recovery.tx);
1097
+ const tx = await txBuilder.build();
1098
+ tx.toBroadcastFormat().should.not.be.empty();
1099
+ });
1100
+ });
1101
+ describe('Unsigned Sweep', function () {
1102
+ const userXprv = 'xprv9s21ZrQH143K3fZVRfmxvr7YBodF4jSczgKU6RoDUzvKnFiFz2mcuKgw1zYgvTGtLMBPAPonv5GzHnDXQK5Vk8BRHcN76TGgLwcNcFTy4kC';
1103
+ const userXpub = 'xpub661MyMwAqRbcG9dxXhJyHz4GjqTjUCAUMuF4tpCq3LTJf43QXa5sT81QsJ5VMdK8vnAK56gi7qy2cZ2dzYQfy7YP7x4uHQpuRViAv9CNbtS';
1104
+ const backupXprv = 'xprv9s21ZrQH143K4N6YBjooa6Tx3U7hzM3SvHFA8XP23qYhQ6KPLo2QgXTSasVpiMY4F6gMrstXBHRDso5WE7Gn37yZnW5qTRJZU6FPeXx1B69';
1105
+ const backupXpub = 'xpub661MyMwAqRbcGrB1HmLowEQgbVxCPomJHWAkvundcB5gGteXtLLfEKmvSB9dKvRmh3LxpL2yvgqy37Z3ydqvHoViMWa2dwX3huwmmBuip7J';
1106
+ const walletContractAddress = '0xe0b1fe098050f2745b450de419b5cafc7e826699';
1107
+ const recoveryDestination = '0x94b51ebb8c3b90404ad262f42c1588bd94242ecb';
1108
+ const gasPrice = '25000000000';
1109
+ it('should build unsigned sweep tx', async function () {
1110
+ const recovery = await tavaxCoin.recover({
1111
+ userKey: userXpub,
1112
+ backupKey: backupXpub,
1113
+ walletContractAddress,
1114
+ recoveryDestination,
1115
+ gasPrice,
1116
+ });
1117
+ const parsedTx = (0, helpers_1.parseTransaction)(recovery.txHex);
1118
+ const decodedSendMultisigCallData = (0, helpers_1.decodeTransaction)(JSON.stringify(helpers_1.walletSimpleABI), parsedTx.data);
1119
+ const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
1120
+ const safeTransferFromDestination = decodedSendMultisigCallData.args[0];
1121
+ safeTransferFromDestination.toLowerCase().should.equal(recoveryDestination);
1122
+ safeTransferFromCallData.should.be.equal('0x');
1123
+ recovery.should.not.be.undefined();
1124
+ recovery.should.have.properties('txHex', 'userKey', 'backupKey');
1125
+ recovery.recipients.length.should.equal(1);
1126
+ recovery.recipients[0].address.should.equal(recoveryDestination);
1127
+ recovery.walletContractAddress.should.equal(walletContractAddress);
1128
+ });
1129
+ it('should add a second signature', async function () {
1130
+ const recovery = await tavaxCoin.recover({
1131
+ userKey: userXpub,
1132
+ backupKey: backupXpub,
1133
+ walletContractAddress,
1134
+ recoveryDestination,
1135
+ gasPrice,
1136
+ });
1137
+ const txPrebuild = {
1138
+ txHex: recovery.txHex,
1139
+ userKey: userXpub,
1140
+ backupKey: backupXpub,
1141
+ coin: recovery.coin,
1142
+ gasPrice: recovery.gasPrice,
1143
+ gasLimit: recovery.gasLimit,
1144
+ recipients: recovery.recipients,
1145
+ walletContractAddress: recovery.walletContractAddress,
1146
+ amount: recovery.amount,
1147
+ backupKeyNonce: recovery.backupKeyNonce,
1148
+ recipient: recovery.recipient,
1149
+ expireTime: recovery.expireTime,
1150
+ contractSequenceId: recovery.contractSequenceId,
1151
+ nextContractSequenceId: recovery.nextContractSequenceId,
1152
+ };
1153
+ const params = {
1154
+ txPrebuild,
1155
+ prv: userXprv,
1156
+ };
1157
+ // sign transaction once
1158
+ const halfSigned = await tavaxCoin.signTransaction(params);
1159
+ const wrapper = {};
1160
+ wrapper.txPrebuild = halfSigned;
1161
+ wrapper.isLastSignature = true;
1162
+ wrapper.walletContractAddress = walletContractAddress;
1163
+ wrapper.prv = backupXprv;
1164
+ // sign transaction twice with the "isLastSignature" flag
1165
+ const finalSignedTx = await tavaxCoin.signTransaction(wrapper);
1166
+ finalSignedTx.should.have.property('txHex');
1167
+ const txBuilder = tavaxCoin.getTransactionBuilder();
1168
+ txBuilder.from(finalSignedTx.txHex);
1169
+ const rebuiltTx = await txBuilder.build();
1170
+ rebuiltTx.signature.length.should.equal(2);
1171
+ rebuiltTx.outputs.length.should.equal(1);
1172
+ rebuiltTx.outputs[0].address.should.equal(txPrebuild.recipient.address);
1173
+ rebuiltTx.outputs[0].value.should.equal(txPrebuild.recipient.amount);
1174
+ });
1175
+ });
1176
+ describe('Token Recovery', async function () {
1177
+ const destAddr = '0xc74b1c0ee90a481b528253042ce3228a8cd6873e';
1178
+ const weiToGwei = 10 ** 9;
1179
+ const gasPrice = 30 * weiToGwei;
1180
+ // contract address for 'tavaxc:link'
1181
+ const tokenContractAddress = '0x0b9d5d9136855f6fec3c0993fee6e9ce8a297846';
1182
+ const tokenName = 'tavaxc:link';
1183
+ it('should build token recovery tx', async function () {
1184
+ const params = {
1185
+ userKey: avaxc_1.recoveryUsers.hotWalletRecoveryUser.userKey,
1186
+ backupKey: avaxc_1.recoveryUsers.hotWalletRecoveryUser.backupKey,
1187
+ recoveryDestination: destAddr,
1188
+ walletPassphrase: avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletPassphrase,
1189
+ walletContractAddress: avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress,
1190
+ tokenContractAddress,
1191
+ gasPrice: gasPrice.toString(),
1192
+ };
1193
+ const recoveryTxn = await tavaxCoin.recover(params);
1194
+ recoveryTxn.should.not.be.undefined();
1195
+ recoveryTxn.should.have.property('id');
1196
+ recoveryTxn.should.have.property('tx');
1197
+ const txBuilder = tavaxCoin.getTransactionBuilder();
1198
+ txBuilder.from(recoveryTxn.tx);
1199
+ const tx = await txBuilder.build();
1200
+ tx.toBroadcastFormat().should.not.be.empty();
1201
+ tx.inputs.should.not.be.empty();
1202
+ tx.inputs[0].address.should.equal(avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress);
1203
+ tx.inputs[0].value.should.equal(new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10));
1204
+ tx.inputs[0].coin?.should.equal(tokenName);
1205
+ tx.outputs.should.not.be.empty();
1206
+ tx.outputs[0].address.should.equal(destAddr);
1207
+ tx.outputs[0].value.should.equal(new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10));
1208
+ tx.outputs[0].coin?.should.equal(tokenName);
1209
+ });
1210
+ it('should build unsigned sweep token recovery tx', async function () {
1211
+ const params = {
1212
+ userKey: avaxc_1.recoveryUsers.coldWalletRecoveryUser.userKey,
1213
+ backupKey: avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKey,
1214
+ recoveryDestination: destAddr,
1215
+ walletPassphrase: avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletPassphrase,
1216
+ walletContractAddress: avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress,
1217
+ tokenContractAddress,
1218
+ gasPrice: gasPrice.toString(),
1219
+ };
1220
+ const recoveryTxn = await tavaxCoin.recover(params);
1221
+ recoveryTxn.should.not.be.undefined();
1222
+ recoveryTxn.should.have.property('txHex');
1223
+ recoveryTxn.should.have.property('token');
1224
+ recoveryTxn.token.should.equal('tavaxc:link');
1225
+ const txBuilder = tavaxCoin.getTransactionBuilder();
1226
+ txBuilder.from(recoveryTxn.txHex);
1227
+ const tx = await txBuilder.build();
1228
+ const recoveryAmount = new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10);
1229
+ tx.toBroadcastFormat().should.not.be.empty();
1230
+ tx.inputs.should.not.be.empty();
1231
+ tx.inputs[0].address.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress);
1232
+ tx.inputs[0].value.should.equal(recoveryAmount);
1233
+ tx.inputs[0].should.have.property('coin');
1234
+ tx.inputs[0].coin?.should.equal(tokenName);
1235
+ tx.outputs.should.not.be.empty();
1236
+ tx.outputs[0].address.should.equal(destAddr);
1237
+ tx.outputs[0].value.should.equal(new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10));
1238
+ tx.outputs[0].should.have.property('coin');
1239
+ tx.outputs[0].coin?.should.equal(tokenName);
1240
+ recoveryTxn.should.have.property('userKey');
1241
+ recoveryTxn.userKey.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.userKey);
1242
+ recoveryTxn.should.have.property('backupKey');
1243
+ recoveryTxn.backupKey.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKey);
1244
+ recoveryTxn.should.have.property('coin');
1245
+ recoveryTxn.coin.should.equal('tavaxc');
1246
+ recoveryTxn.should.have.property('gasPrice');
1247
+ recoveryTxn.gasPrice.should.equal(gasPrice.toString());
1248
+ recoveryTxn.should.have.property('gasLimit');
1249
+ recoveryTxn.gasLimit.should.equal('500000');
1250
+ recoveryTxn.should.have.property('recipients');
1251
+ recoveryTxn.recipients.length.should.equal(1);
1252
+ recoveryTxn.recipients[0].address.should.equal(destAddr);
1253
+ recoveryTxn.recipients[0].amount.should.equal(recoveryAmount);
1254
+ recoveryTxn.should.have.property('walletContractAddress');
1255
+ recoveryTxn.walletContractAddress.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress);
1256
+ recoveryTxn.should.have.property('amount');
1257
+ recoveryTxn.amount.should.equal(recoveryAmount);
1258
+ recoveryTxn.should.have.property('recipient');
1259
+ recoveryTxn.recipient.address.should.equal(destAddr);
1260
+ recoveryTxn.recipient.amount.should.equal(recoveryAmount);
1261
+ recoveryTxn.should.have.property('tokenContractAddress');
1262
+ recoveryTxn.tokenContractAddress.should.equal(tokenContractAddress);
1263
+ recoveryTxn.should.have.property('backupKeyNonce');
1264
+ recoveryTxn.should.have.property('expireTime');
1265
+ recoveryTxn.should.have.property('contractSequenceId');
1266
+ recoveryTxn.should.have.property('nextContractSequenceId');
1267
+ });
1268
+ });
1269
+ });
1270
+ });
1271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZheGMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvYXZheGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBK0Q7QUFDL0QsaURBQStDO0FBQy9DLG1DQUE4RDtBQUM5RCw2Q0FBMEM7QUFDMUMscURBQXVDO0FBQ3ZDLHFEQUE4QztBQUM5QywyQ0FBNkI7QUFDN0IsbURBQXVFO0FBQ3ZFLDJEQUE2RDtBQUU3RCwrQ0FBaUM7QUFDakMsOENBQTBGO0FBQzFGLCtEQUFvRDtBQUNwRCx1Q0FBaUY7QUFDakYsNkNBQStCO0FBQy9CLHFEQUFxQztBQUdyQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUV4QixRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksU0FBUyxDQUFDO0lBQ2QsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLG1CQUFtQixDQUFDO0lBQ3hCLElBQUkseUJBQXlCLENBQUM7SUFFOUIsTUFBTSxRQUFRLEdBQUcsNENBQTRDLENBQUM7SUFDOUQsTUFBTSxRQUFRLEdBQUcsNENBQTRDLENBQUM7SUFDOUQsTUFBTSxrQkFBa0IsR0FBRyw0Q0FBNEMsQ0FBQztJQUN4RSxNQUFNLHFCQUFxQixHQUFHLDRDQUE0QyxDQUFDO0lBQzNFLE1BQU0sS0FBSyxHQUNULDhOQUE4TixDQUFDO0lBQ2pPLE1BQU0sT0FBTyxHQUFHLG9FQUFvRSxDQUFDO0lBQ3JGLE1BQU0sVUFBVSxHQUNkLG9JQUFvSSxDQUFDO0lBQ3ZJLE1BQU0sV0FBVyxHQUNmLGtzQkFBa3NCLENBQUM7SUFDcnNCLE1BQU0sYUFBYSxHQUFHLG9FQUFvRSxDQUFDO0lBRTNGLE1BQU0sQ0FBQztRQUNMLE1BQU0sWUFBWSxHQUNoQixpSEFBaUgsQ0FBQztRQUNwSCxNQUFNLFFBQVEsR0FBRyxpQkFBSyxDQUFDLFVBQVUs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QUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgQXZheEMsIFRhdmF4QywgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuL2dldEJ1aWxkZXInO1xuaW1wb3J0ICogYXMgc2VjcDI1NmsxIGZyb20gJ3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgKiBhcyBub2NrIGZyb20gJ25vY2snO1xuaW1wb3J0IHsgY29tbW9uLCBUcmFuc2FjdGlvblR5cGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEV0aCwgb3B0aW9uYWxEZXBzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvaW4tZXRoJztcbmltcG9ydCB7IEF2YXhTaWduVHJhbnNhY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vc3JjL2lmYWNlJztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgRVhQT1JUX0MsIElNUE9SVF9DLCBlbmRwb2ludFJlc3BvbnNlcywgcmVjb3ZlcnlVc2VycyB9IGZyb20gJy4uL3Jlc291cmNlcy9hdmF4Yyc7XG5pbXBvcnQgeyBUYXZheFAgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29pbi1hdmF4cCc7XG5pbXBvcnQgeyBkZWNvZGVUcmFuc2FjdGlvbiwgcGFyc2VUcmFuc2FjdGlvbiwgd2FsbGV0U2ltcGxlQUJJIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCB7IEV0aGVyZXVtTmV0d29yayB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5ub2NrLmVuYWJsZU5ldENvbm5lY3QoKTtcblxuZGVzY3JpYmUoJ0F2YWxhbmNoZSBDLUNoYWluJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IHRhdmF4Q29pbjtcbiAgbGV0IGF2YXhDb2luO1xuICBsZXQgaG9wVHhCaXRnb1NpZ25hdHVyZTtcbiAgbGV0IGhvcEV4cG9ydFR4Qml0Z29TaWduYXR1cmU7XG5cbiAgY29uc3QgYWRkcmVzczEgPSAnMHgxNzRjZmQ4MjNhZjhjZTI3ZWQwYWZlZTNmY2YzYzNiYTI1OTExNmJlJztcbiAgY29uc3QgYWRkcmVzczIgPSAnMHg3ZTg1YmRjMjdjMDUwZTM5MDVlYmY0YjhlNjM0ZDlhZDZlZGQwZGU2JztcbiAgY29uc3QgaG9wQ29udHJhY3RBZGRyZXNzID0gJzB4NDdjZTdjYzg2ZWZlZmVmMTlmOGZiNTE2YjExNzM1ZDE4M2RhODYzNSc7XG4gIGNvbnN0IGhvcERlc3RpbmF0aW9uQWRkcmVzcyA9ICcweDljN2U4Y2U2ODI1YkQ0ODI3OEIzQWI1OTIyOEVFMjZmOEJFNzkyNWInO1xuICBjb25zdCBob3BUeCA9XG4gICAgJzB4Zjg2YjgwODUwNGE4MTdjOGZmODI1MmZmOTQ5YzdlOGNlNjgyNWJkNDgyNzhiM2FiNTkyMjhlZTI2ZjhiZTc5MjViODcwMzhkN2VhNGM2ODAwMDgwMWNhMDExYmMyMmM2NjQ1NzAxMzNkZmNhNGYwOGEwYjhkMDIzMzljZjQ2NzA0NmQ2YTQxNTJmMDRmMzY4ZDBlYWY5OWVhMDFkNmRjNWNmMGM4OTdjOGQ0YzNlMWRmNTNkMGQwNDI3ODRjNDI0NTM2YTRjYzViODAyNTUyYjdkNjRmZWU4YjUnO1xuICBjb25zdCBob3BUeGlkID0gJzB4NGFmNjUxNDNiYzc3ZGEyYjUwZjM1YjNkMTNjYWNiNGRiMThmMDI2YmY4NGJjMDc0MzU1MGJjNTdiOWI1MzM1MSc7XG4gIGNvbnN0IHVzZXJSZXFTaWcgPVxuICAgICcweDQwNGRiMzA3ZjYxNDdmMGQ4Y2QzMzhjMzRjMTM5MDZlZjQ2YTZmYWE3ZTBlMTE5ZDUxOTRlZjA1YWVjMTZlNmYzZDcxMGY5Yjc5MDE0NjBmOTdlOTI0MDY2YjYyZWZkNzQ0NDNiZDM0NDAyYzZkNDBiNDljMjAzYTU1OWZmMmM4JztcbiAgY29uc3QgaG9wRXhwb3J0VHggPVxuICAgICcweDAwMDAwMDAwMDAwMTAwMDAwMDA1N2ZjOTNkODVjNmQ2MmM1YjJhYzBiNTE5Yzg3MDEwZWE1Mjk0MDEyZDFlNDA3MDMwZDZhY2QwMDIxY2FjMTBkNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTFmZTNkZTc4ODZiZTllNTMwNzJkNjc2MmU5ZmExZmMyN2RkZGZiMDUwMDAwMDAwMDA2MTQ2NWIyM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNzAwMDAwMDAwMDYwNTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzhiMmNlMzM4MTAwM2ZkZjg2OTAwMjgwYTRlYzg2YjM4NGI1ZDVjOTliN2ZjMWY2NTIyMGI5YTBiMmY0MzE1NzhiOGJiNmVlMTMwYmY1NjNhZjFmYWIxNTAzMTM1ZmJkNDIzZTQ0MmQ1ZTliNzNhYmQ1NjIyZmUwMjAwMDAwMDAxMDAwMDAwMDkwMDAwMDAwMWFmMjAwNjYxOTdmYTNiNzJiZWEzZDdjYzUwM2M2MDkxOGMwOTgzNzhiOTU4ZmJiNWRhOGM2ZjQzOGQwZjRlMzgwZTUwNmJiMmMzOGRjODhkZDk3YzgxZTk4MjcwNmM0ODYyMzkzN2MyZmUyMmIzMTI0OGVkOWZkMzQ5NTE0ODBiMDE3M2I0ZTljYSc7XG4gIGNvbnN0IGhvcEV4cG9ydFR4SWQgPSAnMHhjNGI1Y2E2ZTdkOGM5YzI0YmI5OTM0YWZjYjVjODdlNmRiNDcyZGJlMzExMTFiNzc4NDQ1ZjhmOWM1MzUyOTY2JztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJpdGdvS2V5WHBydiA9XG4gICAgICAneHBydjlzMjFaclFIMTQzSzN0cFdCSFdlMzFzTG9YTlJROUF2UllKZ2l0a0t4UTRBVEZRTXd2cjdoSE5xWVJVblM3UHNqekI3YUsxVnhxSEx1TlFqajFzY2tKMkp3bzJxeG1zdmVqd0VDU3BGTWZDJztcbiAgICBjb25zdCBiaXRnb0tleSA9IGJpcDMyLmZyb21CYXNlNTgoYml0Z29LZXlYcHJ2KTtcbiAgICBpZiAoIWJpdGdvS2V5LnByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcHJpdmF0ZUtleScpO1xuICAgIH1cbiAgICBjb25zdCBiaXRnb1hwdWIgPSBiaXRnb0tleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG5cbiAgICBob3BUeEJpdGdvU2lnbmF0dXJlID1cbiAgICAgICcweGFhJyArXG4gICAgICBCdWZmZXIuZnJvbShzZWNwMjU2azEuZWNkc2FTaWduKEJ1ZmZlci5mcm9tKGhvcFR4aWQuc2xpY2UoMiksICdoZXgnKSwgYml0Z29LZXkucHJpdmF0ZUtleSkuc2lnbmF0dXJlKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG5cbiAgICBob3BFeHBvcnRUeEJpdGdvU2lnbmF0dXJlID1cbiAgICAgICcweGFhJyArXG4gICAgICBCdWZmZXIuZnJvbShcbiAgICAgICAgc2VjcDI1NmsxLmVjZHNhU2lnbihCdWZmZXIuZnJvbShob3BFeHBvcnRUeElkLnNsaWNlKDIpLCAnaGV4JyksIGJpdGdvS2V5LnByaXZhdGVLZXkpLnNpZ25hdHVyZVxuICAgICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBlbnYgPSAndGVzdCc7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52IH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcignYXZheGMnLCBBdmF4Qy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YXZheGMnLCBUYXZheEMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGV0aCcsIEV0aC5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YXZheHAnLCBUYXZheFAuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLmhzbVhwdWIgPSBiaXRnb1hwdWI7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gIH0pO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHRhdmF4Q29pbiA9IGJpdGdvLmNvaW4oJ3RhdmF4YycpIGFzIFRhdmF4QztcbiAgICBhdmF4Q29pbiA9IGJpdGdvLmNvaW4oJ2F2YXhjJykgYXMgQXZheEM7XG4gIH0pO1xuXG4gIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdJbnN0YW50aWF0ZSAmIFN0YXRpY3MnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbigndGF2YXhjJyk7XG4gICAgICBsb2NhbEJhc2Vjb2luLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKFRhdmF4Qyk7XG5cbiAgICAgIGxvY2FsQmFzZWNvaW4gPSBiaXRnby5jb2luKCdhdmF4YycpO1xuICAgICAgbG9jYWxCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihBdmF4Qyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBob3AgZGlnZXN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZGlnZXN0ID0gQXZheEMuZ2V0SG9wRGlnZXN0KFsnMScsICcyJywgJzMnXSk7XG4gICAgICBkaWdlc3QudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCgnMjMxY2RhNWYwNTBjODQxMzIyYjlkZjUzNmFmYjYzM2NhMDYyNDAwYThmMzkzYmY2NTRhNDhiZGQxZGZkODI1YicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnS2V5UGFpcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHRhdmF4IGtleVBhaXIgd2l0aG91dCBhZ3VtZW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGtwID0gdGF2YXhDb2luLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAga3Auc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICAgICAga3Auc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhdmF4IGtleVBhaXIgd2l0aG91dCBhZ3VtZW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGtwID0gYXZheENvaW4uZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICBrcC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJ2Jyk7XG4gICAgICBrcC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHViJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGF2YXgga2V5UGFpciBmcm9tIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0gJzRiM2I4OWY2Y2E4OTdjYjcyOWQyMTQ2OTEzODc3ZjcxJztcbiAgICAgIGNvbnN0IHRBdmF4S2V5UGFpciA9IHRhdmF4Q29pbi5nZW5lcmF0ZUtleVBhaXIoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IGF2YXhLZXlQYWlyID0gYXZheENvaW4uZ2VuZXJhdGVLZXlQYWlyKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgICB0QXZheEtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICAgICAgdEF2YXhLZXlQYWlyLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwdWInKTtcbiAgICAgIHRBdmF4S2V5UGFpci5wcnYuc2hvdWxkLmVxdWFscyhcbiAgICAgICAgJ3hwcnY5czIxWnJRSDE0M0syTUpFMXl2VjhVaGpmTFFjYURQUGlwTVl2ZllqclBiSExwdExzbnQxRmJiQ3JDVDlFNUxDbVJyUzU5M1laMUNLZ2YzcmYzQzJoWVR5blpONWF1M1Z2QnZMY1doOHNWMidcbiAgICAgICk7XG4gICAgICB0QXZheEtleVBhaXIucHViIS5zaG91bGQuZXF1YWxzKFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0VxTmg4MVRWVmNlVURORjZ5ZzdGNjNIOWozeE1RajhHRGREVlJMQ0ZvUHVnaFNkZ0dzNFgxbjg5aVBYRktQTXkzZjQ1WTdFNjNrWEdBWkt1WjFmaExxc0t0a29CM3laJ1xuICAgICAgKTtcbiAgICAgIHRBdmF4S2V5UGFpci5zaG91bGQuZGVlcEVxdWFsKGF2YXhLZXlQYWlyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2tleXMgdmFsaWRhdGlvbnMgc3VjY2VzcyBjYXNlcycsICgpID0+IHtcbiAgICBpdCgndmFsaWRhdGUgdmFsaWQgZXRoIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5jb21wcmVzc2VkUHVibGljS2V5ID1cbiAgICAgICAgJzA0M0JFNjUwRTJDMTFGMzZEMjAxQzkxNzNCRTM3QkMwMjhBRjQ5NUNGNzhDQTA1Rjc4RkVFMTkyRjVEMzM5QTlFMjI3ODc0RTgwNzUzNTM1NjREODMwNDc1NjZFRUE2Q0Y1QTczMTM4MTZBRjAwNEREQThDQTUyOURFOEM5NEJDNkEnO1xuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIodW5jb21wcmVzc2VkUHVibGljS2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1Yih1bmNvbXByZXNzZWRQdWJsaWNLZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgdmFsaWQgZXRoIGNvbXByZXNzZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRQdWJsaWNLZXkgPSAnMDIzQkU2NTBFMkMxMUYzNkQyMDFDOTE3M0JFMzdCQzAyOEFGNDk1Q0Y3OENBMDVGNzhGRUUxOTJGNUQzMzlBOUUyJztcbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKGNvbXByZXNzZWRQdWJsaWNLZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKGNvbXByZXNzZWRQdWJsaWNLZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgdmFsaWQgZXh0ZW5kZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkUHVibGljS2V5ID1cbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNFcU5oODFUVlZjZVVETkY2eWc3RjYzSDlqM3hNUWo4R0RkRFZSTENGb1B1Z2hTZGdHczRYMW44OWlQWEZLUE15M2Y0NVk3RTYza1hHQVpLdVoxZmhMcXNLdGtvQjN5Wic7XG4gICAgICB0YXZheENvaW4uaXNWYWxpZFB1YihleHRlbmRlZFB1YmxpY0tleSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIoZXh0ZW5kZWRQdWJsaWNLZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgdmFsaWQgZXRoIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4MTM3NGEyMDQ2NjYxZjkxNGQxNjg3ZDg1ZGJiY2ViOWFjNzkxMGEyOSc7XG4gICAgICB0YXZheENvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFuIGFycmF5IG9mIHAtY2hhaW4gYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IFtcbiAgICAgICAgJ1AtZnVqaTE1eDN6NHJ2azhlN3Z3YTZnOWxreWc4OXY1ZHdrbnA0NDg1OHVleCcsXG4gICAgICAgICdQLWF2YXgxNDNxOGxzeTN5NGtlOWQ2emVsdHJlOHUyYXRlZWQ2dWs5a2EwbnUnLFxuICAgICAgICAnTm9kZUlELTE0M3E4bHN5M3k0a2U5ZDZ6ZWx0cmU4dTJhdGVlZDZ1azlrYTBudScsXG4gICAgICBdO1xuXG4gICAgICB0YXZheENvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgcC1jaGFpbiBtdWx0c2lnIGFkZHJlc3Mgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9XG4gICAgICAgICdQLWZ1amkxeXpwZnNkYWxoZndrcTJjZWV3Z3M5d3Y3azB1ZnQ0MHlkcHVqNTl+UC1mdWppMTAzY21udHNzcDZxbnVjZWphaGRkeTQyd2N5NHF0eTB1ajQyODIyflAtZnVqaTFoZGs3bnR3MGh1aHFtbGhsaGVtZTl0N3Njc3k5bGhmaHczeXd5NCc7XG4gICAgICB0YXZheENvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdrZXlzIHZhbGlkYXRpb25zIGZhaWx1cmUgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3ZhbGlkYXRlIGVtcHR5IGV0aCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIoJycpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1YignJykuc2hvdWxkLmJlLmZhbHNlKCk7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZW1wdHkgZXRoIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICB0YXZheENvaW4uaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5IHRvbyBzaG9ydCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleSA9XG4gICAgICAgICcwNDNCRTY1MEUyQzExRjM2RDIwMUM5MTczQkUzN0JDMDI4QUY0OTVDRjc4Q0EwNUY3OEZFRTE5MkY1RDMzOUE5RTIyNzg3NEU4MDc1MzUzNTY0RDgzMDQ3NTY2RUVBNkNGNUE3MzEzODE2QUYwMDREREE4Q0E1MjlERThDOTRCQzZBJztcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIodW5jb21wcmVzc2VkUHVibGljS2V5LnNsaWNlKDEpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIodW5jb21wcmVzc2VkUHVibGljS2V5LnNsaWNlKDEpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggY29tcHJlc3NlZCBwdWJsaWMga2V5IHRvbyBzaG9ydCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRQdWJsaWNLZXkgPSAnMDIzQkU2NTBFMkMxMUYzNkQyMDFDOTE3M0JFMzdCQzAyOEFGNDk1Q0Y3OENBMDVGNzhGRUUxOTJGNUQzMzlBOUUyJztcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIoY29tcHJlc3NlZFB1YmxpY0tleS5zbGljZSgxKSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKGNvbXByZXNzZWRQdWJsaWNLZXkuc2xpY2UoMSkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGludmFsaWQgZXh0ZW5kZWQgcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFB1YmxpY0tleSA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRXFOaDgxVFZWY2VVRE5GNnlnN0Y2M0g5ajN4TVFqOEdEZERWUkxDRm9QdWdoU2RnR3M0WDFuODlpUFhGS1BNeTNmNDVZN0U2M2tYR0FaS3VaMWZoTHFzS3Rrb0IzeVonO1xuXG4gICAgICB0YXZheENvaW4uaXNWYWxpZFB1YihleHRlbmRlZFB1YmxpY0tleS5zdWJzdHIoMCwgZXh0ZW5kZWRQdWJsaWNLZXkubGVuZ3RoIC0gMSkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1YihleHRlbmRlZFB1YmxpY0tleS5zdWJzdHIoMCwgZXh0ZW5kZWRQdWJsaWNLZXkubGVuZ3RoIC0gMSkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBhZGRyZXNzIHRvbyBzaG9ydCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnMHgxMzc0YTIwNDY2NjFmOTE0ZDE2ODdkODVkYmJjZWI5YWM3OTEwYTI5JztcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3Muc2xpY2UoMSkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5zbGljZSgxKSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5IHRvbyBsb25nJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5jb21wcmVzc2VkUHVibGljS2V5ID1cbiAgICAgICAgJzA0M0JFNjUwRTJDMTFGMzZEMjAxQzkxNzNCRTM3QkMwMjhBRjQ5NUNGNzhDQTA1Rjc4RkVFMTkyRjVEMzM5QTlFMjI3ODc0RTgwNzUzNTM1NjREODMwNDc1NjZFRUE2Q0Y1QTczMTM4MTZBRjAwNEREQThDQTUyOURFOEM5NEJDNkEnO1xuXG4gICAgICB0YXZheENvaW4uaXNWYWxpZFB1Yih1bmNvbXByZXNzZWRQdWJsaWNLZXkgKyAnMDAnKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIodW5jb21wcmVzc2VkUHVibGljS2V5ICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIGNvbXByZXNzZWQgcHVibGljIGtleSB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRQdWJsaWNLZXkgPSAnMDIzQkU2NTBFMkMxMUYzNkQyMDFDOTE3M0JFMzdCQzAyOEFGNDk1Q0Y3OENBMDVGNzhGRUUxOTJGNUQzMzlBOUUyJztcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIoY29tcHJlc3NlZFB1YmxpY0tleSArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1Yihjb21wcmVzc2VkUHVibGljS2V5ICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXh0ZW5kZWQgcHVibGljIGtleSB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkUHVibGljS2V5ID1cbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNFcU5oODFUVlZjZVVETkY2eWc3RjYzSDlqM3hNUWo4R0RkRFZSTENGb1B1Z2hTZGdHczRYMW44OWlQWEZLUE15M2Y0NVk3RTYza1hHQVpLdVoxZmhMcXNLdGtvQjN5Wic7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKGV4dGVuZGVkUHVibGljS2V5ICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKGV4dGVuZGVkUHVibGljS2V5ICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIGFkZHJlc3MgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4MTM3NGEyMDQ2NjYxZjkxNGQxNjg3ZDg1ZGJiY2ViOWFjNzkxMGEyOSc7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTaWduIFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IGFjY291bnRfMSA9IHtcbiAgICAgIGFkZHJlc3M6ICcweGVlYWYwRjA1ZjM3ODkxYWI0YTIxMjA4QjEwNUEwNjg3ZDEyYzVhRjcnLFxuICAgICAgb3duZXJfMTogJzRlZTA4OWFjZWFiZjNkZGJmNzQ4ZGI3OWIxMDY2YzMzYjdkM2VhMWFiM2ViN2UzMjUxMjFiYmEyYmZmMmY1Y2EnLFxuICAgICAgb3duZXJfMjogJzVjYTExNmQyNWFlYzVmNzY1NDY1NDMyY2M0MjFmZjI1ZWY5ZmZkYzMzMGIxMGJiM2Q5YWQ2MWUzYmFhZDg4ZDcnLFxuICAgICAgb3duZXJfMzogJzFmYWU5NDZjYzg0YWY4YmQ3NGQ2MTBhODg1MzdlMjRlMTljMzM0OWQ0NzhkODZmYzViYjU5YmE0Yzg4ZmI5Y2MnLFxuICAgIH07XG5cbiAgICBjb25zdCBhY2NvdW50XzIgPSB7XG4gICAgICBhZGRyZXNzOiAnMHg4Q2U1OWMyZDE3MDI4NDRGOEVkRUQ0NTFBQTEwMzk2MWJDMzdCNGU4JyxcbiAgICAgIG93bmVyXzE6ICc0ZWUwODlhY2VhYmYzZGRiZjc0OGRiNzliMTA2NmMzM2I3ZDNlYTFhYjNlYjdlMzI1MTIxYmJhMmJmZjJmNWNhJyxcbiAgICAgIG93bmVyXzI6ICc1YzdlNGVmZmY3MzA0ZDRkZmZmNmQ1ZjE1OTE4NDRlYzZmMmFkZmE2YTQ3ZTlmZWNlNmEzYzFhNGQ3NTVmMWUzJyxcbiAgICAgIG93bmVyXzM6ICc0NDIxYWIyNWRkOTFlMWEzMTgwZDAzZDU3YzMyM2E3ODg2ZGNjMzEzZDNiM2E0YjQyNTZhNTc5MTU3MmJmNTk3JyxcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgcmVjaXBpZW50cyBmcm9tIHR4UHJlYnVpbGQgd2hlbiBhdmFpbGFibGUgaW5jbHVkaW5nIGRhdGEgZmllbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZ2V0QnVpbGRlcigndGF2YXhjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgYnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYnVpbGRlci5jb250cmFjdChhY2NvdW50XzEuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnRyYW5zZmVyKCkuYW1vdW50KCcxJykudG8oYWNjb3VudF8yLmFkZHJlc3MpLmV4cGlyYXRpb25UaW1lKDEwMDAwKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBUZXN0IHdpdGggcmVjaXBpZW50cyBpbiB0eFByZWJ1aWxkIGluY2x1ZGluZyBkYXRhIGZpZWxkXG4gICAgICBjb25zdCBjdXN0b21SZWNpcGllbnRzID0gW1xuICAgICAgICB7IGFkZHJlc3M6ICcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLCBhbW91bnQ6ICc1MDAnLCBkYXRhOiAnMHhhOTA1OWNiYicgfSxcbiAgICAgICAgeyBhZGRyZXNzOiAnMHgwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxJywgYW1vdW50OiAnMzAwJywgZGF0YTogJzB4MjNiODcyZGQnIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkUmF3VHggPSBhd2FpdCB0YXZheENvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4OiB1bnNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nLFxuICAgICAgICAgIHJlY2lwaWVudHM6IGN1c3RvbVJlY2lwaWVudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogYWNjb3VudF8xLm93bmVyXzIsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2hvdWxkIHVzZSByZWNpcGllbnRzIGZyb20gdHhQcmVidWlsZCwgbm90IGZyb20gdHJhbnNhY3Rpb24gb3V0cHV0c1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50cy5sZW5ndGguc2hvdWxkLmVxdWFscygyKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWxzKGN1c3RvbVJlY2lwaWVudHNbMF0uYWRkcmVzcyk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWxzKGN1c3RvbVJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHNbMF0uZGF0YS5zaG91bGQuZXF1YWxzKGN1c3RvbVJlY2lwaWVudHNbMF0uZGF0YSk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFscyhjdXN0b21SZWNpcGllbnRzWzFdLmFkZHJlc3MpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50c1sxXS5hbW91bnQuc2hvdWxkLmVxdWFscyhjdXN0b21SZWNpcGllbnRzWzFdLmFtb3VudCk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzWzFdLmRhdGEuc2hvdWxkLmVxdWFscyhjdXN0b21SZWNpcGllbnRzWzFdLmRhdGEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFuIHVuc2lnbmVkIHRlc3QgdHggd2l0aCBlaXAxNTU5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgICAgZWlwMTU1OToge1xuICAgICAgICAgIG1heEZlZVBlckdhczogJzc1OTMxMjMnLFxuICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMTUwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgYnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGJ1aWxkZXIuY29udHJhY3QoYWNjb3VudF8xLmFkZHJlc3MpO1xuICAgICAgYnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnMScpLnRvKGFjY291bnRfMi5hZGRyZXNzKS5leHBpcmF0aW9uVGltZSgxMDAwMCkuY29udHJhY3RTZXF1ZW5jZUlkKDEpO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFJhd1R4ID0gYXdhaXQgdGF2YXhDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyxcbiAgICAgICAgICBlaXAxNTU5OiB7XG4gICAgICAgICAgICBtYXhGZWVQZXJHYXM6ICc3NTkzMTIzJyxcbiAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMTUwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwcnY6IGFjY291bnRfMS5vd25lcl8yLFxuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkZXIudHJhbnNmZXIoKS5rZXkoYWNjb3VudF8xLm93bmVyXzIpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nID0gaGFsZlNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnR4SGV4LnNob3VsZC5lcXVhbHMoaGFsZlNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbHMoMSk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzWzBdLmFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWxzKGFjY291bnRfMi5hZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50c1swXS5hbW91bnQudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWxzKCcxJyk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5laXAxNTU5Lm1heEZlZVBlckdhcy5zaG91bGQuZXF1YWwoJzc1OTMxMjMnKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMuc2hvdWxkLmVxdWFsKCcxNTAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJlc2VydmUgZGF0YSBmaWVsZCBmcm9tIHR4UHJlYnVpbGQgcmVjaXBpZW50cyBmb3IgY29udHJhY3QgaW50ZXJhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ2F2YXhjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgYnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYnVpbGRlci5jb250cmFjdChhY2NvdW50XzEuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnRyYW5zZmVyKCkuYW1vdW50KCcxJykudG8oYWNjb3VudF8yLmFkZHJlc3MpLmV4cGlyYXRpb25UaW1lKDEwMDAwKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBUZXN0IHdpdGggY29tcGxleCBjb250cmFjdCBpbnRlcmFjdGlvbiBkYXRhXG4gICAgICBjb25zdCBjb250cmFjdENhbGxEYXRhID1cbiAgICAgICAgJzB4YTkwNTljYmIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZjEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGRlMGI2YjNhNzY0MDAwMCc7XG4gICAgICBjb25zdCBjdXN0b21SZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJzB4MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCcsXG4gICAgICAgICAgYW1vdW50OiAnMCcsIC8vIENvbnRyYWN0IGNhbGwgd2l0aCAwIHZhbHVlXG4gICAgICAgICAgZGF0YTogY29udHJhY3RDYWxsRGF0YSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGhhbGZTaWduZWRSYXdUeCA9IGF3YWl0IGF2YXhDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyxcbiAgICAgICAgICByZWNpcGllbnRzOiBjdXN0b21SZWNpcGllbnRzLFxuICAgICAgICB9LFxuICAgICAgICBwcnY6IGFjY291bnRfMS5vd25lcl8yLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3VsZCBwcmVzZXJ2ZSB0aGUgY29udHJhY3QgY2FsbCBkYXRhIGluIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWxzKDEpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbHMoY3VzdG9tUmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbHMoY3VzdG9tUmVjaXBpZW50c1swXS5hbW91bnQpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50c1swXS5kYXRhLnNob3VsZC5lcXVhbHMoY3VzdG9tUmVjaXBpZW50c1swXS5kYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBpc0JhdGNoLCBjb250cmFjdFNlcXVlbmNlSWQsIGFuZCBzZXF1ZW5jZUlkIGluIGhhbGYtc2lnbmVkIHR4UGFyYW1zIGZvciBiYXRjaCB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZ2V0QnVpbGRlcigndGF2YXhjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgYnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYnVpbGRlci5jb250cmFjdChhY2NvdW50XzEuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnRyYW5zZmVyKCkuYW1vdW50KCcxJykudG8oYWNjb3VudF8yLmFkZHJlc3MpLmV4cGlyYXRpb25UaW1lKDEwMDAwKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkUmF3VHggPSBhd2FpdCB0YXZheENvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4OiB1bnNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nLFxuICAgICAgICAgIGlzQmF0Y2g6IHRydWUsXG4gICAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogNDIsXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogYWNjb3VudF8xLm93bmVyXzIsXG4gICAgICAgIHNlcXVlbmNlSWQ6ICc3JyxcbiAgICAgIH0pO1xuXG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5pc0JhdGNoLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLmNvbnRyYWN0U2VxdWVuY2VJZC5zaG91bGQuZXF1YWwoNDIpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQuc2VxdWVuY2VJZC5zaG91bGQuZXF1YWwoJzcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFZlcmlmaWNhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIGhvcCB0eFByZWJ1aWxkIGZyb20gdGhlIGJpdGdvIHNlcnZlciB0aGF0IG1hdGNoZXMgdGhlIGNsaWVudCB0eFBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIHRhdmF4Q29pbiwge30pO1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwLCBhZGRyZXNzOiBob3BEZXN0aW5hdGlvbkFkZHJlc3MgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICc1MDAwMDAwMDAwMDAwMDAwJywgYWRkcmVzczogaG9wQ29udHJhY3RBZGRyZXNzIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgICAgaG9wVHJhbnNhY3Rpb246IHtcbiAgICAgICAgICB0eDogaG9wVHgsXG4gICAgICAgICAgaWQ6IGhvcFR4aWQsXG4gICAgICAgICAgc2lnbmF0dXJlOiBob3BUeEJpdGdvU2lnbmF0dXJlLFxuICAgICAgICAgIHBheW1lbnRJZDogJzI3NzM5MjgxOTYnLFxuICAgICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHJlY2lwaWVudDogaG9wRGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgIG5vbmNlOiAwLFxuICAgICAgICAgIHVzZXJSZXFTaWc6IHVzZXJSZXFTaWcsXG4gICAgICAgICAgZ2FzUHJpY2VNYXg6IDUwMDAwMDAwMDAwMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hvcCBleHBvcnQgdHggdmVyaWZ5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG4gICAgICBjb25zdCBob3BEZXN0aW5hdGlvbkFkZHJlc3MgPVxuICAgICAgICAnUC1mdWppMTN2a3d4d3FzcTA3bHM2Z3E5cTl5YWpydDhwOTQ2aHllNXpxM3czflAtZnVqaTE3OGF0ejVwM3hoYWFnZ2x5Z3QyN25kZTZoNHR6OWxzem53cTJkaH5QLWZ1amkxa2w3cDdlZnpwd2Rxa3Q2cno0dXQzd213dXljdDc0MzZxNmw5aDUnO1xuICAgICAgY29uc3QgaG9wQWRkcmVzcyA9ICcweDFmZTNkZTc4ODZiZTllNTMwNzJkNjc2MmU5ZmExZmMyN2RkZGZiMDUnO1xuICAgICAgY29uc3QgaW1wb3J0VHhGZWUgPSAxZTY7XG4gICAgICBjb25zdCBhbW91bnQgPSAxMDAwMDAwMDAwMDAwMDAwMDA7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50LCBhZGRyZXNzOiBob3BEZXN0aW5hdGlvbkFkZHJlc3MgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICAgIHR5cGU6ICdFeHBvcnQnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAyMDAwMDUwMDAwMDAwMDAwJywgYWRkcmVzczogaG9wQWRkcmVzcyB9XSxcbiAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICBpc0JhdGNoOiBmYWxzZSxcbiAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgIGhvcFRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgdHg6IGhvcEV4cG9ydFR4LFxuICAgICAgICAgIGlkOiBob3BFeHBvcnRUeElkLFxuICAgICAgICAgIHNpZ25hdHVyZTogaG9wRXhwb3J0VHhCaXRnb1NpZ25hdHVyZSxcbiAgICAgICAgICBwYXltZW50SWQ6ICc0OTMzMzQ5OTg0JyxcbiAgICAgICAgICBnYXNQcmljZTogJzUwJyxcbiAgICAgICAgICBnYXNMaW1pdDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDEwMDAwMDAnLFxuICAgICAgICAgIHJlY2lwaWVudDogaG9wRGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgIG5vbmNlOiAwLFxuICAgICAgICAgIHVzZXJSZXFTaWc6XG4gICAgICAgICAgICAnMHgwNmZkMGIxZjg4NTlhNDBkOWZiMmQxYTY1ZDU0ZGE1ZDY0NWExZDgxYmJiOGMxYzViMDM3MDUxODQzZWMwZDNjMjI0MzNlYzdmNTBjYzk3ZmEwNDFjYmY4ZDlmZjVkZGY3ZWQ0MWY3MmEwOGZhM2YxOTgzZmQ2NTFhMzNhNDQ0MScsXG4gICAgICAgICAgZ2FzUHJpY2VNYXg6IDcxODc1MDAwMDAsXG4gICAgICAgICAgdHlwZTogJ0V4cG9ydCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICAgdHhQcmVidWlsZC5ob3BUcmFuc2FjdGlvbi5zaWduYXR1cmUgPSBob3BFeHBvcnRUeEJpdGdvU2lnbmF0dXJlO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmVyaWZ5IHN1Y2Nlc3NmdWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMgPSB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9O1xuICAgICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB2ZXJpZnkgZm9yIGFtb3VudCBwbHVzIDEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UGFyYW1zLCByZWNpcGllbnRzOiBbeyBhbW91bnQ6IGFtb3VudCArIDFlOSwgYWRkcmVzczogaG9wRGVzdGluYXRpb25BZGRyZXNzIH1dIH0sXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih2ZXJpZnlBdmF4Y1RyYW5zYWN0aW9uT3B0aW9ucylcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgIGBIb3AgYW1vdW50OiAke2Ftb3VudCAvIDFlOSArIGltcG9ydFR4RmVlfSBkb2VzIG5vdCBlcXVhbCBvcmlnaW5hbCBhbW91bnQ6ICR7XG4gICAgICAgICAgICAgIGFtb3VudCAvIDFlOSArIGltcG9ydFR4RmVlICsgMVxuICAgICAgICAgICAgfWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB2ZXJpZnkgZm9yIGNoYW5nZWQgcHJlYnVpbGQgaG9wIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgLi4udHhQcmVidWlsZCwgcmVjaXBpZW50czogW3sgYWRkcmVzczogYWRkcmVzczIsIGFtb3VudDogJzEwMjAwMDA1MDAwMDAwMDAwMCcgfV0gfSxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0YXZheENvaW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMpXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoYHJlY2lwaWVudCBhZGRyZXNzIG9mIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggaG9wIGFkZHJlc3NgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdmVyaWZ5IGZvciBjaGFuZ2VkIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGhvcERlc3RpbmF0aW9uQWRkcmVzc0RpZmYgPVxuICAgICAgICAgICdQLWZ1amkxM3Zrd3h3cXNxMDdsczZncThxOXlhanJ0OHA5NDZoeWU1enEzdzN+UC1mdWppMTc4YXR6NXAzeGhhYmdnbHlndDI3bmRlNmg0dHo5bHN6bndxMmRoflAtZnVqaTFrbDdwN2VmenB3ZHFrdDZyejR1dDN3bXd1eWN0NzQzNnE2bDloNic7XG4gICAgICAgIGNvbnN0IHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UGFyYW1zLCByZWNpcGllbnRzOiBbeyBhbW91bnQ6IGFtb3VudCwgYWRkcmVzczogaG9wRGVzdGluYXRpb25BZGRyZXNzRGlmZiB9XSB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGF2YXhDb2luXG4gICAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zKVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgYEhvcCBkZXN0aW5hdGlvbjogJHtob3BEZXN0aW5hdGlvbkFkZHJlc3N9IGRvZXMgbm90IGVxdWFsIG9yaWdpbmFsIHJlY2lwaWVudDogJHtob3BEZXN0aW5hdGlvbkFkZHJlc3NEaWZmfWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmVyaWZ5IGlmIHdhbGxldElkIGlzIHVzZWQgaW5zdGVhZCBvZiBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB2ZXJpZnlBdmF4Y1RyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICB0eFBhcmFtczogeyAuLi50eFBhcmFtcywgcmVjaXBpZW50czogW3sgYW1vdW50OiBhbW91bnQsIHdhbGxldElkOiAnc2FtZSB3YWxsZXQnIH1dIH0sXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGNsaWVudCB0eFBhcmFtcyBhcmUgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0ZXRoJyk7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBjb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbnVsbDtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zOiB0eFBhcmFtcyBhcyBhbnksIHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQgYXMgYW55LCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyBwYXJhbXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHR4UHJlYnVpbGQgdGhhdCBpcyBib3RoIGJhdGNoIGFuZCBob3AnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICczNTAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgaXNCYXRjaDogdHJ1ZSxcbiAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgIGhvcFRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgdHg6IGhvcFR4LFxuICAgICAgICAgIGlkOiBob3BUeGlkLFxuICAgICAgICAgIHNpZ25hdHVyZTogaG9wVHhCaXRnb1NpZ25hdHVyZSxcbiAgICAgICAgICBwYXltZW50SWQ6ICcyNzczOTI4MTk2JyxcbiAgICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICByZWNpcGllbnQ6IGhvcERlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgICBub25jZTogMCxcbiAgICAgICAgICB1c2VyUmVxU2lnOiB1c2VyUmVxU2lnLFxuICAgICAgICAgIGdhc1ByaWNlTWF4OiA1MDAwMDAwMDAwMDAsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgYXdhaXQgdGF2YXhDb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndHggY2Fubm90IGJlIGJvdGggYSBiYXRjaCBhbmQgaG9wIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHR4UHJlYnVpbGQgd2l0aCBtb3JlIHRoYW4gb25lIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIHRhdmF4Q29pbiwge30pO1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHsgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH0sXG4gICAgICAgICAgeyBhbW91bnQ6ICcyNTAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgd2FsbGV0OiB3YWxsZXQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdmYWtlV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICB7IGFtb3VudDogJzI1MDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMiB9LFxuICAgICAgICBdLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IHRydWUsXG4gICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYHRhdmF4YyBkb2Vzbid0IHN1cHBvcnQgc2VuZGluZyB0byBtb3JlIHRoYW4gMSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpdGhpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gVHJ5IGFnYWluLCB1c2luZyBvbmx5IGEgc2luZ2xlIHJlY2lwaWVudC5gXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIGhvcCB0eFByZWJ1aWxkIHRoYXQgZG9lcyBub3Qgc2VuZCB0byBpdHMgaG9wIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBob3BEZXN0aW5hdGlvbkFkZHJlc3MgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICc1MDAwMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgaXNCYXRjaDogZmFsc2UsXG4gICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgICBob3BUcmFuc2FjdGlvbjoge1xuICAgICAgICAgIHR4OiBob3BUeCxcbiAgICAgICAgICBpZDogaG9wVHhpZCxcbiAgICAgICAgICBzaWduYXR1cmU6IGhvcFR4Qml0Z29TaWduYXR1cmUsXG4gICAgICAgICAgcGF5bWVudElkOiAnMCcsXG4gICAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgcmVjaXBpZW50OiBob3BEZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgICAgbm9uY2U6IDAsXG4gICAgICAgICAgdXNlclJlcVNpZzogdXNlclJlcVNpZyxcbiAgICAgICAgICBnYXNQcmljZU1heDogNTAwMDAwMDAwMDAwLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3JlY2lwaWVudCBhZGRyZXNzIG9mIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggaG9wIGFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbm9ybWFsIHR4UHJlYnVpbGQgZnJvbSB0aGUgYml0Z28gc2VydmVyIHdpdGggdGhlIHdyb25nIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIHRhdmF4Q29pbiwge30pO1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2Zha2VXYWxsZXRQYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzIwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9XSxcbiAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICBpc0JhdGNoOiBmYWxzZSxcbiAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgYXdhaXQgdGF2YXhDb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnbm9ybWFsIHRyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIHJlY2VpdmVkIGZyb20gQml0R28gc2VydmVycyBkb2VzIG5vdCBtYXRjaCB0eFBhcmFtcyBzdXBwbGllZCBieSBjbGllbnQnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG5vcm1hbCB0eFByZWJ1aWxkIGZyb20gdGhlIGJpdGdvIHNlcnZlciB3aXRoIHRoZSB3cm9uZyByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9XSxcbiAgICAgICAgd2FsbGV0OiB3YWxsZXQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdmYWtlV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczIgfV0sXG4gICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgaXNCYXRjaDogZmFsc2UsXG4gICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgaW4gbm9ybWFsIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggdGhhdCBpbiB0eFBhcmFtcyBzdXBwbGllZCBieSBjbGllbnQnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHRva2VuIHR4UHJlYnVpbGQgZnJvbSB0aGUgYml0Z28gc2VydmVyIHRoYXQgbWF0Y2hlcyB0aGUgY2xpZW50IHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgdG9rZW46ICd0ZXN0JyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSB0eFByZWJ1aWxkIGZyb20gdGhlIGJpdGdvIHNlcnZlciB3aXRoIHRoZSB3cm9uZyBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBhd2FpdCB0YXZheENvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdjb2luIGluIHR4UHJlYnVpbGQgZGlkIG5vdCBtYXRjaCB0aGF0IGluIHR4UGFyYW1zIHN1cHBsaWVkIGJ5IGNsaWVudCcpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0JhdGNoIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbicsICgpID0+IHtcbiAgICAgIGxldCBiYXRjaGVyQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG5cbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBiYXRjaGVyQ29udHJhY3RBZGRyZXNzID0gKHRhdmF4Q29pbi5zdGF0aWNzQ29pbj8ubmV0d29yayBhcyBFdGhlcmV1bU5ldHdvcmspPy5iYXRjaGVyQ29udHJhY3RBZGRyZXNzIGFzIHN0cmluZztcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBuYXRpdmUgY29pbiBiYXRjaCB0cmFuc2FjdGlvbiB3aXRoIG1hdGNoaW5nIHRvdGFsIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMzUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGJhdGNoZXJDb250cmFjdEFkZHJlc3MgfV0sXG4gICAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgICBpc0JhdGNoOiB0cnVlLFxuICAgICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB0b2tlbiBiYXRjaCB0cmFuc2FjdGlvbiB3aXRoIHplcm8gbmF0aXZlIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICAgIHRva2VuTmFtZTogJ3RhdmF4YzpVU0RDJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzAnLCBhZGRyZXNzOiBiYXRjaGVyQ29udHJhY3RBZGRyZXNzIH1dLFxuICAgICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgICAgaXNCYXRjaDogdHJ1ZSxcbiAgICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGF2YXhDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldCxcbiAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgIH0pO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgdG9rZW4gYmF0Y2ggdHJhbnNhY3Rpb24gd2l0aCBub24temVybyBuYXRpdmUgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgICAgeyBhbW91bnQ6ICcyNTAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdmYWtlV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICAgICAgdG9rZW5OYW1lOiAndGF2YXhjOlVTREMnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGJhdGNoZXJDb250cmFjdEFkZHJlc3MgfV0sXG4gICAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgICBpc0JhdGNoOiB0cnVlLFxuICAgICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgICBhd2FpdCB0YXZheENvaW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnYmF0Y2ggdG9rZW4gdHJhbnNhY3Rpb24gYW1vdW50IGluIHR4UHJlYnVpbGQgc2hvdWxkIGJlIHplcm8gZm9yIHRva2VuIHRyYW5zZmVycycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbmF0aXZlIGNvaW4gYmF0Y2ggdHJhbnNhY3Rpb24gd2l0aCBtaXNtYXRjaGVkIHRvdGFsIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnOTk5OTk5OTk5OTk5OScsIGFkZHJlc3M6IGJhdGNoZXJDb250cmFjdEFkZHJlc3MgfV0sXG4gICAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgICBpc0JhdGNoOiB0cnVlLFxuICAgICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgICBhd2FpdCB0YXZheENvaW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgICdiYXRjaCB0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCByZWNlaXZlZCBmcm9tIEJpdEdvIHNlcnZlcnMgZG9lcyBub3QgbWF0Y2ggdHhQYXJhbXMgc3VwcGxpZWQgYnkgY2xpZW50J1xuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgYSBiYXRjaCB0cmFuc2FjdGlvbiBzZW50IHRvIHdyb25nIGJhdGNoZXIgY29udHJhY3QgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG4gICAgICAgIGNvbnN0IHdyb25nQmF0Y2hlckFkZHJlc3MgPSAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJztcblxuICAgICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgICAgeyBhbW91bnQ6ICcyNTAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdmYWtlV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICczNTAwMDAwMDAwMDAwJywgYWRkcmVzczogd3JvbmdCYXRjaGVyQWRkcmVzcyB9XSxcbiAgICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICAgIGlzQmF0Y2g6IHRydWUsXG4gICAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdyZWNpcGllbnQgYWRkcmVzcyBvZiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIGJhdGNoZXIgYWRkcmVzcycpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdIb3AgVHJhbnNhY3Rpb24gUGFyYW1ldGVycycsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaG9wIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMgd2l0aCBnYXNQcmljZU1heCA+IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrRmVlRXN0aW1hdGUgPSB7XG4gICAgICAgIGZlZUVzdGltYXRlOiAnMTIwMDAwJyxcbiAgICAgICAgZ2FzTGltaXRFc3RpbWF0ZTogNTAwMDAwLFxuICAgICAgfTtcbiAgICAgIHNhbmRCb3guc3R1Yih0YXZheENvaW4sICdmZWVFc3RpbWF0ZScpLnJlc29sdmVzKG1vY2tGZWVFc3RpbWF0ZSk7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczpcbiAgICAgICAgICAgICdQLWZ1amkxNHhhMHE0ODU4Y3Qza2Z2cGt3bncyZHlzM202M2t0NmZhbWNrZjZ+UC1mdWppMWhsanllM2tlc2p0cGo4N20wMGU4dndrYXlnNmV5czZ0aGV1eGZnflAtZnVqaTFsZWxxeDRjbGVoM2R6azVrcGxzdHo2bXdydDNkdWs3ZDd3d21wcCcsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhdmF4Q29pbi5jcmVhdGVIb3BUcmFuc2FjdGlvblBhcmFtcyh7XG4gICAgICAgIHJlY2lwaWVudHMsXG4gICAgICAgIHR5cGU6ICdFeHBvcnQnIGFzIGtleW9mIHR5cGVvZiBUcmFuc2FjdGlvblR5cGUsXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdob3BQYXJhbXMnKTtcbiAgICAgIHJlc3VsdC5ob3BQYXJhbXMuc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ3VzZXJSZXFTaWcnLCAnZ2FzUHJpY2VNYXgnLCAncGF5bWVudElkJywgJ2dhc0xpbWl0J10pO1xuICAgICAgcmVzdWx0LmhvcFBhcmFtcy51c2VyUmVxU2lnLnNob3VsZC5lcXVhbCgnMHgnKTtcbiAgICAgIHJlc3VsdC5ob3BQYXJhbXMuZ2FzUHJpY2VNYXguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgcmVzdWx0LmhvcFBhcmFtcy5wYXltZW50SWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgICByZXN1bHQuaG9wUGFyYW1zLmdhc0xpbWl0LnNob3VsZC5lcXVhbCg1MDAwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXhwbGFpbiBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBoYWxmIHNpZ25lZCBpbXBvcnQgaW4gQyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhID0gSU1QT1JUX0M7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSBhd2FpdCB0YXZheENvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHRlc3REYXRhLmhhbGZzaWdudHhIZXgsIGNyb3NzQ2hhaW5UeXBlOiAnaW1wb3J0JyB9KTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKChOdW1iZXIodGVzdERhdGEuYW1vdW50KSAtIHR4RXhwbGFpbi5mZWU/LmZlZSkudG9TdHJpbmcoKSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkltcG9ydCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50byk7XG4gICAgICB0eEV4cGxhaW4uY2hhbmdlT3V0cHV0cy5zaG91bGQuYmUuZW1wdHkoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHhFeHBsYWluLm1lbW8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2lnbmVkIGltcG9ydCBpbiBDIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGEgPSBJTVBPUlRfQztcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IGF3YWl0IHRhdmF4Q29pbi5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogdGVzdERhdGEuZnVsbHNpZ250eEhleCwgY3Jvc3NDaGFpblR5cGU6ICdpbXBvcnQnIH0pO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoKE51bWJlcih0ZXN0RGF0YS5hbW91bnQpIC0gdHhFeHBsYWluLmZlZT8uZmVlKS50b1N0cmluZygpKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuSW1wb3J0KTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRvKTtcbiAgICAgIHR4RXhwbGFpbi5jaGFuZ2VPdXRwdXRzLnNob3VsZC5iZS5lbXB0eSgpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eEV4cGxhaW4ubWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB1bnNpZ25lZCBleHBvcnQgaW4gQyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGltcG9ydEluUEZlZSA9IDEwMDAwMDA7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IEVYUE9SVF9DO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gYXdhaXQgdGF2YXhDb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZFR4SGV4LCBjcm9zc0NoYWluVHlwZTogJ2V4cG9ydCcgfSk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCgoTnVtYmVyKHRlc3REYXRhLmFtb3VudCkgKyBpbXBvcnRJblBGZWUpLnRvU3RyaW5nKCkpO1xuICAgICAgdHhFeHBsYWluLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5jSGV4QWRkcmVzcyk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5wQWRkcmVzc2VzLnNsaWNlKCkuc29ydCgpLmpvaW4oJ34nKSk7XG4gICAgICB0eEV4cGxhaW4uZmVlLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlKTtcbiAgICAgIHR4RXhwbGFpbi5jaGFuZ2VPdXRwdXRzLnNob3VsZC5iZS5lbXB0eSgpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eEV4cGxhaW4ubWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzaWduZWQgZXhwb3J0IGluIEMgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbXBvcnRJblBGZWUgPSAxMDAwMDAwO1xuICAgICAgY29uc3QgdGVzdERhdGEgPSBFWFBPUlRfQztcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IGF3YWl0IHRhdmF4Q29pbi5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogdGVzdERhdGEuZnVsbHNpZ250eEhleCwgY3Jvc3NDaGFpblR5cGU6ICdleHBvcnQnIH0pO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoKE51bWJlcih0ZXN0RGF0YS5hbW91bnQpICsgaW1wb3J0SW5QRmVlKS50b1N0cmluZygpKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcbiAgICAgIHR4RXhwbGFpbi5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuY0hleEFkZHJlc3MpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucEFkZHJlc3Nlcy5zbGljZSgpLnNvcnQoKS5qb2luKCd+JykpO1xuICAgICAgdHhFeHBsYWluLmZlZS5mZWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZlZSk7XG4gICAgICB0eEV4cGxhaW4uY2hhbmdlT3V0cHV0cy5zaG91bGQuYmUuZW1wdHkoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHhFeHBsYWluLm1lbW8pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBUT0RPKEJHLTU2MTM2KTogbW92ZSB0byBtb2R1bGVzL2JpdGdvL3Rlc3QvdjIvaW50ZWdyYXRpb24vY29pbnMvYXZheGMudHNcbiAgZGVzY3JpYmUoJ1JlY292ZXJ5JywgZnVuY3Rpb24gKCkge1xuICAgIC8vIGNvbnRyYWN0IGFkZHJlc3MgZm9yICd0YXZheGM6bGluaydcbiAgICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9ICcweDBiOWQ1ZDkxMzY4NTVmNmZlYzNjMDk5M2ZlZTZlOWNlOGEyOTc4NDYnO1xuICAgIGNvbnN0IHNlcXVlbmNlSWREYXRhID0gJzB4YTBiNzk2N2InO1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihBdmF4Qy5wcm90b3R5cGUsICdyZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5JyBhcyBrZXlvZiBBdmF4Qyk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHhkZmQ5NWQwMWZjOWMyY2I3NDRlMjg1MjI1NjM4NWJiZTZkODdiNzJiJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4MCcgfSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHgyOWQ5N2NlMzQ0NTk5ODI1MjIwYTU0YTRiZGY3YjhhYTdjYTE0ZmQxJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4NycgfSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHhkZmQ5NWQwMWZjOWMyY2I3NDRlMjg1MjI1NjM4NWJiZTZkODdiNzJiJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4MCcgfSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHgyOWQ5N2NlMzQ0NTk5ODI1MjIwYTU0YTRiZGY3YjhhYTdjYTE0ZmQxJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4MzE1ZjhjYjliYzJlYzAwJyB9KTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgbWV0aG9kOiAnZXRoX2dldEJhbGFuY2UnLFxuICAgICAgICAgIHBhcmFtczogWycweGUwYjFmZTA5ODA1MGYyNzQ1YjQ1MGRlNDE5YjVjYWZjN2U4MjY2OTknLCAnbGF0ZXN0J10sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh7IGpzb25ycGM6ICcyLjAnLCBpZDogMSwgcmVzdWx0OiAnMHgwJyB9KTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLFxuICAgICAgICAgIHBhcmFtczogW3sgdG86ICcweGUwYjFmZTA5ODA1MGYyNzQ1YjQ1MGRlNDE5YjVjYWZjN2U4MjY2OTknLCBkYXRhOiAnMHhhMGI3OTY3YicgfSwgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHJlc3VsdDogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZicsXG4gICAgICAgIH0pO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfZ2V0VHJhbnNhY3Rpb25Db3VudCcsXG4gICAgICAgICAgcGFyYW1zOiBbcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5QWRkcmVzcywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuYWRkcmVzc05vbmNlUmVzcG9uc2UxKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgbWV0aG9kOiAnZXRoX2dldFRyYW5zYWN0aW9uQ291bnQnLFxuICAgICAgICAgIHBhcmFtczogW3JlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci5iYWNrdXBLZXlBZGRyZXNzLCAnbGF0ZXN0J10sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzTm9uY2VSZXNwb25zZTIpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfZ2V0QmFsYW5jZScsXG4gICAgICAgICAgcGFyYW1zOiBbcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5QWRkcmVzcywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuYmFja3VwQWRkcmVzc0JhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IFtyZWNvdmVyeVVzZXJzLmNvbGRXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5QWRkcmVzcywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuYmFja3VwQWRkcmVzc0JhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9jYWxsJyxcbiAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG86IHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgICBkYXRhOiBvcHRpb25hbERlcHMuZXRoVXRpbC5hZGRIZXhQcmVmaXgoXG4gICAgICAgICAgICAgICAgb3B0aW9uYWxEZXBzLmV0aEFiaVxuICAgICAgICAgICAgICAgICAgLnNpbXBsZUVuY29kZSgnYmFsYW5jZU9mKGFkZHJlc3MpJywgcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIud2FsbGV0Q29udHJhY3RBZGRyZXNzKVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsYXRlc3QnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzVG9rZW5CYWxhbmNlUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfY2FsbCcsXG4gICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRvOiB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgICAgZGF0YTogb3B0aW9uYWxEZXBzLmV0aFV0aWwuYWRkSGV4UHJlZml4KFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsRGVwcy5ldGhBYmlcbiAgICAgICAgICAgICAgICAgIC5zaW1wbGVFbmNvZGUoJ2JhbGFuY2VPZihhZGRyZXNzKScsIHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MpXG4gICAgICAgICAgICAgICAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2xhdGVzdCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKGVuZHBvaW50UmVzcG9uc2VzLmFkZHJlc3NUb2tlbkJhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9jYWxsJyxcbiAgICAgICAgICBwYXJhbXM6IFt7IHRvOiByZWNvdmVyeVVzZXJzLmhvdFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MsIGRhdGE6IHNlcXVlbmNlSWREYXRhIH0sICdsYXRlc3QnXSxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKGVuZHBvaW50UmVzcG9uc2VzLnNlcXVlbmNlSWRSZXNwb25zZTEpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfY2FsbCcsXG4gICAgICAgICAgcGFyYW1zOiBbeyB0bzogcmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLndhbGxldENvbnRyYWN0QWRkcmVzcywgZGF0YTogc2VxdWVuY2VJZERhdGEgfSwgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuc2VxdWVuY2VJZFJlc3BvbnNlMik7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTm9uLUJpdEdvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBlcnJvciB3aGVuIHRoZSBiYWNrdXAga2V5IGlzIHVuZnVuZGVkIChjYW5ub3QgcGF5IGdhcyknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICAgIHVzZXJLZXk6XG4gICAgICAgICAgICAgICd7XCJpdlwiOlwibnRkOS91ckZqcnlxeGQ0cnpSRUIyUT09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIlxcbicgK1xuICAgICAgICAgICAgICAnOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiTFRxWjQ3YjFCd0U9XCIsXCJjdFwiOlwiSlNiSklCVGtIb0tSM0xcXG4nICtcbiAgICAgICAgICAgICAgJ29UMlFUa0R4M1gxT0JJUHhpU0w2V29NaUlyS0ErYUtUZ211dFhuV0MyR1RFSXlmYkxlYWp3NkQyVVorVTBZOHZpdjdtZ0lUZ1N6MVxcbicgK1xuICAgICAgICAgICAgICAndTlHZGo5N0J0bThXc1owZStLbXNiZEIvZ1l1Y0Nab1BVWkNGcUc0YkVrZGZaOFp2REk5WHZWdjR4UHpOYi9Bb1Npam9zQT1cIn0nLFxuICAgICAgICAgICAgYmFja3VwS2V5OlxuICAgICAgICAgICAgICAne1wiaXZcIjpcIkF4cytHOWdzWjVQRU5VSHgxWVk1Y2c9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgICAgICAgJzpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcImF3UXNoVXZGaTdRPVwiLFwiY3RcIjpcInNXUTBiSG1ydVVUSThDXFxuJyArXG4gICAgICAgICAgICAgICdsd0duZUhPYmROZm8zV1EvbXJ6M3A4NEZvMDdIZ2l6dmdMZCtFM3dGQTNaMUxSYkhvelJqZnN0Vi9xSk1ScXJGdkVnS09jRytTS2RcXG4nICtcbiAgICAgICAgICAgICAgJ2d4NkJibVhXZktoRkhFZXJTWWx1QmdVNU9yWE1mT2tiRXhuTXl3RVdyQ0tFdm9OTCt3eU5Ib1JhTU5iYkRvZ28zNko4UEU9XCJ9JyxcbiAgICAgICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJzB4MjJjMWFiNDQzNzE5ODVlNDkyOTRkMWE0MGU5MmM4YWQwMGY1YmU4ZScsXG4gICAgICAgICAgICAvLyB3YWxsZXRQYXNzcGhyYXNlOiBUZXN0Qml0R28uVjIuVEVTVF9SRUNPVkVSWV9QQVNTQ09ERSxcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdHaGdoamtnITQ1NTU0NGxsbGwnLFxuICAgICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJzB4OTRiNTFlYmI4YzNiOTA0MDRhZDI2MmY0MmMxNTg4YmQ5NDI0MmVjYicsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgICdCYWNrdXAga2V5IGFkZHJlc3MgMHhkZmQ5NWQwMWZjOWMyY2I3NDRlMjg1MjI1NjM4NWJiZTZkODdiNzJiIGhhcyBiYWxhbmNlIDAgR3dlaS5UaGlzIGFkZHJlc3MgbXVzdCBoYXZlIGEgYmFsYW5jZSBvZiBhdCBsZWFzdCAxMDAwMDAwMCBHd2VpIHRvIHBlcmZvcm0gcmVjb3Zlcmllcy4gVHJ5IHNlbmRpbmcgc29tZSBBVkFYIHRvIHRoaXMgYWRkcmVzcyB0aGVuIHJldHJ5LidcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgcmVjb3ZlcnkgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6XG4gICAgICAgICAgICAne1wiaXZcIjpcIm8yN3BCbDdJUCtpYmUzOXhZZy9jWGc9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgICAgICc6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCI5OTJSNnBhZGYyST1cIixcImN0XCI6XCI2d2tuMVBkd3RXY0NXUlxcbicgK1xuICAgICAgICAgICAgJ1ZkT2RhaUdNQ01TNVJodXJHSTllRjR0ZGd6YU16T3BndzU2ZVlSbUtUemxkajVWaDFDbno2Um9xRmxWU2Zud1IrdEZqT3lxRG4zT1xcbicgK1xuICAgICAgICAgICAgJzhLM05VRDVZbE1Hb0NkZnZjckNiUEYzdENkS2wyRHlvTHYrWldQbzVzS1ZqamdVT1pnSTdwbjdpQnRYUkR2cWFXeWxhd1k9XCJ9JyxcbiAgICAgICAgICBiYWNrdXBLZXk6XG4gICAgICAgICAgICAne1wiaXZcIjpcIm13ajlsZDhzdmdSQnNXUys1TlpRcUE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgICAgICc6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCJYdU14YnFhL3lOZz1cIixcImN0XCI6XCJscUxuanNWU0JSLzR1ZVxcbicgK1xuICAgICAgICAgICAgJ3p0WWFoQXZFRVYrbHREWExveUlFTUNtRk15Y2JhKzNtUHRpQU04SHJGLzg0QXpKT2p3S3l2SzFwbStDRnV1V0NUWHNzQVF4UkN1Y1xcbicgK1xuICAgICAgICAgICAgJ0h1anJCdnJLdW5ZNGhmSUpISnN5QnIrbDFQTk5TVUIvYVlMMWFXL243dGR2d0w4Zk9DTnFGcUVQQkNieFhvT2xTZ0NBVXc9XCJ9JyxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICcweGUwYjFmZTA5ODA1MGYyNzQ1YjQ1MGRlNDE5YjVjYWZjN2U4MjY2OTknLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdHaGdoamtnITQ1NTU0NGxsbGwnLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246ICcweDk0YjUxZWJiOGMzYjkwNDA0YWQyNjJmNDJjMTU4OGJkOTQyNDJlY2InLFxuICAgICAgICAgIGdhc1ByaWNlOiAnMzAwMDAwMDAwMDAnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpZCBhbmQgdHggd2lsbCBhbHdheXMgYmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgZXhwaXJlVGltZVxuICAgICAgICByZWNvdmVyeS5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgICByZWNvdmVyeS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgICAgcmVjb3Zlcnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRhdmF4Q29pbi5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICAgIHR4QnVpbGRlci5mcm9tKHJlY292ZXJ5LnR4KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVbnNpZ25lZCBTd2VlcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVzZXJYcHJ2ID1cbiAgICAgICAgJ3hwcnY5czIxWnJRSDE0M0szZlpWUmZteHZyN1lCb2RGNGpTY3pnS1U2Um9EVXp2S25GaUZ6Mm1jdUtndzF6WWd2VEd0TE1CUEFQb252NUd6SG5EWFFLNVZrOEJSSGNONzZUR2dMd2NOY0ZUeTRrQyc7XG4gICAgICBjb25zdCB1c2VyWHB1YiA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRzlkeFhoSnlIejRHanFUalVDQVVNdUY0dHBDcTNMVEpmNDNRWGE1c1Q4MVFzSjVWTWRLOHZuQUs1NmdpN3F5MmNaMmR6WVFmeTdZUDd4NHVIUXB1UlZpQXY5Q05idFMnO1xuICAgICAgY29uc3QgYmFja3VwWHBydiA9XG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLNE42WUJqb29hNlR4M1U3aHpNM1N2SEZBOFhQMjNxWWhRNktQTG8yUWdYVFNhc1ZwaU1ZNEY2Z01yc3RYQkhSRHNvNVdFN0duMzd5Wm5XNXFUUkpaVTZGUGVYeDFCNjknO1xuICAgICAgY29uc3QgYmFja3VwWHB1YiA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjR3JCMUhtTG93RVFnYlZ4Q1BvbUpIV0FrdnVuZGNCNWdHdGVYdExMZkVLbXZTQjlkS3ZSbWgzTHhwTDJ5dmdxeTM3WjN5ZHF2SG9WaU1XYTJkd1gzaHV3bW1CdWlwN0onO1xuICAgICAgY29uc3Qgd2FsbGV0Q29udHJhY3RBZGRyZXNzID0gJzB4ZTBiMWZlMDk4MDUwZjI3NDViNDUwZGU0MTliNWNhZmM3ZTgyNjY5OSc7XG4gICAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4OTRiNTFlYmI4YzNiOTA0MDRhZDI2MmY0MmMxNTg4YmQ5NDI0MmVjYic7XG4gICAgICBjb25zdCBnYXNQcmljZSA9ICcyNTAwMDAwMDAwMCc7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgc3dlZXAgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IHVzZXJYcHViLFxuICAgICAgICAgIGJhY2t1cEtleTogYmFja3VwWHB1YixcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICBnYXNQcmljZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR4ID0gcGFyc2VUcmFuc2FjdGlvbihyZWNvdmVyeS50eEhleCk7XG5cbiAgICAgICAgY29uc3QgZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkod2FsbGV0U2ltcGxlQUJJKSwgcGFyc2VkVHguZGF0YSk7XG5cbiAgICAgICAgY29uc3Qgc2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhLmFyZ3NbMl07XG4gICAgICAgIGNvbnN0IHNhZmVUcmFuc2ZlckZyb21EZXN0aW5hdGlvbiA9IGRlY29kZWRTZW5kTXVsdGlzaWdDYWxsRGF0YS5hcmdzWzBdO1xuICAgICAgICBzYWZlVHJhbnNmZXJGcm9tRGVzdGluYXRpb24udG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwocmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgICAgIHNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5zaG91bGQuYmUuZXF1YWwoJzB4Jyk7XG4gICAgICAgIHJlY292ZXJ5LnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICAgIHJlY292ZXJ5LnNob3VsZC5oYXZlLnByb3BlcnRpZXMoJ3R4SGV4JywgJ3VzZXJLZXknLCAnYmFja3VwS2V5Jyk7XG4gICAgICAgIHJlY292ZXJ5LnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgcmVjb3ZlcnkucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChyZWNvdmVyeURlc3RpbmF0aW9uKTtcbiAgICAgICAgcmVjb3Zlcnkud2FsbGV0Q29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh3YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWRkIGEgc2Vjb25kIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCB0YXZheENvaW4ucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleTogdXNlclhwdWIsXG4gICAgICAgICAgYmFja3VwS2V5OiBiYWNrdXBYcHViLFxuICAgICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIGdhc1ByaWNlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICAgIHR4SGV4OiByZWNvdmVyeS50eEhleCxcbiAgICAgICAgICB1c2VyS2V5OiB1c2VyWHB1YixcbiAgICAgICAgICBiYWNrdXBLZXk6IGJhY2t1cFhwdWIsXG4gICAgICAgICAgY29pbjogcmVjb3ZlcnkuY29pbixcbiAgICAgICAgICBnYXNQcmljZTogcmVjb3ZlcnkuZ2FzUHJpY2UsXG4gICAgICAgICAgZ2FzTGltaXQ6IHJlY292ZXJ5Lmdhc0xpbWl0LFxuICAgICAgICAgIHJlY2lwaWVudHM6IHJlY292ZXJ5LnJlY2lwaWVudHMsXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiByZWNvdmVyeS53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiByZWNvdmVyeS5hbW91bnQsXG4gICAgICAgICAgYmFja3VwS2V5Tm9uY2U6IHJlY292ZXJ5LmJhY2t1cEtleU5vbmNlLFxuICAgICAgICAgIHJlY2lwaWVudDogcmVjb3ZlcnkucmVjaXBpZW50LFxuICAgICAgICAgIGV4cGlyZVRpbWU6IHJlY292ZXJ5LmV4cGlyZVRpbWUsXG4gICAgICAgICAgY29udHJhY3RTZXF1ZW5jZUlkOiByZWNvdmVyeS5jb250cmFjdFNlcXVlbmNlSWQsXG4gICAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogcmVjb3ZlcnkubmV4dENvbnRyYWN0U2VxdWVuY2VJZCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICBwcnY6IHVzZXJYcHJ2LFxuICAgICAgICB9O1xuICAgICAgICAvLyBzaWduIHRyYW5zYWN0aW9uIG9uY2VcbiAgICAgICAgY29uc3QgaGFsZlNpZ25lZCA9IGF3YWl0IHRhdmF4Q29pbi5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcblxuICAgICAgICBjb25zdCB3cmFwcGVyID0ge30gYXMgQXZheFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM7XG4gICAgICAgIHdyYXBwZXIudHhQcmVidWlsZCA9IGhhbGZTaWduZWQ7XG4gICAgICAgIHdyYXBwZXIuaXNMYXN0U2lnbmF0dXJlID0gdHJ1ZTtcbiAgICAgICAgd3JhcHBlci53YWxsZXRDb250cmFjdEFkZHJlc3MgPSB3YWxsZXRDb250cmFjdEFkZHJlc3M7XG4gICAgICAgIHdyYXBwZXIucHJ2ID0gYmFja3VwWHBydjtcblxuICAgICAgICAvLyBzaWduIHRyYW5zYWN0aW9uIHR3aWNlIHdpdGggdGhlIFwiaXNMYXN0U2lnbmF0dXJlXCIgZmxhZ1xuICAgICAgICBjb25zdCBmaW5hbFNpZ25lZFR4ID0gYXdhaXQgdGF2YXhDb2luLnNpZ25UcmFuc2FjdGlvbih3cmFwcGVyKTtcbiAgICAgICAgZmluYWxTaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhIZXgnKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGF2YXhDb2luLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20oZmluYWxTaWduZWRUeC50eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICByZWJ1aWx0VHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICAgIHJlYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHJlYnVpbHRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHR4UHJlYnVpbGQucmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgICByZWJ1aWx0VHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwodHhQcmVidWlsZC5yZWNpcGllbnQuYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1Rva2VuIFJlY292ZXJ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVzdEFkZHIgPSAnMHhjNzRiMWMwZWU5MGE0ODFiNTI4MjUzMDQyY2UzMjI4YThjZDY4NzNlJztcbiAgICAgIGNvbnN0IHdlaVRvR3dlaSA9IDEwICoqIDk7XG4gICAgICBjb25zdCBnYXNQcmljZSA9IDMwICogd2VpVG9Hd2VpO1xuICAgICAgLy8gY29udHJhY3QgYWRkcmVzcyBmb3IgJ3RhdmF4YzpsaW5rJ1xuICAgICAgY29uc3QgdG9rZW5Db250cmFjdEFkZHJlc3MgPSAnMHgwYjlkNWQ5MTM2ODU1ZjZmZWMzYzA5OTNmZWU2ZTljZThhMjk3ODQ2JztcbiAgICAgIGNvbnN0IHRva2VuTmFtZSA9ICd0YXZheGM6bGluayc7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdG9rZW4gcmVjb3ZlcnkgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB1c2VyS2V5OiByZWNvdmVyeVVzZXJzLmhvdFdhbGxldFJlY292ZXJ5VXNlci51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleTogcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5LFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RBZGRyLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHJlY292ZXJ5VXNlcnMuaG90V2FsbGV0UmVjb3ZlcnlVc2VyLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiByZWNvdmVyeVVzZXJzLmhvdFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5VHhuID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIocGFyYW1zKTtcblxuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGF2YXhDb2luLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20ocmVjb3ZlcnlUeG4udHgpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5VXNlcnMuaG90V2FsbGV0UmVjb3ZlcnlVc2VyLndhbGxldENvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgbmV3IEJOKGVuZHBvaW50UmVzcG9uc2VzLmFkZHJlc3NUb2tlbkJhbGFuY2VSZXNwb25zZS5yZXN1bHQuc2xpY2UoMiksIDE2KS50b1N0cmluZygxMClcbiAgICAgICAgKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmNvaW4/LnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgICAgICB0eC5vdXRwdXRzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChkZXN0QWRkcik7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIG5ldyBCTihlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzVG9rZW5CYWxhbmNlUmVzcG9uc2UucmVzdWx0LnNsaWNlKDIpLCAxNikudG9TdHJpbmcoMTApXG4gICAgICAgICk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uY29pbj8uc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCB1bnNpZ25lZCBzd2VlcCB0b2tlbiByZWNvdmVyeSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHVzZXJLZXk6IHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleTogcmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBkZXN0QWRkcixcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiByZWNvdmVyeVVzZXJzLmNvbGRXYWxsZXRSZWNvdmVyeVVzZXIud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5VHhuID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIocGFyYW1zKTtcblxuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhIZXgnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Rva2VuJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnRva2VuLnNob3VsZC5lcXVhbCgndGF2YXhjOmxpbmsnKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGF2YXhDb2luLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20ocmVjb3ZlcnlUeG4udHhIZXgpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByZWNvdmVyeUFtb3VudCA9IG5ldyBCTihlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzVG9rZW5CYWxhbmNlUmVzcG9uc2UucmVzdWx0LnNsaWNlKDIpLCAxNikudG9TdHJpbmcoMTApO1xuICAgICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuICAgICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKHJlY292ZXJ5QW1vdW50KTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb2luJyk7XG4gICAgICAgIHR4LmlucHV0c1swXS5jb2luPy5zaG91bGQuZXF1YWwodG9rZW5OYW1lKTtcbiAgICAgICAgdHgub3V0cHV0cy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoZGVzdEFkZHIpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChcbiAgICAgICAgICBuZXcgQk4oZW5kcG9pbnRSZXNwb25zZXMuYWRkcmVzc1Rva2VuQmFsYW5jZVJlc3BvbnNlLnJlc3VsdC5zbGljZSgyKSwgMTYpLnRvU3RyaW5nKDEwKVxuICAgICAgICApO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb2luJyk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uY29pbj8uc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3VzZXJLZXknKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4udXNlcktleS5zaG91bGQuZXF1YWwocmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLnVzZXJLZXkpO1xuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYmFja3VwS2V5Jyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLmJhY2t1cEtleS5zaG91bGQuZXF1YWwocmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLmJhY2t1cEtleSk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2NvaW4nKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uY29pbi5zaG91bGQuZXF1YWwoJ3RhdmF4YycpO1xuXG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdnYXNQcmljZScpO1xuICAgICAgICByZWNvdmVyeVR4bi5nYXNQcmljZS5zaG91bGQuZXF1YWwoZ2FzUHJpY2UudG9TdHJpbmcoKSk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdnYXNMaW1pdCcpO1xuICAgICAgICByZWNvdmVyeVR4bi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzUwMDAwMCcpO1xuXG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdyZWNpcGllbnRzJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4ucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChkZXN0QWRkcik7XG4gICAgICAgIHJlY292ZXJ5VHhuLnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChyZWNvdmVyeUFtb3VudCk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3dhbGxldENvbnRyYWN0QWRkcmVzcycpO1xuICAgICAgICByZWNvdmVyeVR4bi53YWxsZXRDb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuXG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhbW91bnQnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uYW1vdW50LnNob3VsZC5lcXVhbChyZWNvdmVyeUFtb3VudCk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3JlY2lwaWVudCcpO1xuICAgICAgICByZWNvdmVyeVR4bi5yZWNpcGllbnQuYWRkcmVzcy5zaG91bGQuZXF1YWwoZGVzdEFkZHIpO1xuICAgICAgICByZWNvdmVyeVR4bi5yZWNpcGllbnQuYW1vdW50LnNob3VsZC5lcXVhbChyZWNvdmVyeUFtb3VudCk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Rva2VuQ29udHJhY3RBZGRyZXNzJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnRva2VuQ29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2JhY2t1cEtleU5vbmNlJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdleHBpcmVUaW1lJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb250cmFjdFNlcXVlbmNlSWQnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ25leHRDb250cmFjdFNlcXVlbmNlSWQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19