@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.43 → 1.4.3-alpha.431

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/index.js +23 -9
  2. package/dist/src/lib/iface.d.ts +36 -2
  3. package/dist/src/lib/iface.d.ts.map +1 -1
  4. package/dist/src/lib/iface.js +1 -1
  5. package/dist/src/lib/index.js +23 -9
  6. package/dist/src/lib/keyPair.js +41 -27
  7. package/dist/src/lib/multisigUtils.js +36 -23
  8. package/dist/src/lib/transaction.d.ts.map +1 -1
  9. package/dist/src/lib/transaction.js +41 -25
  10. package/dist/src/lib/transactionBuilder.d.ts +2 -1
  11. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  12. package/dist/src/lib/transactionBuilder.js +17 -16
  13. package/dist/src/lib/transferBuilder.js +1 -1
  14. package/dist/src/lib/utils.d.ts +42 -27
  15. package/dist/src/lib/utils.d.ts.map +1 -1
  16. package/dist/src/lib/utils.js +70 -38
  17. package/dist/src/xtz.d.ts +50 -5
  18. package/dist/src/xtz.d.ts.map +1 -1
  19. package/dist/src/xtz.js +228 -8
  20. package/dist/test/fixtures.d.ts +571 -0
  21. package/dist/test/fixtures.d.ts.map +1 -0
  22. package/dist/test/fixtures.js +656 -0
  23. package/dist/test/resources.d.ts +451 -0
  24. package/dist/test/resources.d.ts.map +1 -0
  25. package/dist/test/resources.js +349 -0
  26. package/dist/test/unit/keyPair.d.ts +2 -0
  27. package/dist/test/unit/keyPair.d.ts.map +1 -0
  28. package/dist/test/unit/keyPair.js +142 -0
  29. package/dist/test/unit/offlineTransactionBuilder.d.ts +2 -0
  30. package/dist/test/unit/offlineTransactionBuilder.d.ts.map +1 -0
  31. package/dist/test/unit/offlineTransactionBuilder.js +291 -0
  32. package/dist/test/unit/transaction.d.ts +2 -0
  33. package/dist/test/unit/transaction.d.ts.map +1 -0
  34. package/dist/test/unit/transaction.js +101 -0
  35. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  36. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  37. package/dist/test/unit/transactionBuilder.js +656 -0
  38. package/dist/test/unit/transferBuilder.d.ts +2 -0
  39. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  40. package/dist/test/unit/transferBuilder.js +82 -0
  41. package/dist/test/unit/util.d.ts +2 -0
  42. package/dist/test/unit/util.d.ts.map +1 -0
  43. package/dist/test/unit/util.js +198 -0
  44. package/dist/test/unit/xtz.d.ts +2 -0
  45. package/dist/test/unit/xtz.d.ts.map +1 -0
  46. package/dist/test/unit/xtz.js +192 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/package.json +19 -14
  49. package/.eslintignore +0 -5
  50. package/.mocharc.yml +0 -8
  51. package/CHANGELOG.md +0 -118
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transferBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const transferBuilder_1 = require("../../src/lib/transferBuilder");
9
+ describe('Tezos Transfer builder', function () {
10
+ describe('should build', () => {
11
+ it('a valid transfer with minimum fields', async () => {
12
+ const builder = new transferBuilder_1.TransferBuilder();
13
+ const transfer = builder.amount('10').from('a').to('b').fee('20').build();
14
+ transfer.amount.should.equal('10');
15
+ should_1.default.not.exist(transfer.coin);
16
+ transfer.from.should.equal('a');
17
+ transfer.to.should.equal('b');
18
+ transfer.fee.fee.should.equal('20');
19
+ should_1.default.not.exist(transfer.fee.gasLimit);
20
+ should_1.default.not.exist(transfer.fee.storageLimit);
21
+ should_1.default.not.exist(transfer.counter);
22
+ should_1.default.not.exist(transfer.dataToSign);
23
+ });
24
+ it('a valid transfer with all fields', async () => {
25
+ const builder = new transferBuilder_1.TransferBuilder();
26
+ const transfer = builder
27
+ .amount('10')
28
+ .coin('testCoin')
29
+ .from('a')
30
+ .to('b')
31
+ .fee('20')
32
+ .gasLimit('30')
33
+ .storageLimit('40')
34
+ .counter('0')
35
+ .dataToSign('someEncodedData')
36
+ .build();
37
+ transfer.amount.should.equal('10');
38
+ should_1.default.exist(transfer.coin);
39
+ transfer.coin.should.equal('testCoin');
40
+ transfer.from.should.equal('a');
41
+ transfer.to.should.equal('b');
42
+ transfer.fee.fee.should.equal('20');
43
+ should_1.default.exist(transfer.fee.gasLimit);
44
+ transfer.fee.gasLimit.should.equal('30');
45
+ should_1.default.exist(transfer.fee.storageLimit);
46
+ transfer.fee.storageLimit.should.equal('40');
47
+ should_1.default.exist(transfer.counter);
48
+ transfer.counter.should.equal('0');
49
+ should_1.default.exist(transfer.dataToSign);
50
+ transfer.dataToSign.should.equal('someEncodedData');
51
+ });
52
+ });
53
+ describe('should fail to', () => {
54
+ it('build an empty transfer', async () => {
55
+ const builder = new transferBuilder_1.TransferBuilder();
56
+ assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
57
+ });
58
+ it('build a transfer without amount', async () => {
59
+ const builder = new transferBuilder_1.TransferBuilder()
60
+ .from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
61
+ .to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A')
62
+ .fee('20');
63
+ assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
64
+ });
65
+ it('build a transfer without from address', async () => {
66
+ const builder = new transferBuilder_1.TransferBuilder().amount('10').to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A').fee('20');
67
+ assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
68
+ });
69
+ it('build a transfer without destination address', async () => {
70
+ const builder = new transferBuilder_1.TransferBuilder().amount('10').from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL').fee('20');
71
+ assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
72
+ });
73
+ it('build a transfer without fee', async () => {
74
+ const builder = new transferBuilder_1.TransferBuilder()
75
+ .amount('10')
76
+ .from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
77
+ .to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
78
+ assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
79
+ });
80
+ });
81
+ });
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFFNUIsbUVBQWdFO0FBRWhFLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQ0FBZSxFQUFFLENBQUM7WUFDdEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxRSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEs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RUFBRSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDOUMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNmZXJCdWlsZGVyJztcblxuZGVzY3JpYmUoJ1Rlem9zIFRyYW5zZmVyIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQnLCAoKSA9PiB7XG4gICAgaXQoJ2EgdmFsaWQgdHJhbnNmZXIgd2l0aCBtaW5pbXVtIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0cmFuc2ZlciA9IGJ1aWxkZXIuYW1vdW50KCcxMCcpLmZyb20oJ2EnKS50bygnYicpLmZlZSgnMjAnKS5idWlsZCgpO1xuICAgICAgdHJhbnNmZXIuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHJhbnNmZXIuY29pbik7XG4gICAgICB0cmFuc2Zlci5mcm9tLnNob3VsZC5lcXVhbCgnYScpO1xuICAgICAgdHJhbnNmZXIudG8uc2hvdWxkLmVxdWFsKCdiJyk7XG4gICAgICB0cmFuc2Zlci5mZWUuZmVlLnNob3VsZC5lcXVhbCgnMjAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHJhbnNmZXIuZmVlLmdhc0xpbWl0KTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHJhbnNmZXIuZmVlLnN0b3JhZ2VMaW1pdCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHRyYW5zZmVyLmNvdW50ZXIpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0cmFuc2Zlci5kYXRhVG9TaWduKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHZhbGlkIHRyYW5zZmVyIHdpdGggYWxsIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0cmFuc2ZlciA9IGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAnKVxuICAgICAgICAuY29pbigndGVzdENvaW4nKVxuICAgICAgICAuZnJvbSgnYScpXG4gICAgICAgIC50bygnYicpXG4gICAgICAgIC5mZWUoJzIwJylcbiAgICAgICAgLmdhc0xpbWl0KCczMCcpXG4gICAgICAgIC5zdG9yYWdlTGltaXQoJzQwJylcbiAgICAgICAgLmNvdW50ZXIoJzAnKVxuICAgICAgICAuZGF0YVRvU2lnbignc29tZUVuY29kZWREYXRhJylcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICB0cmFuc2Zlci5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zZmVyLmNvaW4pO1xuICAgICAgdHJhbnNmZXIuY29pbiEuc2hvdWxkLmVxdWFsKCd0ZXN0Q29pbicpO1xuICAgICAgdHJhbnNmZXIuZnJvbS5zaG91bGQuZXF1YWwoJ2EnKTtcbiAgICAgIHRyYW5zZmVyLnRvLnNob3VsZC5lcXVhbCgnYicpO1xuICAgICAgdHJhbnNmZXIuZmVlLmZlZS5zaG91bGQuZXF1YWwoJzIwJyk7XG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNmZXIuZmVlLmdhc0xpbWl0KTtcbiAgICAgIHRyYW5zZmVyLmZlZS5nYXNMaW1pdCEuc2hvdWxkLmVxdWFsKCczMCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zZmVyLmZlZS5zdG9yYWdlTGltaXQpO1xuICAgICAgdHJhbnNmZXIuZmVlLnN0b3JhZ2VMaW1pdCEuc2hvdWxkLmVxdWFsKCc0MCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zZmVyLmNvdW50ZXIpO1xuICAgICAgdHJhbnNmZXIuY291bnRlciEuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNmZXIuZGF0YVRvU2lnbik7XG4gICAgICB0cmFuc2Zlci5kYXRhVG9TaWduIS5zaG91bGQuZXF1YWwoJ3NvbWVFbmNvZGVkRGF0YScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8nLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGFuIGVtcHR5IHRyYW5zZmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5idWlsZCgpLCBuZXcgUmVnRXhwKCdNaXNzaW5nIHRyYW5zZmVyIG1hbmRhdG9yeSBmaWVsZHMnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB3aXRob3V0IGFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJylcbiAgICAgICAgLmZlZSgnMjAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5idWlsZCgpLCBuZXcgUmVnRXhwKCdNaXNzaW5nIHRyYW5zZmVyIG1hbmRhdG9yeSBmaWVsZHMnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB3aXRob3V0IGZyb20gYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KCcxMCcpLnRvKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKS5mZWUoJzIwJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuYnVpbGQoKSwgbmV3IFJlZ0V4cCgnTWlzc2luZyB0cmFuc2ZlciBtYW5kYXRvcnkgZmllbGRzJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgd2l0aG91dCBkZXN0aW5hdGlvbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQoJzEwJykuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJykuZmVlKCcyMCcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmJ1aWxkKCksIG5ldyBSZWdFeHAoJ01pc3NpbmcgdHJhbnNmZXIgbWFuZGF0b3J5IGZpZWxkcycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zZmVyIHdpdGhvdXQgZmVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuYW1vdW50KCcxMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmJ1aWxkKCksIG5ldyBSZWdFeHAoJ01pc3NpbmcgdHJhbnNmZXIgbWFuZGF0b3J5IGZpZWxkcycpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const resources_1 = require("../resources");
9
+ const src_1 = require("../../src");
10
+ describe('XTZ util library', function () {
11
+ describe('address', function () {
12
+ it('should validate addresses', function () {
13
+ const validAddresses = [
14
+ 'tz1aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9',
15
+ 'tz2SHdGxFGhs68wYNC4hEqxbWARxp2J4mVxv',
16
+ 'tz3gN8NTLNLJg5KRsUU47NHNVHbdhcFXjjaB',
17
+ 'KT1EGbAxguaWQFkV3Egb2Z1r933MWuEYyrJS',
18
+ ];
19
+ for (const address of validAddresses) {
20
+ src_1.XtzLib.Utils.isValidAddress(address).should.be.true();
21
+ }
22
+ });
23
+ it('should fail to validate invalid addresses', function () {
24
+ const invalidAddresses = [
25
+ 'tz4aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9',
26
+ 'xtz2SHdGxFGhs68wYNC4hEqxbWARxp2J4mVxv',
27
+ 'KT2EGbAxguaWQFkV3Egb2Z1r933MWuEYyrJS',
28
+ 'abc',
29
+ ];
30
+ for (const address of invalidAddresses) {
31
+ should_1.default.doesNotThrow(() => src_1.XtzLib.Utils.isValidAddress(address));
32
+ src_1.XtzLib.Utils.isValidAddress(address).should.be.false();
33
+ }
34
+ });
35
+ });
36
+ describe('block hash', function () {
37
+ it('should validate block hashes', function () {
38
+ const validHashes = [
39
+ 'BKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku',
40
+ 'BL4oxWAkozJ3mJHwVFQqga5dQMBi8kBCPAQyBKgF78z7SQT1AvN',
41
+ 'BL29n92KHaarq1r7XjwTFotzCpxq7LtXMc9bF2qD9Qt26ZTYQia',
42
+ ];
43
+ for (const hash of validHashes) {
44
+ src_1.XtzLib.Utils.isValidBlockHash(hash).should.be.true();
45
+ }
46
+ });
47
+ it('should fail to validate invalid block hashes', function () {
48
+ const invalidHashes = [
49
+ 'AKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku',
50
+ 'BKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku1111111111',
51
+ 'invalid',
52
+ ];
53
+ for (const hash of invalidHashes) {
54
+ src_1.XtzLib.Utils.isValidBlockHash(hash).should.be.false();
55
+ }
56
+ });
57
+ });
58
+ describe('transaction hash', function () {
59
+ it('should validate tx hashes', function () {
60
+ const validHashes = [
61
+ 'opUmZNMueryYFxTbzzocS7K4dzs3NmgKqhhr9TkcftszDDnoRVu',
62
+ 'ookyzxsYF7vyTeDzsgs58XJ4PXuvBkK8wWqZJ4EoRS6RWQb4Y9P',
63
+ 'ooXQoUX32szALRvgzD2TDzeRPXtPfmfqwoehPaK5khbrBiMAtSw',
64
+ ];
65
+ for (const hash of validHashes) {
66
+ src_1.XtzLib.Utils.isValidTransactionHash(hash).should.be.true();
67
+ }
68
+ });
69
+ it('should fail to validate invalid tx hashes', function () {
70
+ const invalidHashes = [
71
+ 'lpUmZNMueryYFxTbzzocS7K4dzs3NmgKqhhr9TkcftszDDnoRVu',
72
+ 'opUmZNMueryYFxTbzzocS7K4dzs3NmgKqhhr9TkcftszDDnoRVu1111111111',
73
+ 'invalid',
74
+ ];
75
+ for (const hash of invalidHashes) {
76
+ src_1.XtzLib.Utils.isValidTransactionHash(hash).should.be.false();
77
+ }
78
+ });
79
+ it('should calculate the transaction hash', async function () {
80
+ const operationId = await src_1.XtzLib.Utils.calculateTransactionId(resources_1.signedSerializedOriginationTransaction);
81
+ operationId.should.equal('opPsNbm7EcqPyryBDDR28BjdthnriktK8TbMvpwc9r4NwmvToYP');
82
+ });
83
+ it('should calculate the originated account address', async function () {
84
+ const accountAddress = await src_1.XtzLib.Utils.calculateOriginatedAddress('opPsNbm7EcqPyryBDDR28BjdthnriktK8TbMvpwc9r4NwmvToYP', 0);
85
+ accountAddress.should.equal('KT1LJvp55fbdNwbisJFign9wA4cPgq9T9oc4');
86
+ });
87
+ });
88
+ describe('sign', function () {
89
+ it('should produce a valid signature', async function () {
90
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, resources_1.defaultDataToSign);
91
+ signatures.bytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
92
+ signatures.prefixSig.should.equal('spsig19yWAc5nBpGmNCWdvEWHnpJXEiTqZjhNgWwWa1Lz6kVgakb7qCPj9z6G6LLEFWmsmNcPCZYseERVDUXh99N7wqDppcDKQM');
93
+ signatures.sbytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b1fd49502ba8dc7adb01716093abe715d1eef87f47a88d8ec104fcc1d6baca7ba06cc2ced6c5baa880d6045b44be926d63bc3aeb3b9124f3b32ac6d9c63584fe5');
94
+ signatures.sig.should.equal('sigS9pqYUXiUJcz2Wsx5x98ud9KtgGVg4gCwpBoDBgHrZy9gwJedKMCrcQPxm9C7i1gesETbhFD6Gm8BpadGgd2cgiGoQbiY');
95
+ });
96
+ it('should produce a valid signature with watermark', async function () {
97
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, resources_1.defaultDataToSign, new Uint8Array());
98
+ signatures.bytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
99
+ signatures.prefixSig.should.equal('spsig1DWTuXdgUg2t64PLRfaapsYejCoCVVkqy2Zjv41Zirt7MjoqSfBnP38qoAg3SWicfQNiG25yMqGYge4jrfrwv9H8hRKDyY');
100
+ signatures.sbytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b3ad76776913e2c0cfe827b572c417b73a14debcf9e5db726ce9b10aa4bea6aa1173b313ff67eb9bdfdcf9a753178e6ac78ac5f53aef8bcca6d56706f5c3fb01f');
101
+ signatures.sig.should.equal('sigVgnaU2S1L4jhtPaTX2SAxsGpP1dRS89VTSR9FrFuxxPvgA2G67QRuez6o6xP7ekagdZX4ELvh7pbMMdLoBSzvk2AVyQpk');
102
+ });
103
+ it('should validate a signature belongs to a public key for a string message', async function () {
104
+ const message = 'helloworld';
105
+ const messageHex = Buffer.from(message).toString('hex');
106
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex, new Uint8Array(0));
107
+ const result = await src_1.XtzLib.Utils.verifySignature(messageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig, new Uint8Array(0));
108
+ result.should.be.true();
109
+ });
110
+ it('should validate a signature belongs to a public key for dataToSign', async function () {
111
+ const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
112
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex, new Uint8Array(0));
113
+ const result = await src_1.XtzLib.Utils.verifySignature(messageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig, new Uint8Array(0));
114
+ result.should.be.true();
115
+ });
116
+ it('should fail to validate a signature with the wrong watermark', async function () {
117
+ const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
118
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex);
119
+ const result = await src_1.XtzLib.Utils.verifySignature(messageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig, new Uint8Array(3));
120
+ result.should.be.false();
121
+ });
122
+ it('should fail to validate a signature with the wrong public key', async function () {
123
+ const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
124
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex);
125
+ const result = await src_1.XtzLib.Utils.verifySignature(messageHex, 'sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf', signatures.sig);
126
+ result.should.be.false();
127
+ });
128
+ it('should fail to validate a signature with the wrong message', async function () {
129
+ const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
130
+ const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex);
131
+ const secondMessageHex = Buffer.from('helloWorld').toString('hex');
132
+ const result = await src_1.XtzLib.Utils.verifySignature(secondMessageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig);
133
+ result.should.be.false();
134
+ });
135
+ it('should fail if the key pair does not have the private key', async function () {
136
+ await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPub, resources_1.defaultDataToSign).should.be.rejectedWith(new RegExp('Missing private key'));
137
+ });
138
+ });
139
+ describe('generateDataToSign', function () {
140
+ it('should build transfer data to sign', function () {
141
+ const dataToSign = src_1.XtzLib.Utils.generateDataToSign('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL', 'tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS', '100', '0');
142
+ JSON.stringify(dataToSign).should.equal(JSON.stringify(resources_1.validDataToSign));
143
+ });
144
+ it('should fail if the contract address has the wrong format', function () {
145
+ assert_1.default.throws(() => src_1.XtzLib.Utils.generateDataToSign('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS', 'tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS', '0', '0'), new RegExp('Invalid contract address'));
146
+ });
147
+ it('should fail if the destination address has the wrong format', function () {
148
+ assert_1.default.throws(() => src_1.XtzLib.Utils.generateDataToSign('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL', 'abc', '0', '0'), new RegExp('Invalid destination address'));
149
+ });
150
+ });
151
+ describe('signature', function () {
152
+ it('should validate signature', function () {
153
+ const validSignatures = [
154
+ 'sigVgnaU2S1L4jhtPaTX2SAxsGpP1dRS89VTSR9FrFuxxPvgA2G67QRuez6o6xP7ekagdZX4ELvh7pbMMdLoBSzvk2AVyQpk',
155
+ 'spsig1DWTuXdgUg2t64PLRfaapsYejCoCVVkqy2Zjv41Zirt7MjoqSfBnP38qoAg3SWicfQNiG25yMqGYge4jrfrwv9H8hRKDyY',
156
+ 'sigS9pqYUXiUJcz2Wsx5x98ud9KtgGVg4gCwpBoDBgHrZy9gwJedKMCrcQPxm9C7i1gesETbhFD6Gm8BpadGgd2cgiGoQbiY',
157
+ 'spsig19yWAc5nBpGmNCWdvEWHnpJXEiTqZjhNgWwWa1Lz6kVgakb7qCPj9z6G6LLEFWmsmNcPCZYseERVDUXh99N7wqDppcDKQM',
158
+ ];
159
+ for (const hash of validSignatures) {
160
+ src_1.XtzLib.Utils.isValidSignature(hash).should.be.true();
161
+ }
162
+ });
163
+ it('should fail to validate invalid signature', function () {
164
+ const invalidHashes = [
165
+ 'sigS9pqYUXiUJcz2Wsx5x98ud9KtgGVg4gCwpBoDBgHrZ',
166
+ 'sig',
167
+ 'BKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku1111111111',
168
+ 'invalid',
169
+ ];
170
+ for (const hash of invalidHashes) {
171
+ src_1.XtzLib.Utils.isValidSignature(hash).should.be.false();
172
+ }
173
+ });
174
+ });
175
+ describe('decodeKey', function () {
176
+ it('should decode the key', function () {
177
+ const validKeys = [['spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL', src_1.XtzLib.Utils.hashTypes.spsk]];
178
+ for (const data of validKeys) {
179
+ src_1.XtzLib.Utils.decodeKey(data[0], data[1])
180
+ .toString('hex')
181
+ .should.equal('9cc0aaa9ef687e70f7780e60de08d7a443488a9cf8e1ebe9689118763376c07c');
182
+ }
183
+ });
184
+ it('should fail to decode an invalid key', function () {
185
+ const invalidKeys = [
186
+ [
187
+ 'sigVgnaU2S1L4jhtPaTX2SAxsGpP1dRS89VTSR9FrFuxxPvgA2G67QRuez6o6xP7ekagdZX4ELvh7pbMMdLoBSzvk2AVyQpk',
188
+ src_1.XtzLib.Utils.hashTypes.tz1,
189
+ ],
190
+ ['sppk', src_1.XtzLib.Utils.hashTypes.sppk],
191
+ ];
192
+ for (const data of invalidKeys) {
193
+ assert_1.default.throws(() => src_1.XtzLib.Utils.decodeKey(data[0], data[1]), new RegExp('Unsupported private key'));
194
+ }
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw0Q0FNc0I7QUFDdEIsbUNBQW1DO0FBR25DLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixNQUFNLGNBQWMsR0FBRztnQkFDckIsc0NBQXNDO2dCQUN0QyxzQ0FBc0M7Z0JBQ3RDLHNDQUFzQztnQkFDdEMsc0NBQXNDO2FBQ3ZDLENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxZQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxNQUFNLGdCQUFnQixHQUFHO2dCQUN2QixzQ0FBc0M7Z0JBQ3RDLHVDQUF1QztnQkFDdkMsc0NBQXNDO2dCQUN0QyxLQUFLO2FBQ04sQ0FBQztZQUVGLEtBQUssTUFBTSxPQUFPLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdkMsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsWUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZ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QyxJQUFJLENBQUMsQ0FBQyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBYSxDQUFDO3FCQUMzRCxRQUFRLENBQUMsS0FBSyxDQUFDO3FCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUN0RixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLGtHQUFrRztvQkFDbEcsWUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRztpQkFDM0I7Z0JBQ0QsQ0FBQyxNQUFNLEVBQUUsWUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2FBQ3RDLENBQUM7WUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxZQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBYSxDQUFDLEVBQ3BFLElBQUksTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQ3RDLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQge1xuICBkZWZhdWx0RGF0YVRvU2lnbixcbiAgZGVmYXVsdEtleVBhaXJGcm9tUHJ2LFxuICBkZWZhdWx0S2V5UGFpckZyb21QdWIsXG4gIHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uLFxuICB2YWxpZERhdGFUb1NpZ24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgSGFzaFR5cGUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcblxuZGVzY3JpYmUoJ1hUWiB1dGlsIGxpYnJhcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzZXMgPSBbXG4gICAgICAgICd0ejFhV1hQMjM3Qkx3TkhKY0NENGIzRHV0Q2V2aHFxMlQxWjknLFxuICAgICAgICAndHoyU0hkR3hGR2hzNjh3WU5DNGhFcXhiV0FSeHAySjRtVnh2JyxcbiAgICAgICAgJ3R6M2dOOE5UTE5MSmc1S1JzVVU0N05ITlZIYmRoY0ZYamphQicsXG4gICAgICAgICdLVDFFR2JBeGd1YVdRRmtWM0VnYjJaMXI5MzNNV3VFWXlySlMnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJ3R6NGFXWFAyMzdCTHdOSEpjQ0Q0YjNEdXRDZXZocXEyVDFaOScsXG4gICAgICAgICd4dHoyU0hkR3hGR2hzNjh3WU5DNGhFcXhiV0FSeHAySjRtVnh2JyxcbiAgICAgICAgJ0tUMkVHYkF4Z3VhV1FGa1YzRWdiMloxcjkzM01XdUVZeXJKUycsXG4gICAgICAgICdhYmMnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBYdHpMaWIuVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgICBYdHpMaWIuVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdibG9jayBoYXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYmxvY2sgaGFzaGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRIYXNoZXMgPSBbXG4gICAgICAgICdCS29pZnM1Z0dmZkF6dVJCY2czeWd4YkxkckNYeUREUzFBTHZNRzhTRllXYWh6b1lNa3UnLFxuICAgICAgICAnQkw0b3hXQWtvekozbUpId1ZGUXFnYTVkUU1CaThrQkNQQVF5QktnRjc4ejdTUVQxQXZOJyxcbiAgICAgICAgJ0JMMjluOTJLSGFhcnExcjdYandURm90ekNweHE3THRYTWM5YkYycUQ5UXQyNlpUWVFpYScsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgdmFsaWRIYXNoZXMpIHtcbiAgICAgICAgWHR6TGliLlV0aWxzLmlzVmFsaWRCbG9ja0hhc2goaGFzaCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGJsb2NrIGhhc2hlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRIYXNoZXMgPSBbXG4gICAgICAgICdBS29pZnM1Z0dmZkF6dVJCY2czeWd4YkxkckNYeUREUzFBTHZNRzhTRllXYWh6b1lNa3UnLFxuICAgICAgICAnQktvaWZzNWdHZmZBenVSQmNnM3lneGJMZHJDWHlERFMxQUx2TUc4U0ZZV2Foem9ZTWt1MTExMTExMTExMScsXG4gICAgICAgICdpbnZhbGlkJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgaGFzaCBvZiBpbnZhbGlkSGFzaGVzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkQmxvY2tIYXNoKGhhc2gpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gaGFzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHR4IGhhc2hlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkSGFzaGVzID0gW1xuICAgICAgICAnb3BVbVpOTXVlcnlZRnhUYnp6b2NTN0s0ZHpzM05tZ0txaGhyOVRrY2Z0c3pERG5vUlZ1JyxcbiAgICAgICAgJ29va3l6eHNZRjd2eVRlRHpzZ3M1OFhKNFBYdXZCa0s4d1dxWko0RW9SUzZSV1FiNFk5UCcsXG4gICAgICAgICdvb1hRb1VYMzJzekFMUnZnekQyVER6ZVJQWHRQZm1mcXdvZWhQYUs1a2hickJpTUF0U3cnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHZhbGlkSGFzaGVzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25IYXNoKGhhc2gpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCB0eCBoYXNoZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkSGFzaGVzID0gW1xuICAgICAgICAnbHBVbVpOTXVlcnlZRnhUYnp6b2NTN0s0ZHpzM05tZ0txaGhyOVRrY2Z0c3pERG5vUlZ1JyxcbiAgICAgICAgJ29wVW1aTk11ZXJ5WUZ4VGJ6em9jUzdLNGR6czNObWdLcWhocjlUa2NmdHN6RERub1JWdTExMTExMTExMTEnLFxuICAgICAgICAnaW52YWxpZCcsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgaW52YWxpZEhhc2hlcykge1xuICAgICAgICBYdHpMaWIuVXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSGFzaChoYXNoKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIHRoZSB0cmFuc2FjdGlvbiBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCBYdHpMaWIuVXRpbHMuY2FsY3VsYXRlVHJhbnNhY3Rpb25JZChzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG4gICAgICBvcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ29wUHNOYm03RWNxUHlyeUJERFIyOEJqZHRobnJpa3RLOFRiTXZwd2M5cjROd212VG9ZUCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdGhlIG9yaWdpbmF0ZWQgYWNjb3VudCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWNjb3VudEFkZHJlc3MgPSBhd2FpdCBYdHpMaWIuVXRpbHMuY2FsY3VsYXRlT3JpZ2luYXRlZEFkZHJlc3MoXG4gICAgICAgICdvcFBzTmJtN0VjcVB5cnlCRERSMjhCamR0aG5yaWt0SzhUYk12cHdjOXI0TndtdlRvWVAnLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgYWNjb3VudEFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFMSnZwNTVmYmROd2Jpc0pGaWduOXdBNGNQZ3E5VDlvYzQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgZGVmYXVsdERhdGFUb1NpZ24pO1xuICAgICAgc2lnbmF0dXJlcy5ieXRlcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYidcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnByZWZpeFNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzcHNpZzE5eVdBYzVuQnBHbU5DV2R2RVdIbnBKWEVpVHFaamhOZ1d3V2ExTHo2a1ZnYWtiN3FDUGo5ejZHNkxMRUZXbXNtTmNQQ1pZc2VFUlZEVVhoOTlON3dxRHBwY0RLUU0nXG4gICAgICApO1xuICAgICAgc2lnbmF0dXJlcy5zYnl0ZXMuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDUwNzA3MGEwMDAwMDAxNjAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwMDcwNzAwMDAwNTA1MDIwMDAwMDAzMjAzMjAwNTNkMDM2ZDA3NDMwMzVkMGEwMDAwMDAxNTAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAzMWUwNzQzMDM2YTAwMDEwMzRmMDM0ZDAzMWIxZmQ0OTUwMmJhOGRjN2FkYjAxNzE2MDkzYWJlNzE1ZDFlZWY4N2Y0N2E4OGQ4ZWMxMDRmY2MxZDZiYWNhN2JhMDZjYzJjZWQ2YzViYWE4ODBkNjA0NWI0NGJlOTI2ZDYzYmMzYWViM2I5MTI0ZjNiMzJhYzZkOWM2MzU4NGZlNSdcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdTOXBxWVVYaVVKY3oyV3N4NXg5OHVkOUt0Z0dWZzRnQ3dwQm9EQmdIclp5OWd3SmVkS01DcmNRUHhtOUM3aTFnZXNFVGJoRkQ2R204QnBhZEdnZDJjZ2lHb1FiaVknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgc2lnbmF0dXJlIHdpdGggd2F0ZXJtYXJrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgZGVmYXVsdERhdGFUb1NpZ24sIG5ldyBVaW50OEFycmF5KCkpO1xuICAgICAgc2lnbmF0dXJlcy5ieXRlcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYidcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnByZWZpeFNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzcHNpZzFEV1R1WGRnVWcydDY0UExSZmFhcHNZZWpDb0NWVmtxeTJaanY0MVppcnQ3TWpvcVNmQm5QMzhxb0FnM1NXaWNmUU5pRzI1eU1xR1lnZTRqcmZyd3Y5SDhoUktEeVknXG4gICAgICApO1xuICAgICAgc2lnbmF0dXJlcy5zYnl0ZXMuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDUwNzA3MGEwMDAwMDAxNjAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwMDcwNzAwMDAwNTA1MDIwMDAwMDAzMjAzMjAwNTNkMDM2ZDA3NDMwMzVkMGEwMDAwMDAxNTAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAzMWUwNzQzMDM2YTAwMDEwMzRmMDM0ZDAzMWIzYWQ3Njc3NjkxM2UyYzBjZmU4MjdiNTcyYzQxN2I3M2ExNGRlYmNmOWU1ZGI3MjZjZTliMTBhYTRiZWE2YWExMTczYjMxM2ZmNjdlYjliZGZkY2Y5YTc1MzE3OGU2YWM3OGFjNWY1M2FlZjhiY2NhNmQ1NjcwNmY1YzNmYjAxZidcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdWZ25hVTJTMUw0amh0UGFUWDJTQXhzR3BQMWRSUzg5VlRTUjlGckZ1eHhQdmdBMkc2N1FSdWV6Nm82eFA3ZWthZ2RaWDRFTHZoN3BiTU1kTG9CU3p2azJBVnlRcGsnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHNpZ25hdHVyZSBiZWxvbmdzIHRvIGEgcHVibGljIGtleSBmb3IgYSBzdHJpbmcgbWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnaGVsbG93b3JsZCc7XG4gICAgICBjb25zdCBtZXNzYWdlSGV4ID0gQnVmZmVyLmZyb20obWVzc2FnZSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgbWVzc2FnZUhleCwgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgWHR6TGliLlV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgbWVzc2FnZUhleCxcbiAgICAgICAgZGVmYXVsdEtleVBhaXJGcm9tUHViLmdldEtleXMoKS5wdWIsXG4gICAgICAgIHNpZ25hdHVyZXMuc2lnLFxuICAgICAgICBuZXcgVWludDhBcnJheSgwKVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHNpZ25hdHVyZSBiZWxvbmdzIHRvIGEgcHVibGljIGtleSBmb3IgZGF0YVRvU2lnbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbShkZWZhdWx0RGF0YVRvU2lnbikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgbWVzc2FnZUhleCwgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgWHR6TGliLlV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgbWVzc2FnZUhleCxcbiAgICAgICAgZGVmYXVsdEtleVBhaXJGcm9tUHViLmdldEtleXMoKS5wdWIsXG4gICAgICAgIHNpZ25hdHVyZXMuc2lnLFxuICAgICAgICBuZXcgVWludDhBcnJheSgwKVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGEgc2lnbmF0dXJlIHdpdGggdGhlIHdyb25nIHdhdGVybWFyaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbShkZWZhdWx0RGF0YVRvU2lnbikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgbWVzc2FnZUhleCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYdHpMaWIuVXRpbHMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICBtZXNzYWdlSGV4LFxuICAgICAgICBkZWZhdWx0S2V5UGFpckZyb21QdWIuZ2V0S2V5cygpLnB1YixcbiAgICAgICAgc2lnbmF0dXJlcy5zaWcsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KDMpXG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGEgc2lnbmF0dXJlIHdpdGggdGhlIHdyb25nIHB1YmxpYyBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZXNzYWdlSGV4ID0gQnVmZmVyLmZyb20oZGVmYXVsdERhdGFUb1NpZ24pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBhd2FpdCBYdHpMaWIuVXRpbHMuc2lnbihkZWZhdWx0S2V5UGFpckZyb21QcnYsIG1lc3NhZ2VIZXgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgWHR6TGliLlV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgbWVzc2FnZUhleCxcbiAgICAgICAgJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnLFxuICAgICAgICBzaWduYXR1cmVzLnNpZ1xuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhIHNpZ25hdHVyZSB3aXRoIHRoZSB3cm9uZyBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWVzc2FnZUhleCA9IEJ1ZmZlci5mcm9tKGRlZmF1bHREYXRhVG9TaWduKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gYXdhaXQgWHR6TGliLlV0aWxzLnNpZ24oZGVmYXVsdEtleVBhaXJGcm9tUHJ2LCBtZXNzYWdlSGV4KTtcbiAgICAgIGNvbnN0IHNlY29uZE1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbSgnaGVsbG9Xb3JsZCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFh0ekxpYi5VdGlscy52ZXJpZnlTaWduYXR1cmUoXG4gICAgICAgIHNlY29uZE1lc3NhZ2VIZXgsXG4gICAgICAgIGRlZmF1bHRLZXlQYWlyRnJvbVB1Yi5nZXRLZXlzKCkucHViLFxuICAgICAgICBzaWduYXR1cmVzLnNpZ1xuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUga2V5IHBhaXIgZG9lcyBub3QgaGF2ZSB0aGUgcHJpdmF0ZSBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBYdHpMaWIuVXRpbHMuc2lnbihkZWZhdWx0S2V5UGFpckZyb21QdWIsIGRlZmF1bHREYXRhVG9TaWduKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICBuZXcgUmVnRXhwKCdNaXNzaW5nIHByaXZhdGUga2V5JylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZURhdGFUb1NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2ZlciBkYXRhIHRvIHNpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhVG9TaWduID0gWHR6TGliLlV0aWxzLmdlbmVyYXRlRGF0YVRvU2lnbihcbiAgICAgICAgJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcsXG4gICAgICAgICd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnLFxuICAgICAgICAnMTAwJyxcbiAgICAgICAgJzAnXG4gICAgICApO1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZGF0YVRvU2lnbikuc2hvdWxkLmVxdWFsKEpTT04uc3RyaW5naWZ5KHZhbGlkRGF0YVRvU2lnbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBjb250cmFjdCBhZGRyZXNzIGhhcyB0aGUgd3JvbmcgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBYdHpMaWIuVXRpbHMuZ2VuZXJhdGVEYXRhVG9TaWduKFxuICAgICAgICAgICAgJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycsXG4gICAgICAgICAgICAndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyxcbiAgICAgICAgICAgICcwJyxcbiAgICAgICAgICAgICcwJ1xuICAgICAgICAgICksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0ludmFsaWQgY29udHJhY3QgYWRkcmVzcycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGhhcyB0aGUgd3JvbmcgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gWHR6TGliLlV0aWxzLmdlbmVyYXRlRGF0YVRvU2lnbignS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJywgJ2FiYycsICcwJywgJzAnKSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnSW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZFNpZ25hdHVyZXMgPSBbXG4gICAgICAgICdzaWdWZ25hVTJTMUw0amh0UGFUWDJTQXhzR3BQMWRSUzg5VlRTUjlGckZ1eHhQdmdBMkc2N1FSdWV6Nm82eFA3ZWthZ2RaWDRFTHZoN3BiTU1kTG9CU3p2azJBVnlRcGsnLFxuICAgICAgICAnc3BzaWcxRFdUdVhkZ1VnMnQ2NFBMUmZhYXBzWWVqQ29DVlZrcXkyWmp2NDFaaXJ0N01qb3FTZkJuUDM4cW9BZzNTV2ljZlFOaUcyNXlNcUdZZ2U0anJmcnd2OUg4aFJLRHlZJyxcbiAgICAgICAgJ3NpZ1M5cHFZVVhpVUpjejJXc3g1eDk4dWQ5S3RnR1ZnNGdDd3BCb0RCZ0hyWnk5Z3dKZWRLTUNyY1FQeG05QzdpMWdlc0VUYmhGRDZHbThCcGFkR2dkMmNnaUdvUWJpWScsXG4gICAgICAgICdzcHNpZzE5eVdBYzVuQnBHbU5DV2R2RVdIbnBKWEVpVHFaamhOZ1d3V2ExTHo2a1ZnYWtiN3FDUGo5ejZHNkxMRUZXbXNtTmNQQ1pZc2VFUlZEVVhoOTlON3dxRHBwY0RLUU0nLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHZhbGlkU2lnbmF0dXJlcykge1xuICAgICAgICBYdHpMaWIuVXRpbHMuaXNWYWxpZFNpZ25hdHVyZShoYXNoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGludmFsaWQgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEhhc2hlcyA9IFtcbiAgICAgICAgJ3NpZ1M5cHFZVVhpVUpjejJXc3g1eDk4dWQ5S3RnR1ZnNGdDd3BCb0RCZ0hyWicsXG4gICAgICAgICdzaWcnLFxuICAgICAgICAnQktvaWZzNWdHZmZBenVSQmNnM3lneGJMZHJDWHlERFMxQUx2TUc4U0ZZV2Foem9ZTWt1MTExMTExMTExMScsXG4gICAgICAgICdpbnZhbGlkJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgaGFzaCBvZiBpbnZhbGlkSGFzaGVzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkU2lnbmF0dXJlKGhhc2gpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVjb2RlS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVjb2RlIHRoZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZEtleXMgPSBbWydzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnLCBYdHpMaWIuVXRpbHMuaGFzaFR5cGVzLnNwc2tdXTtcblxuICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHZhbGlkS2V5cykge1xuICAgICAgICBYdHpMaWIuVXRpbHMuZGVjb2RlS2V5KGRhdGFbMF0gYXMgc3RyaW5nLCBkYXRhWzFdIGFzIEhhc2hUeXBlKVxuICAgICAgICAgIC50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAuc2hvdWxkLmVxdWFsKCc5Y2MwYWFhOWVmNjg3ZTcwZjc3ODBlNjBkZTA4ZDdhNDQzNDg4YTljZjhlMWViZTk2ODkxMTg3NjMzNzZjMDdjJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZGVjb2RlIGFuIGludmFsaWQga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAnc2lnVmduYVUyUzFMNGpodFBhVFgyU0F4c0dwUDFkUlM4OVZUU1I5RnJGdXh4UHZnQTJHNjdRUnVlejZvNnhQN2VrYWdkWlg0RUx2aDdwYk1NZExvQlN6dmsyQVZ5UXBrJyxcbiAgICAgICAgICBYdHpMaWIuVXRpbHMuaGFzaFR5cGVzLnR6MSxcbiAgICAgICAgXSxcbiAgICAgICAgWydzcHBrJywgWHR6TGliLlV0aWxzLmhhc2hUeXBlcy5zcHBrXSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBpbnZhbGlkS2V5cykge1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IFh0ekxpYi5VdGlscy5kZWNvZGVLZXkoZGF0YVswXSBhcyBzdHJpbmcsIGRhdGFbMV0gYXMgSGFzaFR5cGUpLFxuICAgICAgICAgIG5ldyBSZWdFeHAoJ1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5JylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=xtz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xtz.d.ts","sourceRoot":"","sources":["../../../test/unit/xtz.ts"],"names":[],"mappings":""}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
4
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
5
+ const src_1 = require("../../src");
6
+ const fixtures_1 = require("../fixtures");
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
9
+ bitgo.safeRegister('xtz', src_1.Xtz.createInstance);
10
+ bitgo.safeRegister('txtz', src_1.Txtz.createInstance);
11
+ describe('Tezos:', function () {
12
+ let basecoin;
13
+ before(function () {
14
+ bitgo.initializeTestVars();
15
+ basecoin = bitgo.coin('txtz');
16
+ });
17
+ it('should instantiate the coin', function () {
18
+ const basecoin = bitgo.coin('xtz');
19
+ basecoin.should.be.an.instanceof(src_1.Xtz);
20
+ });
21
+ it('explain an unsigned transfer transaction', async function () {
22
+ const explainParams = {
23
+ halfSigned: {
24
+ txHex: fixtures_1.unsignedTransactionWithTwoTransfersHex,
25
+ },
26
+ feeInfo: { fee: 1 },
27
+ };
28
+ const explanation = await basecoin.explainTransaction(explainParams);
29
+ explanation.id.should.equal('');
30
+ explanation.outputs.length.should.equal(2);
31
+ explanation.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
32
+ explanation.outputs[0].value.should.equal('100');
33
+ explanation.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
34
+ explanation.outputs[1].value.should.equal('100');
35
+ explanation.outputAmount.should.equal('200');
36
+ explanation.changeAmount.should.equal('0');
37
+ explanation.changeOutputs.length.should.equal(0);
38
+ explanation.fee.fee.should.equal(1);
39
+ });
40
+ it('explain a signed transfer transaction', async function () {
41
+ const explainParams = {
42
+ txHex: fixtures_1.fullySignedTransactionWithTwoTransfersHex,
43
+ feeInfo: { fee: 1 },
44
+ };
45
+ const explanation = await basecoin.explainTransaction(explainParams);
46
+ explanation.id.should.equal('onyGaWs6z4bVVcfn3h9KbBrktEhuDyJLYEVB4aJRM6YNngjDxE4');
47
+ explanation.outputs.length.should.equal(2);
48
+ explanation.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
49
+ explanation.outputs[0].value.should.equal('100');
50
+ explanation.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
51
+ explanation.outputs[1].value.should.equal('100');
52
+ explanation.outputAmount.should.equal('200');
53
+ explanation.changeAmount.should.equal('0');
54
+ explanation.changeOutputs.length.should.equal(0);
55
+ explanation.fee.fee.should.equal(1);
56
+ });
57
+ it('should sign an unsigned transaction with a Tezos private key', async function () {
58
+ const signTxOptions = {
59
+ prv: 'xprv9s21ZrQH143K2vpv9Z5GppJtVsT6nBFWDRnA2PKTHaJobNGbhC9MR7shQCQ79jJNZvcxw6YzFTEiwxg3E6Tjo5RR7nKb2dp8r1zdKDG3w1o',
60
+ txPrebuild: {
61
+ txHex: fixtures_1.unsignedHex,
62
+ source: 'tz2HGMx8YxPSLguVP6usgf1D8UALPLchLoSX',
63
+ dataToSign: fixtures_1.dataToSign,
64
+ addressInfo: {
65
+ address: 'tz2HGMx8YxPSLguVP6usgf1D8UALPLchLoSX',
66
+ chain: 0,
67
+ index: 0,
68
+ },
69
+ },
70
+ };
71
+ const tx = await basecoin.signTransaction(signTxOptions);
72
+ tx.halfSigned.txHex.should.equal(fixtures_1.oneSignatureHex);
73
+ });
74
+ it('should sign with a half signed transaction with a Tezos private key', async function () {
75
+ const signTxOptions = {
76
+ prv: 'xprv9s21ZrQH143K2EHDvGaG86MLjU9bW52eEoqMKakkEYc7rM8KDC28FPMcbiwDYX3jjh2mDjFE4Bm37QqMvm4icdW7CAH7LH8jKDF3LXNbRbz',
77
+ txPrebuild: {
78
+ txHex: fixtures_1.oneSignatureHex,
79
+ source: 'tz28XZQ1dRm17RLKM9ayhhp2dVvCGvpPhVyB',
80
+ dataToSign: fixtures_1.dataToSign,
81
+ addressInfo: {
82
+ address: 'tz28XZQ1dRm17RLKM9ayhhp2dVvCGvpPhVyB',
83
+ chain: 0,
84
+ index: 0,
85
+ },
86
+ },
87
+ };
88
+ const tx = await basecoin.signTransaction(signTxOptions);
89
+ tx.halfSigned.txHex.should.equal(fixtures_1.twoSignatureHex);
90
+ });
91
+ it('should sign with a fee account a fully signed transaction', async function () {
92
+ const signTxOptions = {
93
+ prv: 'xprv9s21ZrQH143K2dseae8JccdEANb1jSfx7Pr8zpKq9uW1Nyh8LD8Uizn6CttWNwJ9S9xJtP3nWda2RoQjTp75HdSyTPnUgdANo2sgpPrcMwm',
94
+ txPrebuild: {
95
+ txHex: fixtures_1.twoSignatureHex,
96
+ source: 'tz2SsfYjnEmm6E6eb6BxHNqsbGk4i9EsKSTE',
97
+ addressInfo: {
98
+ address: 'tz2SsfYjnEmm6E6eb6BxHNqsbGk4i9EsKSTE',
99
+ chain: 0,
100
+ index: 0,
101
+ },
102
+ },
103
+ };
104
+ const tx = await basecoin.signTransaction(signTxOptions);
105
+ tx.halfSigned.txHex.should.equal(fixtures_1.fullySignedHex);
106
+ });
107
+ it('should check valid addresses', function () {
108
+ const badAddresses = [
109
+ '',
110
+ null,
111
+ 'xxxx',
112
+ 'YZ09fd-',
113
+ '412C2BA4A9FF6C53207DC5B686BFECF75EA7B805772',
114
+ '412C2BA4A9FF6C53207DC5B686BFECF75EA7B80',
115
+ 'TBChwKYNaTo4a4N68Me1qEiiKsRDspXqLLZ',
116
+ ];
117
+ const goodAddresses = [
118
+ 'tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A',
119
+ 'tz29yN7c5zrmK9ZhA1VjYwVokN9ZBn8YbCuE',
120
+ 'KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL',
121
+ ];
122
+ badAddresses.map((addr) => {
123
+ basecoin.isValidAddress(addr).should.equal(false);
124
+ });
125
+ goodAddresses.map((addr) => {
126
+ basecoin.isValidAddress(addr).should.equal(true);
127
+ });
128
+ });
129
+ it('should throw if the params object is missing parameters', async function () {
130
+ const explainParams = {
131
+ feeInfo: { fee: 1 },
132
+ txHex: null,
133
+ };
134
+ await basecoin.explainTransaction(explainParams).should.be.rejectedWith('missing explain tx parameters');
135
+ });
136
+ describe('Keypairs:', () => {
137
+ it('should generate a keypair from random seed', function () {
138
+ const keyPair = basecoin.generateKeyPair();
139
+ keyPair.should.have.property('pub');
140
+ keyPair.should.have.property('prv');
141
+ basecoin.isValidPub(keyPair.pub).should.equal(true);
142
+ });
143
+ it('should generate a keypair from a seed', function () {
144
+ const seedText = '80350b4208d381fbfe2276a326603049fe500731c46d3c9936b5ce036b51377f24bab7dd0c2af7f107416ef858ff79b0670c72406dad064e72bb17fc0a9038bb';
145
+ const seed = Buffer.from(seedText, 'hex');
146
+ const keyPair = basecoin.generateKeyPair(seed);
147
+ keyPair.pub.should.equal('xpub661MyMwAqRbcFAwqvSGbk35kJf7CQqdN1w4CMUBBTqH5e3ivjU6D8ugv9hRSgRbRenC4w3ahXdLVahwjgjXhSuQKMdNdn55Y9TNSagBktws');
148
+ keyPair.prv.should.equal('xprv9s21ZrQH143K2gsNpQjbNu91kdGi1NuWei8bZ5mZuVk6mFPnBvmxb7NSJQdbZW3FGpK3Ycn7jorAXcEzMvviGtbyBz5tBrjfnWyQp3g75FK');
149
+ });
150
+ });
151
+ describe('Sign message:', () => {
152
+ it('should sign and validate a string message', async function () {
153
+ const keyPair = basecoin.generateKeyPair();
154
+ const message = 'hello world';
155
+ const signature = await basecoin.signMessage(keyPair, message);
156
+ const messageHex = Buffer.from(message).toString('hex');
157
+ const sig = Buffer.from(signature, 'hex').toString();
158
+ const publicKey = new src_1.XtzLib.KeyPair({ pub: keyPair.pub });
159
+ const isValid = await src_1.XtzLib.Utils.verifySignature(messageHex, publicKey.getKeys().pub, sig);
160
+ isValid.should.equal(true);
161
+ });
162
+ it('should fail to validate a string message with wrong public key', async function () {
163
+ const keyPair = basecoin.generateKeyPair();
164
+ const message = 'hello world';
165
+ const signature = await basecoin.signMessage(keyPair, message);
166
+ const messageHex = Buffer.from(message).toString('hex');
167
+ const sig = Buffer.from(signature, 'hex').toString();
168
+ const publicKey = new src_1.XtzLib.KeyPair();
169
+ const isValid = await src_1.XtzLib.Utils.verifySignature(messageHex, publicKey.getKeys().pub, sig);
170
+ isValid.should.equal(false);
171
+ });
172
+ });
173
+ describe('Verify Transaction', function () {
174
+ const address1 = '5Ge59qRnZa8bxyhVFE6BDoY3kuhSrNVETRxXYLty1Hh6XTaf';
175
+ const address2 = '5DiMLZugmcKEH3igPZP367FqummZkWeW5Z6zDCHLfxRjnPXe';
176
+ it('should reject a txPrebuild with more than one recipient', async function () {
177
+ const wallet = new sdk_core_1.Wallet(bitgo, basecoin, {});
178
+ const txParams = {
179
+ recipients: [
180
+ { amount: '1000000000000', address: address1 },
181
+ { amount: '2500000000000', address: address2 },
182
+ ],
183
+ wallet: wallet,
184
+ walletPassphrase: 'fakeWalletPassphrase',
185
+ };
186
+ await basecoin
187
+ .verifyTransaction({ txParams })
188
+ .should.be.rejectedWith(`txtz doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
189
+ });
190
+ });
191
+ });
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHR6LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3h0ei50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1EQUErRDtBQUMvRCxpREFBK0M7QUFDL0MsbUNBQThDO0FBQzlDLDBDQVFxQjtBQUNyQixtREFBOEM7QUFFOUMsTUFBTSxLQUFLLEdBQWlCLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUMxRSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRWhELFFBQVEsQ0FBQyxRQUFRLEVBQUU7SUFDakIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLENBQUM7UUFDTCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSztRQUNsRCxNQUFNLGFBQWEsR0FBRztZQUNwQixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLGlEQUFzQzthQUM5QztZQUNELE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7U0FDcEIsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNwRixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNwRixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEtBQUs7UUFDL0MsTUFBTSxhQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFFLG9EQUF5QztZQUNoRCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1NBQ3BCLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRSxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNuRixXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNwRixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNwRixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEtBQUs7UUFDdEUsTUFBTSxhQUFhLEdBQUc7WUFDcEIsR0FBRyxFQUFFLGlIQUFpSDtZQUN0SCxVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLHNCQUFXO2dCQUNsQixNQUFNLEVBQUUsc0NBQXNDO2dCQUM5QyxVQUFVLEVBQUUscUJBQVU7Z0JBQ3RCLFdBQVcsRUFBRTtvQkFDWCxPQUFPLEVBQUUsc0NBQXNDO29CQUMvQyxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsQ0FBQztpQkFDVDthQUNGO1NBQ0YsQ0FBQztRQUNGLE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUFlLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxRUFBcUUsRUFBRSxLQUFLO1FBQzdFLE1BQU0sYUFBYSxHQUFHO1lBQ3BCLEdBQUcsRUFBRSxpSEFBaUg7WUFDdEgsVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRSwwQkFBZTtnQkFDdEIsTUFBTSxFQUFFLHNDQUFzQztnQkFDOUMsVUFBVSxFQUFFLHFCQUFVO2dCQUN0QixXQUFXLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLHNDQUFzQztvQkFDL0MsS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLENBQUM7aUJBQ1Q7YUFDRjtTQUNGLENBQUM7UUFDRixNQUFNLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBZSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSztRQUNuRSxNQUFNLGFBQWEsR0FBRztZQUNwQixHQUFHLEVBQUUsaUhBQWlIO1lBQ3RILFVBQVUsRUFBRTtnQkFDVixLQUFLLEVBQUUsMEJBQWU7Z0JBQ3RCLE1BQU0sRUFBRSxzQ0FBc0M7Z0JBQzlDLFdBQVcsRUFBRTtvQkFDWCxPQUFPLEVBQUUsc0NBQXNDO29CQUMvQyxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsQ0FBQztpQkFDVDthQUNGO1NBQ0YsQ0FBQztRQUNGLE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUFjLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtRQUNqQyxNQUFNLFlBQVksR0FBRztZQUNuQixFQUFFO1lBQ0YsSUFBSTtZQUNKLE1BQU07WUFDTixTQUFTO1lBQ1QsNkNBQTZDO1lBQzdDLHlDQUF5QztZQUN6QyxxQ0FBcUM7U0FDdEMsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHO1lBQ3BCLHNDQUFzQztZQUN0QyxzQ0FBc0M7WUFDdEMsc0NBQXNDO1NBQ3ZDLENBQUM7UUFFRixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3pCLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEtBQUs7UUFDakUsTUFBTSxhQUFhLEdBQUc7WUFDcEIsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtZQUNuQixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUM7UUFDRixNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNHLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDekIsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsTUFBTSxRQUFRLEdBQ1osa0lBQWtJLENBQUM7WUFDckksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3RCLGlIQUFpSCxDQUNsSCxDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN0QixpSEFBaUgsQ0FDbEgsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUM3QixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSztZQUNuRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzNELE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsS0FBSztZQUN4RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLE1BQU0sUUFBUSxHQUFHLGtEQUFrRCxDQUFDO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLGtEQUFrRCxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtvQkFDOUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7aUJBQy9DO2dCQUNELE1BQU0sRUFBRSxNQUFNO2dCQUNkLGdCQUFnQixFQUFFLHNCQUFzQjthQUN6QyxDQUFDO1lBRUYsTUFBTSxRQUFRO2lCQUNYLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7aUJBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUNyQix3SUFBd0ksQ0FDekksQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFh0eiwgVHh0eiwgWHR6TGliIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7XG4gIGRhdGFUb1NpZ24sXG4gIGZ1bGx5U2lnbmVkSGV4LFxuICBmdWxseVNpZ25lZFRyYW5zYWN0aW9uV2l0aFR3b1RyYW5zZmVyc0hleCxcbiAgb25lU2lnbmF0dXJlSGV4LFxuICB0d29TaWduYXR1cmVIZXgsXG4gIHVuc2lnbmVkSGV4LFxuICB1bnNpZ25lZFRyYW5zYWN0aW9uV2l0aFR3b1RyYW5zZmVyc0hleCxcbn0gZnJvbSAnLi4vZml4dHVyZXMnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5jb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuYml0Z28uc2FmZVJlZ2lzdGVyKCd4dHonLCBYdHouY3JlYXRlSW5zdGFuY2UpO1xuYml0Z28uc2FmZVJlZ2lzdGVyKCd0eHR6JywgVHh0ei5jcmVhdGVJbnN0YW5jZSk7XG5cbmRlc2NyaWJlKCdUZXpvczonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiYXNlY29pbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHh0eicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhc2Vjb2luID0gYml0Z28uY29pbigneHR6Jyk7XG4gICAgYmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoWHR6KTtcbiAgfSk7XG5cbiAgaXQoJ2V4cGxhaW4gYW4gdW5zaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpblBhcmFtcyA9IHtcbiAgICAgIGhhbGZTaWduZWQ6IHtcbiAgICAgICAgdHhIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb25XaXRoVHdvVHJhbnNmZXJzSGV4LFxuICAgICAgfSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAxIH0sXG4gICAgfTtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluUGFyYW1zKTtcbiAgICBleHBsYW5hdGlvbi5pZC5zaG91bGQuZXF1YWwoJycpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzIwMCcpO1xuICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgZXhwbGFuYXRpb24uZmVlLmZlZS5zaG91bGQuZXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCdleHBsYWluIGEgc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW5QYXJhbXMgPSB7XG4gICAgICB0eEhleDogZnVsbHlTaWduZWRUcmFuc2FjdGlvbldpdGhUd29UcmFuc2ZlcnNIZXgsXG4gICAgICBmZWVJbmZvOiB7IGZlZTogMSB9LFxuICAgIH07XG4gICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oZXhwbGFpblBhcmFtcyk7XG4gICAgZXhwbGFuYXRpb24uaWQuc2hvdWxkLmVxdWFsKCdvbnlHYVdzNno0YlZWY2ZuM2g5S2JCcmt0RWh1RHlKTFlFVkI0YUpSTTZZTm5nakR4RTQnKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4Jyk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKCcyMDAnKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIGV4cGxhbmF0aW9uLmZlZS5mZWUuc2hvdWxkLmVxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24gd2l0aCBhIFRlem9zIHByaXZhdGUga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZ25UeE9wdGlvbnMgPSB7XG4gICAgICBwcnY6ICd4cHJ2OXMyMVpyUUgxNDNLMnZwdjlaNUdwcEp0VnNUNm5CRldEUm5BMlBLVEhhSm9iTkdiaEM5TVI3c2hRQ1E3OWpKTlp2Y3h3Nll6RlRFaXd4ZzNFNlRqbzVSUjduS2IyZHA4cjF6ZEtERzN3MW8nLFxuICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICB0eEhleDogdW5zaWduZWRIZXgsXG4gICAgICAgIHNvdXJjZTogJ3R6MkhHTXg4WXhQU0xndVZQNnVzZ2YxRDhVQUxQTGNoTG9TWCcsXG4gICAgICAgIGRhdGFUb1NpZ246IGRhdGFUb1NpZ24sXG4gICAgICAgIGFkZHJlc3NJbmZvOiB7XG4gICAgICAgICAgYWRkcmVzczogJ3R6MkhHTXg4WXhQU0xndVZQNnVzZ2YxRDhVQUxQTGNoTG9TWCcsXG4gICAgICAgICAgY2hhaW46IDAsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oc2lnblR4T3B0aW9ucyk7XG4gICAgdHguaGFsZlNpZ25lZC50eEhleC5zaG91bGQuZXF1YWwob25lU2lnbmF0dXJlSGV4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIHdpdGggYSBoYWxmIHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGEgVGV6b3MgcHJpdmF0ZSBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnblR4T3B0aW9ucyA9IHtcbiAgICAgIHBydjogJ3hwcnY5czIxWnJRSDE0M0syRUhEdkdhRzg2TUxqVTliVzUyZUVvcU1LYWtrRVljN3JNOEtEQzI4RlBNY2Jpd0RZWDNqamgybURqRkU0Qm0zN1FxTXZtNGljZFc3Q0FIN0xIOGpLREYzTFhOYlJieicsXG4gICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgIHR4SGV4OiBvbmVTaWduYXR1cmVIZXgsXG4gICAgICAgIHNvdXJjZTogJ3R6MjhYWlExZFJtMTdSTEtNOWF5aGhwMmRWdkNHdnBQaFZ5QicsXG4gICAgICAgIGRhdGFUb1NpZ246IGRhdGFUb1NpZ24sXG4gICAgICAgIGFkZHJlc3NJbmZvOiB7XG4gICAgICAgICAgYWRkcmVzczogJ3R6MjhYWlExZFJtMTdSTEtNOWF5aGhwMmRWdkNHdnBQaFZ5QicsXG4gICAgICAgICAgY2hhaW46IDAsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oc2lnblR4T3B0aW9ucyk7XG4gICAgdHguaGFsZlNpZ25lZC50eEhleC5zaG91bGQuZXF1YWwodHdvU2lnbmF0dXJlSGV4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIHdpdGggYSBmZWUgYWNjb3VudCBhIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWduVHhPcHRpb25zID0ge1xuICAgICAgcHJ2OiAneHBydjlzMjFaclFIMTQzSzJkc2VhZThKY2NkRUFOYjFqU2Z4N1ByOHpwS3E5dVcxTnloOExEOFVpem42Q3R0V053SjlTOXhKdFAzbldkYTJSb1FqVHA3NUhkU3lUUG5VZ2RBTm8yc2dwUHJjTXdtJyxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgdHhIZXg6IHR3b1NpZ25hdHVyZUhleCxcbiAgICAgICAgc291cmNlOiAndHoyU3NmWWpuRW1tNkU2ZWI2QnhITnFzYkdrNGk5RXNLU1RFJyxcbiAgICAgICAgYWRkcmVzc0luZm86IHtcbiAgICAgICAgICBhZGRyZXNzOiAndHoyU3NmWWpuRW1tNkU2ZWI2QnhITnFzYkdrNGk5RXNLU1RFJyxcbiAgICAgICAgICBjaGFpbjogMCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IGJhc2Vjb2luLnNpZ25UcmFuc2FjdGlvbihzaWduVHhPcHRpb25zKTtcbiAgICB0eC5oYWxmU2lnbmVkLnR4SGV4LnNob3VsZC5lcXVhbChmdWxseVNpZ25lZEhleCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hlY2sgdmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhZEFkZHJlc3NlcyA9IFtcbiAgICAgICcnLFxuICAgICAgbnVsbCxcbiAgICAgICd4eHh4JyxcbiAgICAgICdZWjA5ZmQtJyxcbiAgICAgICc0MTJDMkJBNEE5RkY2QzUzMjA3REM1QjY4NkJGRUNGNzVFQTdCODA1NzcyJyxcbiAgICAgICc0MTJDMkJBNEE5RkY2QzUzMjA3REM1QjY4NkJGRUNGNzVFQTdCODAnLFxuICAgICAgJ1RCQ2h3S1lOYVRvNGE0TjY4TWUxcUVpaUtzUkRzcFhxTExaJyxcbiAgICBdO1xuICAgIGNvbnN0IGdvb2RBZGRyZXNzZXMgPSBbXG4gICAgICAndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyxcbiAgICAgICd0ejI5eU43YzV6cm1LOVpoQTFWall3Vm9rTjlaQm44WWJDdUUnLFxuICAgICAgJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcsXG4gICAgXTtcblxuICAgIGJhZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gICAgZ29vZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0aGUgcGFyYW1zIG9iamVjdCBpcyBtaXNzaW5nIHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpblBhcmFtcyA9IHtcbiAgICAgIGZlZUluZm86IHsgZmVlOiAxIH0sXG4gICAgICB0eEhleDogbnVsbCxcbiAgICB9O1xuICAgIGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluUGFyYW1zKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIGV4cGxhaW4gdHggcGFyYW1ldGVycycpO1xuICB9KTtcblxuICBkZXNjcmliZSgnS2V5cGFpcnM6JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBrZXlwYWlyIGZyb20gcmFuZG9tIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gYmFzZWNvaW4uZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICBrZXlQYWlyLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwdWInKTtcbiAgICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZFB1YihrZXlQYWlyLnB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSBhIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZWVkVGV4dCA9XG4gICAgICAgICc4MDM1MGI0MjA4ZDM4MWZiZmUyMjc2YTMyNjYwMzA0OWZlNTAwNzMxYzQ2ZDNjOTkzNmI1Y2UwMzZiNTEzNzdmMjRiYWI3ZGQwYzJhZjdmMTA3NDE2ZWY4NThmZjc5YjA2NzBjNzI0MDZkYWQwNjRlNzJiYjE3ZmMwYTkwMzhiYic7XG4gICAgICBjb25zdCBzZWVkID0gQnVmZmVyLmZyb20oc2VlZFRleHQsICdoZXgnKTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG4gICAgICBrZXlQYWlyLnB1Yi5zaG91bGQuZXF1YWwoXG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRkF3cXZTR2JrMzVrSmY3Q1FxZE4xdzRDTVVCQlRxSDVlM2l2alU2RDh1Z3Y5aFJTZ1JiUmVuQzR3M2FoWGRMVmFod2pnalhoU3VRS01kTmRuNTVZOVROU2FnQmt0d3MnXG4gICAgICApO1xuICAgICAga2V5UGFpci5wcnYuc2hvdWxkLmVxdWFsKFxuICAgICAgICAneHBydjlzMjFaclFIMTQzSzJnc05wUWpiTnU5MWtkR2kxTnVXZWk4Ylo1bVp1Vms2bUZQbkJ2bXhiN05TSlFkYlpXM0ZHcEszWWNuN2pvckFYY0V6TXZ2aUd0YnlCejV0QnJqZm5XeVFwM2c3NUZLJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ24gbWVzc2FnZTonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGFuZCB2YWxpZGF0ZSBhIHN0cmluZyBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdoZWxsbyB3b3JsZCc7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBiYXNlY29pbi5zaWduTWVzc2FnZShrZXlQYWlyLCBtZXNzYWdlKTtcblxuICAgICAgY29uc3QgbWVzc2FnZUhleCA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHNpZyA9IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwdWI6IGtleVBhaXIucHViIH0pO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IFh0ekxpYi5VdGlscy52ZXJpZnlTaWduYXR1cmUobWVzc2FnZUhleCwgcHVibGljS2V5LmdldEtleXMoKS5wdWIsIHNpZyk7XG4gICAgICBpc1ZhbGlkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhIHN0cmluZyBtZXNzYWdlIHdpdGggd3JvbmcgcHVibGljIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnaGVsbG8gd29ybGQnO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgYmFzZWNvaW4uc2lnbk1lc3NhZ2Uoa2V5UGFpciwgbWVzc2FnZSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGNvbnN0IHNpZyA9IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgWHR6TGliLktleVBhaXIoKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCBYdHpMaWIuVXRpbHMudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2VIZXgsIHB1YmxpY0tleS5nZXRLZXlzKCkucHViLCBzaWcpO1xuICAgICAgaXNWYWxpZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFkZHJlc3MxID0gJzVHZTU5cVJuWmE4Ynh5aFZGRTZCRG9ZM2t1aFNyTlZFVFJ4WFlMdHkxSGg2WFRhZic7XG4gICAgY29uc3QgYWRkcmVzczIgPSAnNURpTUxadWdtY0tFSDNpZ1BaUDM2N0ZxdW1tWmtXZVc1WjZ6RENITGZ4UmpuUFhlJztcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHR4UHJlYnVpbGQgd2l0aCBtb3JlIHRoYW4gb25lIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICB7IGFtb3VudDogJzI1MDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMiB9LFxuICAgICAgICBdLFxuICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2Zha2VXYWxsZXRQYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgIGB0eHR6IGRvZXNuJ3Qgc3VwcG9ydCBzZW5kaW5nIHRvIG1vcmUgdGhhbiAxIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUcnkgYWdhaW4sIHVzaW5nIG9ubHkgYSBzaW5nbGUgcmVjaXBpZW50LmBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==