@bitgo-beta/sdk-coin-eos 1.3.19-beta.21 → 1.3.19-beta.2100

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.
@@ -0,0 +1,528 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ /**
40
+ * @prettier
41
+ */
42
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
43
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
45
+ const secp256k1_1 = require("@bitgo-beta/secp256k1");
46
+ const ecc = __importStar(require("eosjs-ecc"));
47
+ const _ = __importStar(require("lodash"));
48
+ const should_1 = __importDefault(require("should"));
49
+ const sinon = __importStar(require("sinon"));
50
+ const src_1 = require("../../src");
51
+ const fixtures_1 = require("../fixtures");
52
+ const assert_1 = __importDefault(require("assert"));
53
+ describe('EOS:', function () {
54
+ let bitgo;
55
+ let basecoin;
56
+ before(function () {
57
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
58
+ bitgo.safeRegister('eos', src_1.Eos.createInstance);
59
+ bitgo.safeRegister('teos', src_1.Teos.createInstance);
60
+ bitgo.initializeTestVars();
61
+ basecoin = bitgo.coin('teos');
62
+ });
63
+ it('should get address details', function () {
64
+ let addressDetails = basecoin.getAddressDetails('i1skda3kso43');
65
+ addressDetails.address.should.equal('i1skda3kso43');
66
+ (0, should_1.default)(addressDetails.memoId).be.undefined();
67
+ addressDetails = basecoin.getAddressDetails('ks13k3hdui24?memoId=1');
68
+ addressDetails.address.should.equal('ks13k3hdui24');
69
+ addressDetails.memoId.should.equal('1');
70
+ (() => {
71
+ basecoin.getAddressDetails('ks13k3hdui24?memoId=1&memoId=2');
72
+ }).should.throw();
73
+ });
74
+ it('should get address details with alphanumeric memoid', function () {
75
+ const addressDetails = basecoin.getAddressDetails('i1skda3kso43?memoId=123abc');
76
+ addressDetails.address.should.equal('i1skda3kso43');
77
+ addressDetails.memoId.should.equal('123abc');
78
+ });
79
+ it('should validate address', function () {
80
+ basecoin.isValidAddress('i1skda3kso43').should.equal(true);
81
+ basecoin.isValidAddress('ks13kdh245ls').should.equal(true);
82
+ basecoin.isValidAddress('ks13k3hdui24?memoId=1').should.equal(true);
83
+ basecoin.isValidAddress('ks13k3hdui24?memoId=x').should.equal(true);
84
+ });
85
+ it('verifyAddress should work', async function () {
86
+ await basecoin.verifyAddress({
87
+ address: 'i1skda3kso43',
88
+ rootAddress: 'i1skda3kso43',
89
+ });
90
+ await basecoin.verifyAddress({
91
+ address: 'ks13kdh245ls?memoId=1',
92
+ rootAddress: 'ks13kdh245ls',
93
+ });
94
+ assert_1.default.rejects(basecoin.verifyAddress({ address: 'i1skda3kso43=x', rootAddress: 'i1skda3kso43' }));
95
+ assert_1.default.rejects(basecoin.verifyAddress({ address: 'i1skda3kso43?memoId=243432', rootAddress: 'ks13kdh245ls' }));
96
+ assert_1.default.rejects(basecoin.verifyAddress({ address: 'i1skda3kso43' }));
97
+ });
98
+ it('should generate valid random addresses', () => {
99
+ for (let i = 0; i < 100; i++) {
100
+ const address = basecoin.generateRandomAddress();
101
+ basecoin.isValidAddress(address).should.be.true();
102
+ }
103
+ });
104
+ it('isValidMemo should work', function () {
105
+ basecoin.isValidMemo({ value: '1' }).should.equal(true);
106
+ basecoin.isValidMemo({ value: 'uno' }).should.equal(true);
107
+ basecoin.isValidMemo({ value: fixtures_1.EosInputs.string257CharsLong }).should.equal(false);
108
+ });
109
+ it('isValidMemoId should work', function () {
110
+ basecoin.isValidMemoId('1').should.equal(true);
111
+ basecoin.isValidMemoId('123abc').should.equal(true);
112
+ basecoin.isValidMemoId(fixtures_1.EosInputs.string257CharsLong).should.equal(false);
113
+ });
114
+ it('should validate pub key', () => {
115
+ const { pub } = basecoin.keychains().create();
116
+ basecoin.isValidPub(pub).should.equal(true);
117
+ });
118
+ describe('Keypairs:', () => {
119
+ it('should generate a keypair from random seed', function () {
120
+ const keyPair = basecoin.generateKeyPair();
121
+ keyPair.should.have.property('pub');
122
+ keyPair.should.have.property('prv');
123
+ basecoin.isValidPub(keyPair.pub).should.equal(true);
124
+ basecoin.isValidPrv(keyPair.prv).should.equal(true);
125
+ });
126
+ it('should generate a keypair from seed', function () {
127
+ const seed = Buffer.from('c3b09c24731be2851b641d9d5b3f60fa129695c24071768d15654bea207b7bb6', 'hex');
128
+ const keyPair = basecoin.generateKeyPair(seed);
129
+ keyPair.pub.should.equal('xpub661MyMwAqRbcF2SUqUMiqxWGwaVX6sH4okTtX8jxJ1A14wfL8W7jZEoNE537JqSESXFpTcXCZahPz7RKQLpAEGsVp233dc5CffLSecpU13X');
130
+ keyPair.prv.should.equal('xprv9s21ZrQH143K2YN1jSpiUpZYPYf2hQZDSXYHikLLjfd2C9LBaxoV1SUtNnZGnXeyJ6uFWMbQTfjXqVfgNqRBw5yyaCtBK1AM8PF3XZtKjQp');
131
+ });
132
+ });
133
+ it('should create unsigned recovery transaction without Bitgo', async function () {
134
+ const userKey = 'xpub661MyMwAqRbcH1oUADxatLuKkVjaDB2zTNJoZQsGVQEvoogpbXJw24QMokNwFKj9Qhci6KWaCcQKrzpL4LCQXXX3YpTQxgD9KLBjhDrUWo4';
135
+ const backupKey = 'xpub661MyMwAqRbcH1n6sgY29G7dAxL7twS8rt1jyuuQb1kfnA7s3FJPGoVqb9JenXkeJmC4jZ8iVscn3AH6MkYAVc61FTYCHpxv5cxWar5Jw3C';
136
+ const rootAddress = 'i1skda3kso43';
137
+ const destinationAddress = 'ks13kdh245ls';
138
+ // mock responses to the block chain
139
+ const sandBox = sinon.createSandbox();
140
+ const callBack = sandBox.stub(src_1.Eos.prototype, 'getDataFromNode');
141
+ callBack
142
+ .withArgs({
143
+ endpoint: '/v1/chain/get_account',
144
+ payload: { account_name: rootAddress },
145
+ })
146
+ .resolves(fixtures_1.EosResponses.getAccountResponseSuccess1);
147
+ callBack
148
+ .withArgs({
149
+ endpoint: '/v1/chain/get_account',
150
+ payload: { account_name: destinationAddress },
151
+ })
152
+ .resolves(fixtures_1.EosResponses.getAccountResponseSuccess2);
153
+ callBack
154
+ .withArgs({
155
+ endpoint: '/v1/chain/get_info',
156
+ })
157
+ .resolves(fixtures_1.EosResponses.getInfoResponseSuccess1);
158
+ callBack
159
+ .withArgs({
160
+ endpoint: '/v1/chain/get_block',
161
+ payload: { block_num_or_id: 191839472 },
162
+ })
163
+ .resolves(fixtures_1.EosResponses.getBlockResponseSuccess1);
164
+ // can create unsigned recovery transaction
165
+ const unsignedRecoveryTransaction = await basecoin.recover({
166
+ userKey,
167
+ backupKey,
168
+ bitgoKey: 'key',
169
+ recoveryDestination: destinationAddress,
170
+ rootAddress,
171
+ });
172
+ unsignedRecoveryTransaction.recoveryAmount.should.equal('5.0000');
173
+ unsignedRecoveryTransaction.transaction.signatures.length.should.equal(0);
174
+ // coin and txHex fields are expected during recovery of unsigned transaction using OVC
175
+ unsignedRecoveryTransaction.coin.should.equal('teos');
176
+ unsignedRecoveryTransaction.txHex.should.equal('2a02a0053e5a8cf73a56ba0fda11e4d92e0238a4a2aa74fccf46d5a9107468408cdcdb60f03cf4a9e53c000000000100a6823403ea3055000000572d3ccdcd013008c5709804717000000000a8ed3232213008c57098047170806321a22538028650c300000000000004454f530000000000000000000000000000000000000000000000000000000000000000000000000000');
177
+ // destination address and root address can include memoId
178
+ const unsignedRecoveryTransaction2 = await basecoin.recover({
179
+ userKey,
180
+ backupKey,
181
+ bitgoKey: 'key',
182
+ recoveryDestination: `${destinationAddress}?memoId=0`,
183
+ rootAddress: `${rootAddress}?memoId=0`,
184
+ });
185
+ unsignedRecoveryTransaction2.recoveryAmount.should.equal('5.0000');
186
+ unsignedRecoveryTransaction2.transaction.signatures.length.should.equal(0);
187
+ // coin and txHex fields are expected during recovery of unsigned transaction using OVC
188
+ unsignedRecoveryTransaction.coin.should.equal('teos');
189
+ unsignedRecoveryTransaction.txHex.should.equal('2a02a0053e5a8cf73a56ba0fda11e4d92e0238a4a2aa74fccf46d5a9107468408cdcdb60f03cf4a9e53c000000000100a6823403ea3055000000572d3ccdcd013008c5709804717000000000a8ed3232213008c57098047170806321a22538028650c300000000000004454f530000000000000000000000000000000000000000000000000000000000000000000000000000');
190
+ sandBox.restore();
191
+ });
192
+ it('should throw ErrorNoInputToRecover when the account has no liquid balance', async function () {
193
+ const userKey = 'xpub661MyMwAqRbcH1oUADxatLuKkVjaDB2zTNJoZQsGVQEvoogpbXJw24QMokNwFKj9Qhci6KWaCcQKrzpL4LCQXXX3YpTQxgD9KLBjhDrUWo4';
194
+ const backupKey = 'xpub661MyMwAqRbcH1n6sgY29G7dAxL7twS8rt1jyuuQb1kfnA7s3FJPGoVqb9JenXkeJmC4jZ8iVscn3AH6MkYAVc61FTYCHpxv5cxWar5Jw3C';
195
+ const rootAddress = 'i1skda3kso43';
196
+ const destinationAddress = 'ks13kdh245ls';
197
+ const sandBox = sinon.createSandbox();
198
+ const callBack = sandBox.stub(src_1.Eos.prototype, 'getDataFromNode');
199
+ callBack
200
+ .withArgs({
201
+ endpoint: '/v1/chain/get_account',
202
+ payload: { account_name: rootAddress },
203
+ })
204
+ .resolves({ status: 200, body: { account_name: rootAddress } });
205
+ try {
206
+ await basecoin
207
+ .recover({
208
+ userKey,
209
+ backupKey,
210
+ bitgoKey: 'key',
211
+ recoveryDestination: destinationAddress,
212
+ rootAddress,
213
+ })
214
+ .should.be.rejectedWith(sdk_core_1.ErrorNoInputToRecover);
215
+ }
216
+ finally {
217
+ sandBox.restore();
218
+ }
219
+ });
220
+ it('should throw RecoveryProviderError when the node returns a non-200 response', async function () {
221
+ const userKey = 'xpub661MyMwAqRbcH1oUADxatLuKkVjaDB2zTNJoZQsGVQEvoogpbXJw24QMokNwFKj9Qhci6KWaCcQKrzpL4LCQXXX3YpTQxgD9KLBjhDrUWo4';
222
+ const backupKey = 'xpub661MyMwAqRbcH1n6sgY29G7dAxL7twS8rt1jyuuQb1kfnA7s3FJPGoVqb9JenXkeJmC4jZ8iVscn3AH6MkYAVc61FTYCHpxv5cxWar5Jw3C';
223
+ const rootAddress = 'i1skda3kso43';
224
+ const destinationAddress = 'ks13kdh245ls';
225
+ const sandBox = sinon.createSandbox();
226
+ const callBack = sandBox.stub(src_1.Eos.prototype, 'getDataFromNode');
227
+ callBack
228
+ .withArgs({
229
+ endpoint: '/v1/chain/get_account',
230
+ payload: { account_name: rootAddress },
231
+ })
232
+ .resolves({ status: 500, body: {} });
233
+ try {
234
+ await basecoin
235
+ .recover({
236
+ userKey,
237
+ backupKey,
238
+ bitgoKey: 'key',
239
+ recoveryDestination: destinationAddress,
240
+ rootAddress,
241
+ })
242
+ .should.be.rejectedWith(sdk_core_1.RecoveryProviderError);
243
+ }
244
+ finally {
245
+ sandBox.restore();
246
+ }
247
+ });
248
+ describe('Transactions:', function () {
249
+ const testExplainTransaction = (input, expectedOutput) => async function () {
250
+ const explainedTransaction = await basecoin.explainTransaction(input);
251
+ should_1.default.exist(explainedTransaction);
252
+ explainedTransaction.should.deepEqual(expectedOutput);
253
+ };
254
+ it('should generate a valid transaction signature', async function () {
255
+ const signatureData = 'abcd';
256
+ const tx = {
257
+ txHex: signatureData,
258
+ headers: {
259
+ ref_block_num: 1,
260
+ ref_block_prefix: 'asd',
261
+ },
262
+ transaction: {
263
+ signatures: [],
264
+ packed_trx: signatureData,
265
+ compression: 'none',
266
+ },
267
+ recipients: [{}],
268
+ };
269
+ const seed = Buffer.from('c3b09c24731be2851b624d9d5b3f60fa129695c24071768d15654bea207b7bb6', 'hex');
270
+ const keyPair = basecoin.generateKeyPair(seed);
271
+ const { halfSigned } = await basecoin.signTransaction({ txPrebuild: tx, prv: keyPair.prv });
272
+ const signature = halfSigned.transaction.signatures[0];
273
+ const hdNode = secp256k1_1.bip32.fromBase58(keyPair.pub);
274
+ const eosPubkey = ecc.PublicKey.fromBuffer(hdNode.publicKey).toString();
275
+ ecc.verify(signature, Buffer.from(signatureData, 'hex'), eosPubkey).should.eql(true);
276
+ });
277
+ it('should explain an EOS transaction', async function () {
278
+ const explainTransactionParams = {
279
+ headers: {
280
+ ref_block_prefix: 100,
281
+ ref_block_num: 995,
282
+ expiration: '2018-04-27T18:40:34.000Z',
283
+ },
284
+ transaction: {
285
+ packed_trx: 'a26ee35ae30364000000000000000100a6823403ea3055000000572d3ccdcd019013e48c8ce5eed400000000a8ed3232229013e48c8ce5eed4b012362b61b31236640000000000000004454f5300000000013100',
286
+ },
287
+ };
288
+ const explainedTx = await basecoin.explainTransaction(explainTransactionParams);
289
+ explainedTx.outputAmount.should.equal('100');
290
+ explainedTx.outputs.length.should.equal(1);
291
+ explainedTx.outputs[0].amount.should.equal('100');
292
+ explainedTx.outputs[0].address.should.equal('asdfasdfasdf');
293
+ explainedTx.id.should.equal('6132f3bf4a746e6ecad8a31df67d71b4741fc5b7c868ae36dde18309a91df8a6');
294
+ explainedTx.memo.should.equal('1');
295
+ });
296
+ it('explains EOS native transfer transaction', testExplainTransaction(fixtures_1.EosInputs.explainTransactionInputNative, fixtures_1.EosResponses.explainTransactionOutputNative));
297
+ it('explains CHEX token transfer transaction', testExplainTransaction(fixtures_1.EosInputs.explainTransactionInputChex, fixtures_1.EosResponses.explainTransactionOutputChex));
298
+ it('explain EOS Unstake1 transaction', testExplainTransaction(fixtures_1.EosInputs.explainUnstakeInput1, fixtures_1.EosResponses.explainUnstakeOutput1));
299
+ it('explain EOS Unstake2 transaction', testExplainTransaction(fixtures_1.EosInputs.explainUnstakeInput2, fixtures_1.EosResponses.explainUnstakeOutput2));
300
+ it('explain EOS Refund transaction', testExplainTransaction(fixtures_1.EosInputs.explainRefundInput, fixtures_1.EosResponses.explainRefundOutput));
301
+ });
302
+ describe('Transaction Verification', function () {
303
+ let wallet;
304
+ let basecoin;
305
+ let verification;
306
+ let sandBox;
307
+ let newTxPrebuild;
308
+ let newTxParams;
309
+ before(async () => {
310
+ basecoin = bitgo.coin('teos');
311
+ const walletData = {
312
+ id: '5a78dd561c6258a907f1eeaee132f796',
313
+ users: [
314
+ {
315
+ user: '543c11ed356d00cb7600000b98794503',
316
+ permissions: ['admin', 'view', 'spend'],
317
+ },
318
+ ],
319
+ coin: 'teos',
320
+ label: 'Verification Wallet',
321
+ m: 2,
322
+ n: 3,
323
+ keys: [
324
+ '5a78dd56bfe424aa07aa068651b194fd',
325
+ '5a78dd5674a70eb4079f58797dfe2f5e',
326
+ '5a78dd561c6258a907f1eea9f1d079e2',
327
+ ],
328
+ tags: ['5a78dd561c6258a907f1eeaee132f796'],
329
+ disableTransactionNotifications: false,
330
+ freeze: {},
331
+ deleted: false,
332
+ approvalsRequired: 1,
333
+ isCold: true,
334
+ coinSpecific: {},
335
+ clientFlags: [],
336
+ balance: 650000000,
337
+ confirmedBalance: 650000000,
338
+ spendableBalance: 650000000,
339
+ balanceString: '650000000',
340
+ confirmedBalanceString: '650000000',
341
+ spendableBalanceString: '650000000',
342
+ receiveAddress: {
343
+ id: '5a78de2bbfe424aa07aa131ec03c8dc1',
344
+ address: '78xczhaijyhek2',
345
+ chain: 0,
346
+ index: 0,
347
+ coin: 'teos',
348
+ wallet: '5a78dd561c6258a907f1eeaee132f796',
349
+ coinSpecific: {},
350
+ },
351
+ pendingApprovals: [],
352
+ };
353
+ wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
354
+ const userKeychain = {
355
+ prv: '5KJq565HTrgEJG9EbvJH5BLYTgioAyY27dT9am1kCtn2YVAJEYK',
356
+ pub: 'EOS6g7AAMQkhXp8j73E8BD4KRwtQevEsFgYx8htaQkRVhhXJMgkMZ',
357
+ };
358
+ const backupKeychain = {
359
+ prv: '5KZ1nXXCi5yXH8AjCJqjnCYHCVnhQa9YWGV2D14i8g221dxNwLW',
360
+ pub: 'EOS7gyDLNk12faVb1aqNxj1L2DpBerFkhAsxBs95yW3yxJpqvg9Mt',
361
+ };
362
+ const txPrebuild = {
363
+ recipients: [
364
+ {
365
+ address: 'lionteste212',
366
+ amount: '1000',
367
+ },
368
+ ],
369
+ headers: {
370
+ expiration: '2021-10-28T02:34:05.848',
371
+ ref_block_num: 42915,
372
+ ref_block_prefix: 1204086709,
373
+ },
374
+ txHex: '2a02a0053e5a8cf73a56ba0fda11e4d92e0238a4a2aa74fccf46d5a9107468401e0c7a61a3a7b5e7c4470000000100408c7a02ea3055000000000085269d00030233330100a6823403ea3055000000572d3ccdcd0120ceb8437333427c00000000a8ed32322220ceb8437333427c20825019ab3ca98be80300000000000004454f53000000000131000000000000000000000000000000000000000000000000000000000000000000',
375
+ transaction: {
376
+ compression: 'none',
377
+ packed_trx: '1e0c7a61a3a7b5e7c4470000000100408c7a02ea3055000000000085269d00030233330100a6823403ea3055000000572d3ccdcd0120ceb8437333427c00000000a8ed32322220ceb8437333427c20825019ab3ca98be80300000000000004454f5300000000013100',
378
+ signatures: [],
379
+ },
380
+ txid: '586c5b59b10b134d04c16ac1b273fe3c5529f34aef75db4456cd469c5cdac7e2',
381
+ isVotingTransaction: false,
382
+ coin: 'teos',
383
+ };
384
+ verification = {
385
+ disableNetworking: true,
386
+ keychains: {
387
+ user: { pub: userKeychain.pub },
388
+ backup: { pub: backupKeychain.pub },
389
+ },
390
+ };
391
+ const seed = Buffer.from('c3b09c24731be2851b624d9d5b3f60fa129695c24071768d15654bea207b7bb6', 'hex');
392
+ const keyPair = basecoin.generateKeyPair(seed);
393
+ const txParams = {
394
+ txPrebuild,
395
+ prv: keyPair.prv,
396
+ recipients: [
397
+ {
398
+ address: 'lionteste212?memoId=1',
399
+ amount: '1000',
400
+ },
401
+ ],
402
+ };
403
+ newTxPrebuild = () => {
404
+ return _.cloneDeep(txPrebuild);
405
+ };
406
+ newTxParams = () => {
407
+ return _.cloneDeep(txParams);
408
+ };
409
+ });
410
+ beforeEach(async () => {
411
+ // mock responses to the block chain
412
+ sandBox = sinon.createSandbox();
413
+ const callBack = sandBox.stub(src_1.Eos.prototype, 'getDataFromNode');
414
+ callBack
415
+ .withArgs({
416
+ endpoint: '/v1/chain/get_info',
417
+ })
418
+ .resolves(fixtures_1.EosResponses.getInfoResponseSuccess1);
419
+ callBack
420
+ .withArgs({
421
+ endpoint: '/v1/chain/get_block',
422
+ payload: { block_num_or_id: 191839472 },
423
+ })
424
+ .resolves(fixtures_1.EosResponses.getBlockResponseSuccess1);
425
+ });
426
+ afterEach(async () => {
427
+ sandBox.restore();
428
+ });
429
+ it('should verify a transaction', async function () {
430
+ const txParams = newTxParams();
431
+ const txPrebuild = newTxPrebuild();
432
+ const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
433
+ validTransaction.should.equal(true);
434
+ });
435
+ it('should verify a transaction without a memoId', async function () {
436
+ const txPrebuild = newTxPrebuild();
437
+ // txParams with different txPrebuild
438
+ const txPrebuild2 = newTxPrebuild();
439
+ txPrebuild2.recipients[0].address = 'lionteste212';
440
+ const txParams = newTxParams();
441
+ txParams.txPrebuild = txPrebuild2;
442
+ const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
443
+ validTransaction.should.equal(true);
444
+ });
445
+ it('should throw if different prebuilds are provided in txParams and txPrebuild', async function () {
446
+ const txPrebuild = newTxPrebuild();
447
+ // txParams with different txPrebuild
448
+ const txPrebuild2 = newTxPrebuild();
449
+ txPrebuild2.recipients[0].address = 'sadjghaslsdgo';
450
+ const txParams = newTxParams();
451
+ txParams.txPrebuild = txPrebuild2;
452
+ await basecoin
453
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
454
+ .should.be.rejectedWith('inputs txParams.txPrebuild and txPrebuild expected to be equal but were not');
455
+ });
456
+ it('should throw if unpacked txHex is not the same as the unpacked packed_trx', async function () {
457
+ const txPrebuild = newTxPrebuild();
458
+ txPrebuild.txHex =
459
+ 'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf9111111111111111111111111111111111640000000000000100408c7a02ea3055000000000085269d000201310100a6823403ea3055000000572d3ccdcd01d0f9ce64f437f7cf00000000a8ed323222d0f9ce64f437f7cfb012362b61b31236640000000000000004454f53000000000131000000000000000000000000000000000000000000000000000000000000000000';
460
+ const txParams = newTxParams();
461
+ txParams.txPrebuild = txPrebuild;
462
+ await basecoin
463
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
464
+ .should.be.rejectedWith('unpacked packed_trx and unpacked txHex are not equal');
465
+ });
466
+ it('should throw if the expected amount is different than actual amount', async function () {
467
+ const txPrebuild = newTxPrebuild();
468
+ const txParams = newTxParams();
469
+ txParams.recipients[0].amount = 10000;
470
+ await basecoin
471
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
472
+ .should.be.rejectedWith('txHex receive amount does not match expected recipient amount');
473
+ });
474
+ it('should throw if the expected recipient is different than actual recipient', async function () {
475
+ const txPrebuild = newTxPrebuild();
476
+ const txParams = newTxParams();
477
+ txParams.recipients[0].address = 'aaaaaaaaaaaa';
478
+ await basecoin
479
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
480
+ .should.be.rejectedWith('txHex receive address does not match expected recipient address');
481
+ });
482
+ it('should throw if the expected memo is different than actual memo', async function () {
483
+ const txPrebuild = newTxPrebuild();
484
+ const txParams = newTxParams();
485
+ txParams.recipients[0].address = 'lionteste212?memoId=10';
486
+ await basecoin
487
+ .verifyTransaction({ txParams, txPrebuild, wallet, verification })
488
+ .should.be.rejectedWith('txHex receive memoId does not match expected recipient memoId');
489
+ });
490
+ it('should verify transaction with memo id in params only', async function () {
491
+ const txPrebuild = newTxPrebuild();
492
+ txPrebuild.headers = {
493
+ expiration: '2021-11-08T17:24:47.792',
494
+ ref_block_num: 1,
495
+ ref_block_prefix: 100,
496
+ };
497
+ // has memoid in the txaction with value of '1'
498
+ txPrebuild.txHex =
499
+ 'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473605d89610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd01001dd9f9a000a53d00000000a8ed323222001dd9f9a000a53d20825019ab3ca98be80300000000000004454f53000000000131000000000000000000000000000000000000000000000000000000000000000000';
500
+ txPrebuild.transaction.packed_trx =
501
+ '605d89610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd01001dd9f9a000a53d00000000a8ed323222001dd9f9a000a53d20825019ab3ca98be80300000000000004454f5300000000013100';
502
+ const txParams = newTxParams();
503
+ txParams.recipients[0].address = 'lionteste212';
504
+ txParams.txPrebuild = txPrebuild;
505
+ const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
506
+ validTransaction.should.equal(true);
507
+ });
508
+ it('should verify transaction with alpha numeric memo id params', async function () {
509
+ const txPrebuild = newTxPrebuild();
510
+ txPrebuild.headers = {
511
+ expiration: '2021-11-08T17:55:17.518',
512
+ ref_block_num: 1,
513
+ ref_block_prefix: 100,
514
+ };
515
+ // has memoid in the txaction with value of 'QG73WAXXG'
516
+ txPrebuild.txHex =
517
+ 'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473866489610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd013085b943b1b54ed700000000a8ed32322a3085b943b1b54ed720825019ab3ca98be80300000000000004454f530000000009514737335741585847000000000000000000000000000000000000000000000000000000000000000000';
518
+ txPrebuild.transaction.packed_trx =
519
+ '866489610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd013085b943b1b54ed700000000a8ed32322a3085b943b1b54ed720825019ab3ca98be80300000000000004454f53000000000951473733574158584700';
520
+ const txParams = newTxParams();
521
+ txParams.recipients[0].address = 'lionteste212';
522
+ txParams.txPrebuild = txPrebuild;
523
+ const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
524
+ validTransaction.should.equal(true);
525
+ });
526
+ });
527
+ });
528
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2Vvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsaURBQStDO0FBQy9DLG1EQUE0RjtBQUM1RixtREFBK0Q7QUFDL0QscURBQThDO0FBQzlDLCtDQUFpQztBQUNqQywwQ0FBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUMvQixtQ0FBc0M7QUFDdEMsMENBQXNEO0FBQ3RELG9EQUE0QjtBQUU1QixRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBUSxDQUFDO0lBRWIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFO1FBQy9CLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsSUFBQSxnQkFBTSxFQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxF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aUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDMUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgRXJyb3JOb0lucHV0VG9SZWNvdmVyLCBSZWNvdmVyeVByb3ZpZGVyRXJyb3IsIFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgZWNjIGZyb20gJ2Vvc2pzLWVjYyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBFb3MsIFRlb3MgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgRW9zSW5wdXRzLCBFb3NSZXNwb25zZXMgfSBmcm9tICcuLi9maXh0dXJlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmRlc2NyaWJlKCdFT1M6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdlb3MnLCBFb3MuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGVvcycsIFRlb3MuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVvcycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCBhZGRyZXNzIGRldGFpbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFkZHJlc3NEZXRhaWxzID0gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoJ2kxc2tkYTNrc280MycpO1xuXG4gICAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcy5zaG91bGQuZXF1YWwoJ2kxc2tkYTNrc280MycpO1xuICAgIHNob3VsZChhZGRyZXNzRGV0YWlscy5tZW1vSWQpLmJlLnVuZGVmaW5lZCgpO1xuXG4gICAgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygna3MxM2szaGR1aTI0P21lbW9JZD0xJyk7XG4gICAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcy5zaG91bGQuZXF1YWwoJ2tzMTNrM2hkdWkyNCcpO1xuICAgIGFkZHJlc3NEZXRhaWxzLm1lbW9JZC5zaG91bGQuZXF1YWwoJzEnKTtcblxuICAgICgoKSA9PiB7XG4gICAgICBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygna3MxM2szaGR1aTI0P21lbW9JZD0xJm1lbW9JZD0yJyk7XG4gICAgfSkuc2hvdWxkLnRocm93KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2V0IGFkZHJlc3MgZGV0YWlscyB3aXRoIGFscGhhbnVtZXJpYyBtZW1vaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnaTFza2RhM2tzbzQzP21lbW9JZD0xMjNhYmMnKTtcblxuICAgIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdpMXNrZGEza3NvNDMnKTtcbiAgICBhZGRyZXNzRGV0YWlscy5tZW1vSWQuc2hvdWxkLmVxdWFsKCcxMjNhYmMnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCdpMXNrZGEza3NvNDMnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ2tzMTNrZGgyNDVscycpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygna3MxM2szaGR1aTI0P21lbW9JZD0xJykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCdrczEzazNoZHVpMjQ/bWVtb0lkPXgnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCd2ZXJpZnlBZGRyZXNzIHNob3VsZCB3b3JrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGJhc2Vjb2luLnZlcmlmeUFkZHJlc3Moe1xuICAgICAgYWRkcmVzczogJ2kxc2tkYTNrc280MycsXG4gICAgICByb290QWRkcmVzczogJ2kxc2tkYTNrc280MycsXG4gICAgfSk7XG4gICAgYXdhaXQgYmFzZWNvaW4udmVyaWZ5QWRkcmVzcyh7XG4gICAgICBhZGRyZXNzOiAna3MxM2tkaDI0NWxzP21lbW9JZD0xJyxcbiAgICAgIHJvb3RBZGRyZXNzOiAna3MxM2tkaDI0NWxzJyxcbiAgICB9KTtcblxuICAgIGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnaTFza2RhM2tzbzQzPXgnLCByb290QWRkcmVzczogJ2kxc2tkYTNrc280MycgfSkpO1xuICAgIGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnaTFza2RhM2tzbzQzP21lbW9JZD0yNDM0MzInLCByb290QWRkcmVzczogJ2tzMTNrZGgyNDVscycgfSkpO1xuICAgIGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnaTFza2RhM2tzbzQzJyB9KSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgdmFsaWQgcmFuZG9tIGFkZHJlc3NlcycsICgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gYmFzZWNvaW4uZ2VuZXJhdGVSYW5kb21BZGRyZXNzKCk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRNZW1vIHNob3VsZCB3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vKHsgdmFsdWU6ICcxJyB9KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgYmFzZWNvaW4uaXNWYWxpZE1lbW8oeyB2YWx1ZTogJ3VubycgfSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vKHsgdmFsdWU6IEVvc0lucHV0cy5zdHJpbmcyNTdDaGFyc0xvbmcgfSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRNZW1vSWQgc2hvdWxkIHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnMScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcxMjNhYmMnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZChFb3NJbnB1dHMuc3RyaW5nMjU3Q2hhcnNMb25nKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIHB1YiBrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBwdWIgfSA9IGJhc2Vjb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIocHViKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXlwYWlyczonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSByYW5kb20gc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgICAga2V5UGFpci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJ2Jyk7XG5cbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoa2V5UGFpci5wdWIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRQcnYoa2V5UGFpci5wcnYpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBrZXlwYWlyIGZyb20gc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSBCdWZmZXIuZnJvbSgnYzNiMDljMjQ3MzFiZTI4NTFiNjQxZDlkNWIzZjYwZmExMjk2OTVjMjQwNzE3NjhkMTU2NTRiZWEyMDdiN2JiNicsICdoZXgnKTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG5cbiAgICAgIGtleVBhaXIucHViLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGMlNVcVVNaXF4V0d3YVZYNnNING9rVHRYOGp4SjFBMTR3Zkw4VzdqWkVvTkU1MzdKcVNFU1hGcFRjWENaYWhQejdSS1FMcEFFR3NWcDIzM2RjNUNmZkxTZWNwVTEzWCdcbiAgICAgICk7XG4gICAgICBrZXlQYWlyLnBydi5zaG91bGQuZXF1YWwoXG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLMllOMWpTcGlVcFpZUFlmMmhRWkRTWFlIaWtMTGpmZDJDOUxCYXhvVjFTVXROblpHblhleUo2dUZXTWJRVGZqWHFWZmdOcVJCdzV5eWFDdEJLMUFNOFBGM1hadEtqUXAnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNyZWF0ZSB1bnNpZ25lZCByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdGdvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJLZXkgPVxuICAgICAgJ3hwdWI2NjFNeU13QXFSYmNIMW9VQUR4YXRMdUtrVmphREIyelROSm9aUXNHVlFFdm9vZ3BiWEp3MjRRTW9rTndGS2o5UWhjaTZLV2FDY1FLcnpwTDRMQ1FYWFgzWXBUUXhnRDlLTEJqaERyVVdvNCc7XG4gICAgY29uc3QgYmFja3VwS2V5ID1cbiAgICAgICd4cHViNjYxTXlNd0FxUmJjSDFuNnNnWTI5RzdkQXhMN3R3UzhydDFqeXV1UWIxa2ZuQTdzM0ZKUEdvVnFiOUplblhrZUptQzRqWjhpVnNjbjNBSDZNa1lBVmM2MUZUWUNIcHh2NWN4V2FyNUp3M0MnO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gJ2kxc2tkYTNrc280Myc7XG4gICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID0gJ2tzMTNrZGgyNDVscyc7XG5cbiAgICAvLyBtb2NrIHJlc3BvbnNlcyB0byB0aGUgYmxvY2sgY2hhaW5cbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IGNhbGxCYWNrID0gc2FuZEJveC5zdHViKEVvcy5wcm90b3R5cGUsICdnZXREYXRhRnJvbU5vZGUnIGFzIGFueSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9hY2NvdW50JyxcbiAgICAgICAgcGF5bG9hZDogeyBhY2NvdW50X25hbWU6IHJvb3RBZGRyZXNzIH0sXG4gICAgICB9KVxuICAgICAgLnJlc29sdmVzKEVvc1Jlc3BvbnNlcy5nZXRBY2NvdW50UmVzcG9uc2VTdWNjZXNzMSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9hY2NvdW50JyxcbiAgICAgICAgcGF5bG9hZDogeyBhY2NvdW50X25hbWU6IGRlc3RpbmF0aW9uQWRkcmVzcyB9LFxuICAgICAgfSlcbiAgICAgIC5yZXNvbHZlcyhFb3NSZXNwb25zZXMuZ2V0QWNjb3VudFJlc3BvbnNlU3VjY2VzczIpO1xuICAgIGNhbGxCYWNrXG4gICAgICAud2l0aEFyZ3Moe1xuICAgICAgICBlbmRwb2ludDogJy92MS9jaGFpbi9nZXRfaW5mbycsXG4gICAgICB9KVxuICAgICAgLnJlc29sdmVzKEVvc1Jlc3BvbnNlcy5nZXRJbmZvUmVzcG9uc2VTdWNjZXNzMSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9ibG9jaycsXG4gICAgICAgIHBheWxvYWQ6IHsgYmxvY2tfbnVtX29yX2lkOiAxOTE4Mzk0NzIgfSxcbiAgICAgIH0pXG4gICAgICAucmVzb2x2ZXMoRW9zUmVzcG9uc2VzLmdldEJsb2NrUmVzcG9uc2VTdWNjZXNzMSk7XG5cbiAgICAvLyBjYW4gY3JlYXRlIHVuc2lnbmVkIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICB1c2VyS2V5LFxuICAgICAgYmFja3VwS2V5LFxuICAgICAgYml0Z29LZXk6ICdrZXknLFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgcm9vdEFkZHJlc3MsXG4gICAgfSk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnNS4wMDAwJyk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgIC8vIGNvaW4gYW5kIHR4SGV4IGZpZWxkcyBhcmUgZXhwZWN0ZWQgZHVyaW5nIHJlY292ZXJ5IG9mIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHVzaW5nIE9WQ1xuICAgIHVuc2lnbmVkUmVjb3ZlcnlUcmFuc2FjdGlvbi5jb2luLnNob3VsZC5lcXVhbCgndGVvcycpO1xuICAgIHVuc2lnbmVkUmVjb3ZlcnlUcmFuc2FjdGlvbi50eEhleC5zaG91bGQuZXF1YWwoXG4gICAgICAnMmEwMmEwMDUzZTVhOGNmNzNhNTZiYTBmZGExMWU0ZDkyZTAyMzhhNGEyYWE3NGZjY2Y0NmQ1YTkxMDc0Njg0MDhjZGNkYjYwZjAzY2Y0YTllNTNjMDAwMDAwMDAwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDEzMDA4YzU3MDk4MDQ3MTcwMDAwMDAwMDBhOGVkMzIzMjIxMzAwOGM1NzA5ODA0NzE3MDgwNjMyMWEyMjUzODAyODY1MGMzMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICk7XG5cbiAgICAvLyBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCByb290IGFkZHJlc3MgY2FuIGluY2x1ZGUgbWVtb0lkXG4gICAgY29uc3QgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uMiA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgdXNlcktleSxcbiAgICAgIGJhY2t1cEtleSxcbiAgICAgIGJpdGdvS2V5OiAna2V5JyxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IGAke2Rlc3RpbmF0aW9uQWRkcmVzc30/bWVtb0lkPTBgLFxuICAgICAgcm9vdEFkZHJlc3M6IGAke3Jvb3RBZGRyZXNzfT9tZW1vSWQ9MGAsXG4gICAgfSk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzUuMDAwMCcpO1xuICAgIHVuc2lnbmVkUmVjb3ZlcnlUcmFuc2FjdGlvbjIudHJhbnNhY3Rpb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgLy8gY29pbiBhbmQgdHhIZXggZmllbGRzIGFyZSBleHBlY3RlZCBkdXJpbmcgcmVjb3Zlcnkgb2YgdW5zaWduZWQgdHJhbnNhY3Rpb24gdXNpbmcgT1ZDXG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLmNvaW4uc2hvdWxkLmVxdWFsKCd0ZW9zJyk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLnR4SGV4LnNob3VsZC5lcXVhbChcbiAgICAgICcyYTAyYTAwNTNlNWE4Y2Y3M2E1NmJhMGZkYTExZTRkOTJlMDIzOGE0YTJhYTc0ZmNjZjQ2ZDVhOTEwNzQ2ODQwOGNkY2RiNjBmMDNjZjRhOWU1M2MwMDAwMDAwMDAxMDBhNjgyMzQwM2VhMzA1NTAwMDAwMDU3MmQzY2NkY2QwMTMwMDhjNTcwOTgwNDcxNzAwMDAwMDAwMGE4ZWQzMjMyMjEzMDA4YzU3MDk4MDQ3MTcwODA2MzIxYTIyNTM4MDI4NjUwYzMwMDAwMDAwMDAwMDAwNDQ1NGY1MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gICAgKTtcblxuICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IEVycm9yTm9JbnB1dFRvUmVjb3ZlciB3aGVuIHRoZSBhY2NvdW50IGhhcyBubyBsaXF1aWQgYmFsYW5jZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1c2VyS2V5ID1cbiAgICAgICd4cHViNjYxTXlNd0FxUmJjSDFvVUFEeGF0THVLa1ZqYURCMnpUTkpvWlFzR1ZRRXZvb2dwYlhKdzI0UU1va053RktqOVFoY2k2S1dhQ2NRS3J6cEw0TENRWFhYM1lwVFF4Z0Q5S0xCamhEclVXbzQnO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9XG4gICAgICAneHB1YjY2MU15TXdBcVJiY0gxbjZzZ1kyOUc3ZEF4TDd0d1M4cnQxanl1dVFiMWtmbkE3czNGSlBHb1ZxYjlKZW5Ya2VKbUM0alo4aVZzY24zQUg2TWtZQVZjNjFGVFlDSHB4djVjeFdhcjVKdzNDJztcbiAgICBjb25zdCByb290QWRkcmVzcyA9ICdpMXNrZGEza3NvNDMnO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uQWRkcmVzcyA9ICdrczEza2RoMjQ1bHMnO1xuXG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihFb3MucHJvdG90eXBlLCAnZ2V0RGF0YUZyb21Ob2RlJyBhcyBhbnkpO1xuICAgIGNhbGxCYWNrXG4gICAgICAud2l0aEFyZ3Moe1xuICAgICAgICBlbmRwb2ludDogJy92MS9jaGFpbi9nZXRfYWNjb3VudCcsXG4gICAgICAgIHBheWxvYWQ6IHsgYWNjb3VudF9uYW1lOiByb290QWRkcmVzcyB9LFxuICAgICAgfSlcbiAgICAgIC5yZXNvbHZlcyh7IHN0YXR1czogMjAwLCBib2R5OiB7IGFjY291bnRfbmFtZTogcm9vdEFkZHJlc3MgfSB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6ICdrZXknLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgICByb290QWRkcmVzcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoRXJyb3JOb0lucHV0VG9SZWNvdmVyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IFJlY292ZXJ5UHJvdmlkZXJFcnJvciB3aGVuIHRoZSBub2RlIHJldHVybnMgYSBub24tMjAwIHJlc3BvbnNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJLZXkgPVxuICAgICAgJ3hwdWI2NjFNeU13QXFSYmNIMW9VQUR4YXRMdUtrVmphREIyelROSm9aUXNHVlFFdm9vZ3BiWEp3MjRRTW9rTndGS2o5UWhjaTZLV2FDY1FLcnpwTDRMQ1FYWFgzWXBUUXhnRDlLTEJqaERyVVdvNCc7XG4gICAgY29uc3QgYmFja3VwS2V5ID1cbiAgICAgICd4cHViNjYxTXlNd0FxUmJjSDFuNnNnWTI5RzdkQXhMN3R3UzhydDFqeXV1UWIxa2ZuQTdzM0ZKUEdvVnFiOUplblhrZUptQzRqWjhpVnNjbjNBSDZNa1lBVmM2MUZUWUNIcHh2NWN4V2FyNUp3M0MnO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gJ2kxc2tkYTNrc280Myc7XG4gICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID0gJ2tzMTNrZGgyNDVscyc7XG5cbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IGNhbGxCYWNrID0gc2FuZEJveC5zdHViKEVvcy5wcm90b3R5cGUsICdnZXREYXRhRnJvbU5vZGUnIGFzIGFueSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9hY2NvdW50JyxcbiAgICAgICAgcGF5bG9hZDogeyBhY2NvdW50X25hbWU6IHJvb3RBZGRyZXNzIH0sXG4gICAgICB9KVxuICAgICAgLnJlc29sdmVzKHsgc3RhdHVzOiA1MDAsIGJvZHk6IHt9IH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogJ2tleScsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgIHJvb3RBZGRyZXNzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChSZWNvdmVyeVByb3ZpZGVyRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbnM6JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRlc3RFeHBsYWluVHJhbnNhY3Rpb24gPSAoaW5wdXQsIGV4cGVjdGVkT3V0cHV0KSA9PlxuICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihpbnB1dCk7XG4gICAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWRUcmFuc2FjdGlvbik7XG4gICAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWRPdXRwdXQpO1xuICAgICAgfTtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgdmFsaWQgdHJhbnNhY3Rpb24gc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlRGF0YSA9ICdhYmNkJztcbiAgICAgIGNvbnN0IHR4ID0ge1xuICAgICAgICB0eEhleDogc2lnbmF0dXJlRGF0YSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIHJlZl9ibG9ja19udW06IDEsXG4gICAgICAgICAgcmVmX2Jsb2NrX3ByZWZpeDogJ2FzZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgc2lnbmF0dXJlczogW10sXG4gICAgICAgICAgcGFja2VkX3RyeDogc2lnbmF0dXJlRGF0YSxcbiAgICAgICAgICBjb21wcmVzc2lvbjogJ25vbmUnLFxuICAgICAgICB9LFxuICAgICAgICByZWNpcGllbnRzOiBbe31dLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2VlZCA9IEJ1ZmZlci5mcm9tKCdjM2IwOWMyNDczMWJlMjg1MWI2MjRkOWQ1YjNmNjBmYTEyOTY5NWMyNDA3MTc2OGQxNTY1NGJlYTIwN2I3YmI2JywgJ2hleCcpO1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcblxuICAgICAgY29uc3QgeyBoYWxmU2lnbmVkIH0gPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB0eCwgcHJ2OiBrZXlQYWlyLnBydiB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGhhbGZTaWduZWQudHJhbnNhY3Rpb24uc2lnbmF0dXJlc1swXTtcbiAgICAgIGNvbnN0IGhkTm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoa2V5UGFpci5wdWIpO1xuICAgICAgY29uc3QgZW9zUHVia2V5ID0gZWNjLlB1YmxpY0tleS5mcm9tQnVmZmVyKGhkTm9kZS5wdWJsaWNLZXkpLnRvU3RyaW5nKCk7XG4gICAgICBlY2MudmVyaWZ5KHNpZ25hdHVyZSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlRGF0YSwgJ2hleCcpLCBlb3NQdWJrZXkpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYW4gRU9TIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpblRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgcmVmX2Jsb2NrX3ByZWZpeDogMTAwLFxuICAgICAgICAgIHJlZl9ibG9ja19udW06IDk5NSxcbiAgICAgICAgICBleHBpcmF0aW9uOiAnMjAxOC0wNC0yN1QxODo0MDozNC4wMDBaJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgICBwYWNrZWRfdHJ4OlxuICAgICAgICAgICAgJ2EyNmVlMzVhZTMwMzY0MDAwMDAwMDAwMDAwMDAwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDE5MDEzZTQ4YzhjZTVlZWQ0MDAwMDAwMDBhOGVkMzIzMjIyOTAxM2U0OGM4Y2U1ZWVkNGIwMTIzNjJiNjFiMzEyMzY2NDAwMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDAxMzEwMCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUeCA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluVHJhbnNhY3Rpb25QYXJhbXMpO1xuICAgICAgZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBleHBsYWluZWRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBleHBsYWluZWRUeC5vdXRwdXRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgZXhwbGFpbmVkVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnYXNkZmFzZGZhc2RmJyk7XG4gICAgICBleHBsYWluZWRUeC5pZC5zaG91bGQuZXF1YWwoJzYxMzJmM2JmNGE3NDZlNmVjYWQ4YTMxZGY2N2Q3MWI0NzQxZmM1YjdjODY4YWUzNmRkZTE4MzA5YTkxZGY4YTYnKTtcbiAgICAgIGV4cGxhaW5lZFR4Lm1lbW8uc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgfSk7XG4gICAgaXQoXG4gICAgICAnZXhwbGFpbnMgRU9TIG5hdGl2ZSB0cmFuc2ZlciB0cmFuc2FjdGlvbicsXG4gICAgICB0ZXN0RXhwbGFpblRyYW5zYWN0aW9uKEVvc0lucHV0cy5leHBsYWluVHJhbnNhY3Rpb25JbnB1dE5hdGl2ZSwgRW9zUmVzcG9uc2VzLmV4cGxhaW5UcmFuc2FjdGlvbk91dHB1dE5hdGl2ZSlcbiAgICApO1xuICAgIGl0KFxuICAgICAgJ2V4cGxhaW5zIENIRVggdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLFxuICAgICAgdGVzdEV4cGxhaW5UcmFuc2FjdGlvbihFb3NJbnB1dHMuZXhwbGFpblRyYW5zYWN0aW9uSW5wdXRDaGV4LCBFb3NSZXNwb25zZXMuZXhwbGFpblRyYW5zYWN0aW9uT3V0cHV0Q2hleClcbiAgICApO1xuICAgIGl0KFxuICAgICAgJ2V4cGxhaW4gRU9TIFVuc3Rha2UxIHRyYW5zYWN0aW9uJyxcbiAgICAgIHRlc3RFeHBsYWluVHJhbnNhY3Rpb24oRW9zSW5wdXRzLmV4cGxhaW5VbnN0YWtlSW5wdXQxLCBFb3NSZXNwb25zZXMuZXhwbGFpblVuc3Rha2VPdXRwdXQxKVxuICAgICk7XG4gICAgaXQoXG4gICAgICAnZXhwbGFpbiBFT1MgVW5zdGFrZTIgdHJhbnNhY3Rpb24nLFxuICAgICAgdGVzdEV4cGxhaW5UcmFuc2FjdGlvbihFb3NJbnB1dHMuZXhwbGFpblVuc3Rha2VJbnB1dDIsIEVvc1Jlc3BvbnNlcy5leHBsYWluVW5zdGFrZU91dHB1dDIpXG4gICAgKTtcbiAgICBpdChcbiAgICAgICdleHBsYWluIEVPUyBSZWZ1bmQgdHJhbnNhY3Rpb24nLFxuICAgICAgdGVzdEV4cGxhaW5UcmFuc2FjdGlvbihFb3NJbnB1dHMuZXhwbGFpblJlZnVuZElucHV0LCBFb3NSZXNwb25zZXMuZXhwbGFpblJlZnVuZE91dHB1dClcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVmVyaWZpY2F0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ7XG4gICAgbGV0IGJhc2Vjb2luO1xuICAgIGxldCB2ZXJpZmljYXRpb247XG4gICAgbGV0IHNhbmRCb3g7XG4gICAgbGV0IG5ld1R4UHJlYnVpbGQ7XG4gICAgbGV0IG5ld1R4UGFyYW1zO1xuXG4gICAgYmVmb3JlKGFzeW5jICgpID0+IHtcbiAgICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVvcycpO1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICc1YTc4ZGQ1NjFjNjI1OGE5MDdmMWVlYWVlMTMyZjc5NicsXG4gICAgICAgIHVzZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlcjogJzU0M2MxMWVkMzU2ZDAwY2I3NjAwMDAwYjk4Nzk0NTAzJyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ2FkbWluJywgJ3ZpZXcnLCAnc3BlbmQnXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjb2luOiAndGVvcycsXG4gICAgICAgIGxhYmVsOiAnVmVyaWZpY2F0aW9uIFdhbGxldCcsXG4gICAgICAgIG06IDIsXG4gICAgICAgIG46IDMsXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNWE3OGRkNTZiZmU0MjRhYTA3YWEwNjg2NTFiMTk0ZmQnLFxuICAgICAgICAgICc1YTc4ZGQ1Njc0YTcwZWI0MDc5ZjU4Nzk3ZGZlMmY1ZScsXG4gICAgICAgICAgJzVhNzhkZDU2MWM2MjU4YTkwN2YxZWVhOWYxZDA3OWUyJyxcbiAgICAgICAgXSxcbiAgICAgICAgdGFnczogWyc1YTc4ZGQ1NjFjNjI1OGE5MDdmMWVlYWVlMTMyZjc5NiddLFxuICAgICAgICBkaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zOiBmYWxzZSxcbiAgICAgICAgZnJlZXplOiB7fSxcbiAgICAgICAgZGVsZXRlZDogZmFsc2UsXG4gICAgICAgIGFwcHJvdmFsc1JlcXVpcmVkOiAxLFxuICAgICAgICBpc0NvbGQ6IHRydWUsXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIGNsaWVudEZsYWdzOiBbXSxcbiAgICAgICAgYmFsYW5jZTogNjUwMDAwMDAwLFxuICAgICAgICBjb25maXJtZWRCYWxhbmNlOiA2NTAwMDAwMDAsXG4gICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IDY1MDAwMDAwMCxcbiAgICAgICAgYmFsYW5jZVN0cmluZzogJzY1MDAwMDAwMCcsXG4gICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6ICc2NTAwMDAwMDAnLFxuICAgICAgICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nOiAnNjUwMDAwMDAwJyxcbiAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHtcbiAgICAgICAgICBpZDogJzVhNzhkZTJiYmZlNDI0YWEwN2FhMTMxZWMwM2M4ZGMxJyxcbiAgICAgICAgICBhZGRyZXNzOiAnNzh4Y3poYWlqeWhlazInLFxuICAgICAgICAgIGNoYWluOiAwLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIGNvaW46ICd0ZW9zJyxcbiAgICAgICAgICB3YWxsZXQ6ICc1YTc4ZGQ1NjFjNjI1OGE5MDdmMWVlYWVlMTMyZjc5NicsXG4gICAgICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICB9O1xuICAgICAgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuICAgICAgY29uc3QgdXNlcktleWNoYWluID0ge1xuICAgICAgICBwcnY6ICc1S0pxNTY1SFRyZ0VKRzlFYnZKSDVCTFlUZ2lvQXlZMjdkVDlhbTFrQ3RuMllWQUpFWUsnLFxuICAgICAgICBwdWI6ICdFT1M2ZzdBQU1Ra2hYcDhqNzNFOEJENEtSd3RRZXZFc0ZnWXg4aHRhUWtSVmhoWEpNZ2tNWicsXG4gICAgICB9O1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSB7XG4gICAgICAgIHBydjogJzVLWjFuWFhDaTV5WEg4QWpDSnFqbkNZSENWbmhRYTlZV0dWMkQxNGk4ZzIyMWR4TndMVycsXG4gICAgICAgIHB1YjogJ0VPUzdneURMTmsxMmZhVmIxYXFOeGoxTDJEcEJlckZraEFzeEJzOTV5VzN5eEpwcXZnOU10JyxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ2xpb250ZXN0ZTIxMicsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgZXhwaXJhdGlvbjogJzIwMjEtMTAtMjhUMDI6MzQ6MDUuODQ4JyxcbiAgICAgICAgICByZWZfYmxvY2tfbnVtOiA0MjkxNSxcbiAgICAgICAgICByZWZfYmxvY2tfcHJlZml4OiAxMjA0MDg2NzA5LFxuICAgICAgICB9LFxuICAgICAgICB0eEhleDpcbiAgICAgICAgICAnMmEwMmEwMDUzZTVhOGNmNzNhNTZiYTBmZGExMWU0ZDkyZTAyMzhhNGEyYWE3NGZjY2Y0NmQ1YTkxMDc0Njg0MDFlMGM3YTYxYTNhN2I1ZTdjNDQ3MDAwMDAwMDEwMDQwOGM3YTAyZWEzMDU1MDAwMDAwMDAwMDg1MjY5ZDAwMDMwMjMzMzMwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDEyMGNlYjg0MzczMzM0MjdjMDAwMDAwMDBhOGVkMzIzMjIyMjBjZWI4NDM3MzMzNDI3YzIwODI1MDE5YWIzY2E5OGJlODAzMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDAxMzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB0cmFuc2FjdGlvbjoge1xuICAgICAgICAgIGNvbXByZXNzaW9uOiAnbm9uZScsXG4gICAgICAgICAgcGFja2VkX3RyeDpcbiAgICAgICAgICAgICcxZTBjN2E2MWEzYTdiNWU3YzQ0NzAwMDAwMDAxMDA0MDhjN2EwMmVhMzA1NTAwMDAwMDAwMDA4NTI2OWQwMDAzMDIzMzMzMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxMjBjZWI4NDM3MzMzNDI3YzAwMDAwMDAwYThlZDMyMzIyMjIwY2ViODQzNzMzMzQyN2MyMDgyNTAxOWFiM2NhOThiZTgwMzAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwMTMxMDAnLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICB0eGlkOiAnNTg2YzViNTliMTBiMTM0ZDA0YzE2YWMxYjI3M2ZlM2M1NTI5ZjM0YWVmNzVkYjQ0NTZjZDQ2OWM1Y2RhYzdlMicsXG4gICAgICAgIGlzVm90aW5nVHJhbnNhY3Rpb246IGZhbHNlLFxuICAgICAgICBjb2luOiAndGVvcycsXG4gICAgICB9O1xuICAgICAgdmVyaWZpY2F0aW9uID0ge1xuICAgICAgICBkaXNhYmxlTmV0d29ya2luZzogdHJ1ZSxcbiAgICAgICAga2V5Y2hhaW5zOiB7XG4gICAgICAgICAgdXNlcjogeyBwdWI6IHVzZXJLZXljaGFpbi5wdWIgfSxcbiAgICAgICAgICBiYWNrdXA6IHsgcHViOiBiYWNrdXBLZXljaGFpbi5wdWIgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzZWVkID0gQnVmZmVyLmZyb20oJ2MzYjA5YzI0NzMxYmUyODUxYjYyNGQ5ZDViM2Y2MGZhMTI5Njk1YzI0MDcxNzY4ZDE1NjU0YmVhMjA3YjdiYjYnLCAnaGV4Jyk7XG4gICAgICBjb25zdCBrZXlQYWlyID0gYmFzZWNvaW4uZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHBydjoga2V5UGFpci5wcnYsXG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnbGlvbnRlc3RlMjEyP21lbW9JZD0xJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBuZXdUeFByZWJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQcmVidWlsZCk7XG4gICAgICB9O1xuICAgICAgbmV3VHhQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBfLmNsb25lRGVlcCh0eFBhcmFtcyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBtb2NrIHJlc3BvbnNlcyB0byB0aGUgYmxvY2sgY2hhaW5cbiAgICAgIHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihFb3MucHJvdG90eXBlLCAnZ2V0RGF0YUZyb21Ob2RlJyBhcyBhbnkpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBlbmRwb2ludDogJy92MS9jaGFpbi9nZXRfaW5mbycsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhFb3NSZXNwb25zZXMuZ2V0SW5mb1Jlc3BvbnNlU3VjY2VzczEpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBlbmRwb2ludDogJy92MS9jaGFpbi9nZXRfYmxvY2snLFxuICAgICAgICAgIHBheWxvYWQ6IHsgYmxvY2tfbnVtX29yX2lkOiAxOTE4Mzk0NzIgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKEVvc1Jlc3BvbnNlcy5nZXRCbG9ja1Jlc3BvbnNlU3VjY2VzczEpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICB2YWxpZFRyYW5zYWN0aW9uLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgdHJhbnNhY3Rpb24gd2l0aG91dCBhIG1lbW9JZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG5cbiAgICAgIC8vIHR4UGFyYW1zIHdpdGggZGlmZmVyZW50IHR4UHJlYnVpbGRcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQyID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgdHhQcmVidWlsZDIucmVjaXBpZW50c1swXS5hZGRyZXNzID0gJ2xpb250ZXN0ZTIxMic7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy50eFByZWJ1aWxkID0gdHhQcmVidWlsZDI7XG5cbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBkaWZmZXJlbnQgcHJlYnVpbGRzIGFyZSBwcm92aWRlZCBpbiB0eFBhcmFtcyBhbmQgdHhQcmVidWlsZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG5cbiAgICAgIC8vIHR4UGFyYW1zIHdpdGggZGlmZmVyZW50IHR4UHJlYnVpbGRcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQyID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgdHhQcmVidWlsZDIucmVjaXBpZW50c1swXS5hZGRyZXNzID0gJ3NhZGpnaGFzbHNkZ28nO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMudHhQcmVidWlsZCA9IHR4UHJlYnVpbGQyO1xuXG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2lucHV0cyB0eFBhcmFtcy50eFByZWJ1aWxkIGFuZCB0eFByZWJ1aWxkIGV4cGVjdGVkIHRvIGJlIGVxdWFsIGJ1dCB3ZXJlIG5vdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB1bnBhY2tlZCB0eEhleCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHVucGFja2VkIHBhY2tlZF90cngnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgdHhQcmVidWlsZC50eEhleCA9XG4gICAgICAgICdlNzBhYWFiODk5N2UxZGZjZTU4ZmJmYWM4MGNiYmI4ZmVjZWM3Yjk5Y2Y5MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNjQwMDAwMDAwMDAwMDAwMTAwNDA4YzdhMDJlYTMwNTUwMDAwMDAwMDAwODUyNjlkMDAwMjAxMzEwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDFkMGY5Y2U2NGY0MzdmN2NmMDAwMDAwMDBhOGVkMzIzMjIyZDBmOWNlNjRmNDM3ZjdjZmIwMTIzNjJiNjFiMzEyMzY2NDAwMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDAxMzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMudHhQcmVidWlsZCA9IHR4UHJlYnVpbGQ7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3VucGFja2VkIHBhY2tlZF90cnggYW5kIHVucGFja2VkIHR4SGV4IGFyZSBub3QgZXF1YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdGhlIGV4cGVjdGVkIGFtb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBhY3R1YWwgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50ID0gMTAwMDA7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3R4SGV4IHJlY2VpdmUgYW1vdW50IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHJlY2lwaWVudCBhbW91bnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdGhlIGV4cGVjdGVkIHJlY2lwaWVudCBpcyBkaWZmZXJlbnQgdGhhbiBhY3R1YWwgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyA9ICdhYWFhYWFhYWFhYWEnO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd0eEhleCByZWNlaXZlIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgcmVjaXBpZW50IGFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdGhlIGV4cGVjdGVkIG1lbW8gaXMgZGlmZmVyZW50IHRoYW4gYWN0dWFsIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzID0gJ2xpb250ZXN0ZTIxMj9tZW1vSWQ9MTAnO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd0eEhleCByZWNlaXZlIG1lbW9JZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCByZWNpcGllbnQgbWVtb0lkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0cmFuc2FjdGlvbiB3aXRoIG1lbW8gaWQgaW4gcGFyYW1zIG9ubHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuXG4gICAgICB0eFByZWJ1aWxkLmhlYWRlcnMgPSB7XG4gICAgICAgIGV4cGlyYXRpb246ICcyMDIxLTExLTA4VDE3OjI0OjQ3Ljc5MicsXG4gICAgICAgIHJlZl9ibG9ja19udW06IDEsXG4gICAgICAgIHJlZl9ibG9ja19wcmVmaXg6IDEwMCxcbiAgICAgIH07XG4gICAgICAvLyBoYXMgbWVtb2lkIGluIHRoZSB0eGFjdGlvbiB3aXRoIHZhbHVlIG9mICcxJ1xuICAgICAgdHhQcmVidWlsZC50eEhleCA9XG4gICAgICAgICdlNzBhYWFiODk5N2UxZGZjZTU4ZmJmYWM4MGNiYmI4ZmVjZWM3Yjk5Y2Y5ODJhOTQ0NDI3M2NiYzY0YzQxNDczNjA1ZDg5NjEwMTAwNjQwMDAwMDAwMDAwMDAwMTAwNDA4YzdhMDJlYTMwNTUwMDAwMDAwMDAwODUyNjlkMDAwMjAxMzAwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDEwMDFkZDlmOWEwMDBhNTNkMDAwMDAwMDBhOGVkMzIzMjIyMDAxZGQ5ZjlhMDAwYTUzZDIwODI1MDE5YWIzY2E5OGJlODAzMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDAxMzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICAgICAgdHhQcmVidWlsZC50cmFuc2FjdGlvbi5wYWNrZWRfdHJ4ID1cbiAgICAgICAgJzYwNWQ4OTYxMDEwMDY0MDAwMDAwMDAwMDAwMDEwMDQwOGM3YTAyZWEzMDU1MDAwMDAwMDAwMDg1MjY5ZDAwMDIwMTMwMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxMDAxZGQ5ZjlhMDAwYTUzZDAwMDAwMDAwYThlZDMyMzIyMjAwMWRkOWY5YTAwMGE1M2QyMDgyNTAxOWFiM2NhOThiZTgwMzAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwMTMxMDAnO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzID0gJ2xpb250ZXN0ZTIxMic7XG4gICAgICB0eFBhcmFtcy50eFByZWJ1aWxkID0gdHhQcmVidWlsZDtcblxuICAgICAgY29uc3QgdmFsaWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0cmFuc2FjdGlvbiB3aXRoIGFscGhhIG51bWVyaWMgbWVtbyBpZCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuXG4gICAgICB0eFByZWJ1aWxkLmhlYWRlcnMgPSB7XG4gICAgICAgIGV4cGlyYXRpb246ICcyMDIxLTExLTA4VDE3OjU1OjE3LjUxOCcsXG4gICAgICAgIHJlZl9ibG9ja19udW06IDEsXG4gICAgICAgIHJlZl9ibG9ja19wcmVmaXg6IDEwMCxcbiAgICAgIH07XG4gICAgICAvLyBoYXMgbWVtb2lkIGluIHRoZSB0eGFjdGlvbiB3aXRoIHZhbHVlIG9mICdRRzczV0FYWEcnXG4gICAgICB0eFByZWJ1aWxkLnR4SGV4ID1cbiAgICAgICAgJ2U3MGFhYWI4OTk3ZTFkZmNlNThmYmZhYzgwY2JiYjhmZWNlYzdiOTljZjk4MmE5NDQ0MjczY2JjNjRjNDE0NzM4NjY0ODk2MTAxMDA2NDAwMDAwMDAwMDAwMDAxMDA0MDhjN2EwMmVhMzA1NTAwMDAwMDAwMDA4NTI2OWQwMDAyMDEzMDAxMDBhNjgyMzQwM2VhMzA1NTAwMDAwMDU3MmQzY2NkY2QwMTMwODViOTQzYjFiNTRlZDcwMDAwMDAwMGE4ZWQzMjMyMmEzMDg1Yjk0M2IxYjU0ZWQ3MjA4MjUwMTlhYjNjYTk4YmU4MDMwMDAwMDAwMDAwMDAwNDQ1NGY1MzAwMDAwMDAwMDk1MTQ3MzczMzU3NDE1ODU4NDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICAgICAgdHhQcmVidWlsZC50cmFuc2FjdGlvbi5wYWNrZWRfdHJ4ID1cbiAgICAgICAgJzg2NjQ4OTYxMDEwMDY0MDAwMDAwMDAwMDAwMDEwMDQwOGM3YTAyZWEzMDU1MDAwMDAwMDAwMDg1MjY5ZDAwMDIwMTMwMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxMzA4NWI5NDNiMWI1NGVkNzAwMDAwMDAwYThlZDMyMzIyYTMwODViOTQzYjFiNTRlZDcyMDgyNTAxOWFiM2NhOThiZTgwMzAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwOTUxNDczNzMzNTc0MTU4NTg0NzAwJztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyA9ICdsaW9udGVzdGUyMTInO1xuICAgICAgdHhQYXJhbXMudHhQcmVidWlsZCA9IHR4UHJlYnVpbGQ7XG5cbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=eosToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eosToken.d.ts","sourceRoot":"","sources":["../../../test/unit/eosToken.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}