@bitgo/sdk-coin-stx 3.10.2 → 3.10.4

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 (38) hide show
  1. package/dist/test/fixtures.d.ts +119 -0
  2. package/dist/test/fixtures.d.ts.map +1 -0
  3. package/dist/test/fixtures.js +147 -0
  4. package/dist/test/unit/keyPair.d.ts +2 -0
  5. package/dist/test/unit/keyPair.d.ts.map +1 -0
  6. package/dist/test/unit/keyPair.js +144 -0
  7. package/dist/test/unit/resources.d.ts +97 -0
  8. package/dist/test/unit/resources.d.ts.map +1 -0
  9. package/dist/test/unit/resources.js +144 -0
  10. package/dist/test/unit/sip10Token.d.ts +2 -0
  11. package/dist/test/unit/sip10Token.d.ts.map +1 -0
  12. package/dist/test/unit/sip10Token.js +374 -0
  13. package/dist/test/unit/stx.d.ts +2 -0
  14. package/dist/test/unit/stx.d.ts.map +1 -0
  15. package/dist/test/unit/stx.js +470 -0
  16. package/dist/test/unit/transaction.d.ts +2 -0
  17. package/dist/test/unit/transaction.d.ts.map +1 -0
  18. package/dist/test/unit/transaction.js +83 -0
  19. package/dist/test/unit/transactionBuilder/contractBuilder.d.ts +2 -0
  20. package/dist/test/unit/transactionBuilder/contractBuilder.d.ts.map +1 -0
  21. package/dist/test/unit/transactionBuilder/contractBuilder.js +421 -0
  22. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts +2 -0
  23. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts.map +1 -0
  24. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +187 -0
  25. package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts +2 -0
  26. package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts.map +1 -0
  27. package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +140 -0
  28. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  29. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  30. package/dist/test/unit/transactionBuilder/transferBuilder.js +347 -0
  31. package/dist/test/unit/util.d.ts +2 -0
  32. package/dist/test/unit/util.d.ts.map +1 -0
  33. package/dist/test/unit/util.js +326 -0
  34. package/dist/tsconfig.tsbuildinfo +1 -0
  35. package/package.json +10 -7
  36. package/.eslintignore +0 -5
  37. package/.mocharc.yml +0 -8
  38. package/CHANGELOG.md +0 -839
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const statics_1 = require("@bitgo/statics");
42
+ const src_1 = require("../../src");
43
+ const testData = __importStar(require("./resources"));
44
+ const { Transaction, KeyPair } = src_1.StxLib;
45
+ describe('Stx Transaction', () => {
46
+ const coin = statics_1.coins.get('tstx');
47
+ it('should throw empty transaction', () => {
48
+ const tx = new Transaction(coin);
49
+ assert_1.default.throws(() => tx.toJson(), /Empty transaction/);
50
+ assert_1.default.throws(() => tx.toBroadcastFormat(), /Empty transaction/);
51
+ });
52
+ describe('should sign if transaction is', () => {
53
+ it('invalid', function () {
54
+ const tx = new Transaction(coin);
55
+ return tx.sign(testData.INVALID_KEYPAIR_PRV).should.be.rejected();
56
+ });
57
+ it('valid', async () => {
58
+ const tx = new Transaction(coin);
59
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
60
+ const keypair = new KeyPair({ prv: testData.TX_SENDER.prv });
61
+ await tx.sign(keypair).should.be.fulfilled();
62
+ should_1.default.equal(tx.inputs[0].address, testData.TX_SENDER.address);
63
+ should_1.default.equal(tx.outputs[0].address, testData.TX_RECIEVER.address);
64
+ });
65
+ });
66
+ describe('should return encoded tx', function () {
67
+ it('valid sign', async function () {
68
+ const tx = new Transaction(coin);
69
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
70
+ const keypair = new KeyPair({ prv: testData.TX_SENDER.prv });
71
+ await tx.sign(keypair);
72
+ should_1.default.equal(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
73
+ });
74
+ });
75
+ describe('calculate transaction size', function () {
76
+ it('expected size', async function () {
77
+ const tx = new Transaction(coin);
78
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
79
+ should_1.default.equal(tx.transactionSize(), testData.RAW_TX_UNSIGNED.length / 2);
80
+ });
81
+ });
82
+ });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDRDQUF1QztBQUN2QyxtQ0FBbUM7QUFDbkMsc0RBQXdDO0FBRXhDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLEdBQUcsWUFBTSxDQUFDO0FBRXhDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7SUFDL0IsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvQixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3RELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1FBQzdDLEVBQUUsQ0FBQyxTQUFTLEVBQUU7WUFDWixNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDN0QsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7UUFDbkMsRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzdELE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDRCQUE0QixFQUFFO1FBQ3JDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSztZQUN2QixNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFN0eExpYiB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuL3Jlc291cmNlcyc7XG5cbmNvbnN0IHsgVHJhbnNhY3Rpb24sIEtleVBhaXIgfSA9IFN0eExpYjtcblxuZGVzY3JpYmUoJ1N0eCBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgndHN0eCcpO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0pzb24oKSwgL0VtcHR5IHRyYW5zYWN0aW9uLyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAvRW1wdHkgdHJhbnNhY3Rpb24vKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBzaWduIGlmIHRyYW5zYWN0aW9uIGlzJywgKCkgPT4ge1xuICAgIGl0KCdpbnZhbGlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICByZXR1cm4gdHguc2lnbih0ZXN0RGF0YS5JTlZBTElEX0tFWVBBSVJfUFJWKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLlRYX1NFTkRFUi5wcnYgfSk7XG4gICAgICBhd2FpdCB0eC5zaWduKGtleXBhaXIpLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgdGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgcmV0dXJuIGVuY29kZWQgdHgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3ZhbGlkIHNpZ24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihrZXlwYWlyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2FsY3VsYXRlIHRyYW5zYWN0aW9uIHNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2V4cGVjdGVkIHNpemUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRyYW5zYWN0aW9uU2l6ZSgpLCB0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQubGVuZ3RoIC8gMik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contractBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/contractBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const bn_js_1 = __importDefault(require("bn.js"));
42
+ const network_1 = require("@stacks/network");
43
+ const sdk_core_1 = require("@bitgo/sdk-core");
44
+ const transactions_1 = require("@stacks/transactions");
45
+ const sdk_test_1 = require("@bitgo/sdk-test");
46
+ const sdk_api_1 = require("@bitgo/sdk-api");
47
+ const statics_1 = require("@bitgo/statics");
48
+ const src_1 = require("../../../src");
49
+ const testData = __importStar(require("../resources"));
50
+ const { stringifyCv } = src_1.StxLib.Utils;
51
+ describe('Stacks: Contract Builder', function () {
52
+ const coinName = 'stx';
53
+ const coinNameTest = 'tstx';
54
+ let bitgo;
55
+ before(function () {
56
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
57
+ env: 'mock',
58
+ });
59
+ bitgo.initializeTestVars();
60
+ bitgo.safeRegister('stx', src_1.Stx.createInstance);
61
+ bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
62
+ });
63
+ describe('Stx Contract call Builder', () => {
64
+ const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinNameTest));
65
+ const factoryProd = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
66
+ const initTxBuilder = () => {
67
+ const txBuilder = factory.getContractBuilder();
68
+ txBuilder.fee({ fee: '180' });
69
+ txBuilder.nonce(0);
70
+ txBuilder.contractAddress(testData.CONTRACT_ADDRESS);
71
+ txBuilder.contractName(testData.CONTRACT_NAME);
72
+ txBuilder.functionName(testData.CONTRACT_FUNCTION_NAME);
73
+ return txBuilder;
74
+ };
75
+ describe('contract builder environment', function () {
76
+ it('should select the right network', function () {
77
+ should_1.default.equal(factory.getTransferBuilder().coinName(), 'tstx');
78
+ should_1.default.equal(factoryProd.getTransferBuilder().coinName(), 'stx');
79
+ // used type any to access protected properties
80
+ const txBuilder = factory.getTransferBuilder();
81
+ const txBuilderProd = factoryProd.getTransferBuilder();
82
+ txBuilder._network.should.deepEqual(new network_1.StacksTestnet());
83
+ txBuilderProd._network.should.deepEqual(new network_1.StacksMainnet());
84
+ });
85
+ });
86
+ describe('should build ', () => {
87
+ it('an unsigned contract call transaction', async () => {
88
+ const builder = initTxBuilder();
89
+ builder.functionArgs([
90
+ { type: 'uint128', val: '400000000' },
91
+ { type: 'principal', val: testData.ACCOUNT_2.address },
92
+ { type: 'optional', val: { type: 'uint128', val: '200' } },
93
+ {
94
+ type: 'optional',
95
+ val: {
96
+ type: 'tuple',
97
+ val: [
98
+ { key: 'hashbytes', type: 'buffer', val: Buffer.from('some-hash') },
99
+ { key: 'version', type: 'buffer', val: new bn_js_1.default(1).toBuffer() },
100
+ ],
101
+ },
102
+ },
103
+ ]);
104
+ builder.fromPubKey(testData.TX_SENDER.pub);
105
+ builder.numberSignatures(1);
106
+ const tx = await builder.build();
107
+ const txJson = tx.toJson();
108
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
109
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
110
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
111
+ should_1.default.deepEqual(txJson.nonce, 0);
112
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
113
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.UNSIGNED_CONTRACT_CALL);
114
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
115
+ tx.outputs.length.should.equal(1);
116
+ tx.outputs[0].address.should.equal(testData.CONTRACT_ADDRESS);
117
+ tx.outputs[0].value.should.equal('0');
118
+ tx.inputs.length.should.equal(1);
119
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
120
+ tx.inputs[0].value.should.equal('0');
121
+ });
122
+ it('an unsigned self stacking contract call transaction', async () => {
123
+ const builder = initTxBuilder();
124
+ /* Contract call in clarity POX-4
125
+ (define-public (stack-stx (amount-ustx uint)
126
+ (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32))))
127
+ (start-burn-ht uint)
128
+ (lock-period uint)
129
+ (signer-sig (optional (buff 65)))
130
+ (signer-key (buff 33))
131
+ (max-amount uint)
132
+ (auth-id uint))
133
+ */
134
+ builder.functionArgs([
135
+ { type: 'uint128', val: '400000000' },
136
+ {
137
+ type: 'tuple',
138
+ val: [
139
+ { key: 'hashbytes', type: 'buffer', val: Buffer.from('some-hash') },
140
+ { key: 'version', type: 'buffer', val: new bn_js_1.default(1).toBuffer() },
141
+ ],
142
+ },
143
+ { type: 'uint128', val: '52800' },
144
+ { type: 'uint128', val: '2' },
145
+ // Nakamoto upgrade new 4 parameters
146
+ // https://docs.stacks.co/nakamoto-upgrade/signing-and-stacking/stacking-flow#solo-stacker-flow
147
+ { type: 'optional', val: { type: 'buffer', val: Buffer.from('some-hash') } },
148
+ { type: 'buffer', val: Buffer.from('some-hash') },
149
+ { type: 'uint128', val: '340282366920938463463374607431768211455' },
150
+ { type: 'uint128', val: '123456' },
151
+ ]);
152
+ builder.fromPubKey(testData.TX_SENDER.pub);
153
+ builder.numberSignatures(1);
154
+ const tx = await builder.build();
155
+ const txJson = tx.toJson();
156
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
157
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
158
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
159
+ should_1.default.deepEqual(txJson.nonce, 0);
160
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
161
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.UNSIGNED_SELF_STACK_CONTRACT_CALL);
162
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
163
+ tx.outputs.length.should.equal(1);
164
+ tx.outputs[0].address.should.equal(testData.CONTRACT_ADDRESS);
165
+ tx.outputs[0].value.should.equal('0');
166
+ tx.inputs.length.should.equal(1);
167
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
168
+ tx.inputs[0].value.should.equal('0');
169
+ });
170
+ it('a signed contract call with args', async () => {
171
+ const builder = initTxBuilder();
172
+ builder.functionArgs([
173
+ { type: 'uint128', val: '400000000' },
174
+ { type: 'principal', val: testData.ACCOUNT_2.address },
175
+ { type: 'optional' },
176
+ {
177
+ type: 'optional',
178
+ val: {
179
+ type: 'tuple',
180
+ val: [
181
+ { key: 'hashbytes', type: 'buffer', val: Buffer.from('some-hash') },
182
+ { key: 'version', type: 'buffer', val: new bn_js_1.default(1).toBuffer() },
183
+ ],
184
+ },
185
+ },
186
+ ]);
187
+ builder.sign({ key: testData.TX_SENDER.prv });
188
+ const tx = await builder.build();
189
+ const txJson = tx.toJson();
190
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
191
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
192
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
193
+ should_1.default.deepEqual(txJson.nonce, 0);
194
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
195
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_CONTRACT_WITH_ARGS);
196
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
197
+ tx.outputs.length.should.equal(1);
198
+ tx.outputs[0].address.should.equal(testData.CONTRACT_ADDRESS);
199
+ tx.outputs[0].value.should.equal('0');
200
+ tx.inputs.length.should.equal(1);
201
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
202
+ tx.inputs[0].value.should.equal('0');
203
+ });
204
+ it('a signed self stacking contract call', async () => {
205
+ const builder = initTxBuilder();
206
+ /* Contract call in clarity POX-4
207
+ (define-public (stack-stx (amount-ustx uint)
208
+ (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32))))
209
+ (start-burn-ht uint)
210
+ (lock-period uint)
211
+ (signer-sig (optional (buff 65)))
212
+ (signer-key (buff 33))
213
+ (max-amount uint)
214
+ (auth-id uint))
215
+ */
216
+ builder.functionArgs([
217
+ { type: 'uint128', val: '400000000' },
218
+ {
219
+ type: 'tuple',
220
+ val: [
221
+ { key: 'hashbytes', type: 'buffer', val: Buffer.from('some-hash') },
222
+ { key: 'version', type: 'buffer', val: new bn_js_1.default(1).toBuffer() },
223
+ ],
224
+ },
225
+ { type: 'uint128', val: '52800' },
226
+ { type: 'uint128', val: '2' },
227
+ // Nakamoto upgrade new 4 parameters
228
+ // https://docs.stacks.co/nakamoto-upgrade/signing-and-stacking/stacking-flow#solo-stacker-flow
229
+ { type: 'optional', val: { type: 'buffer', val: Buffer.from('some-hash') } },
230
+ { type: 'buffer', val: Buffer.from('some-hash') },
231
+ { type: 'uint128', val: '340282366920938463463374607431768211455' },
232
+ { type: 'uint128', val: '123456' },
233
+ ]);
234
+ builder.sign({ key: testData.TX_SENDER.prv });
235
+ const tx = await builder.build();
236
+ const txJson = tx.toJson();
237
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
238
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
239
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
240
+ should_1.default.deepEqual(txJson.nonce, 0);
241
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
242
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_SELF_STACK_CONTRACT_CALL);
243
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
244
+ tx.outputs.length.should.equal(1);
245
+ tx.outputs[0].address.should.equal(testData.CONTRACT_ADDRESS);
246
+ tx.outputs[0].value.should.equal('0');
247
+ tx.inputs.length.should.equal(1);
248
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
249
+ tx.inputs[0].value.should.equal('0');
250
+ });
251
+ it('a signed contract call transaction', async () => {
252
+ const amount = 123;
253
+ const builder = initTxBuilder();
254
+ builder.functionArgs([{ type: 'optional', val: { type: 'int128', val: amount } }]);
255
+ builder.sign({ key: testData.TX_SENDER.prv });
256
+ const tx = await builder.build();
257
+ const txJson = tx.toJson();
258
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
259
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
260
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
261
+ should_1.default.deepEqual(txJson.nonce, 0);
262
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
263
+ should_1.default.deepEqual(txJson.payload.functionArgs, [stringifyCv((0, transactions_1.someCV)((0, transactions_1.intCV)(amount)))]);
264
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_CONTRACT_CALL);
265
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
266
+ });
267
+ it('a signed serialized contract call transaction', async () => {
268
+ const builder = factory.from(testData.SIGNED_CONTRACT_CALL);
269
+ const tx = await builder.build();
270
+ const txJson = tx.toJson();
271
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
272
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
273
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
274
+ should_1.default.deepEqual(txJson.nonce, 0);
275
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
276
+ should_1.default.deepEqual(txJson.payload.functionArgs, [stringifyCv((0, transactions_1.someCV)((0, transactions_1.intCV)(123)))]);
277
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_CONTRACT_CALL);
278
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
279
+ tx.outputs.length.should.equal(1);
280
+ tx.outputs[0].address.should.equal(testData.CONTRACT_ADDRESS);
281
+ tx.outputs[0].value.should.equal('0');
282
+ tx.inputs.length.should.equal(1);
283
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
284
+ tx.inputs[0].value.should.equal('0');
285
+ });
286
+ it('a signed serialized self stacking contract call transaction', async () => {
287
+ const builder = factory.from(testData.SIGNED_SELF_STACK_CONTRACT_CALL);
288
+ const tx = await builder.build();
289
+ const txJson = tx.toJson();
290
+ should_1.default.deepEqual(txJson.payload.contractAddress, testData.CONTRACT_ADDRESS);
291
+ should_1.default.deepEqual(txJson.payload.contractName, testData.CONTRACT_NAME);
292
+ should_1.default.deepEqual(txJson.payload.functionName, testData.CONTRACT_FUNCTION_NAME);
293
+ should_1.default.deepEqual(txJson.nonce, 0);
294
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
295
+ // Now stacks-stx self-stacking supports 8 parameters
296
+ // https://docs.stacks.co/nakamoto-upgrade/signing-and-stacking/stacking-flow#solo-stacker-flow
297
+ should_1.default.deepEqual(txJson.payload.functionArgs.length, 8);
298
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_SELF_STACK_CONTRACT_CALL);
299
+ tx.type.should.equal(sdk_core_1.TransactionType.ContractCall);
300
+ tx.outputs.length.should.equal(1);
301
+ tx.outputs[0].address.should.equal(testData.CONTRACT_ADDRESS);
302
+ tx.outputs[0].value.should.equal('0');
303
+ tx.inputs.length.should.equal(1);
304
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
305
+ tx.inputs[0].value.should.equal('0');
306
+ });
307
+ it('a multisig transfer transaction', async () => {
308
+ const builder = initTxBuilder();
309
+ builder.functionArgs([{ type: 'optional', val: { type: 'int128', val: '123' } }]);
310
+ builder.sign({ key: testData.prv1 });
311
+ builder.sign({ key: testData.prv2 });
312
+ builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
313
+ builder.numberSignatures(2);
314
+ const tx = await builder.build();
315
+ JSON.stringify(tx.toJson());
316
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_CONTRACT_CALL);
317
+ });
318
+ describe('ParseCV test', () => {
319
+ it('Optional with out value', () => {
320
+ const amount = '400000000';
321
+ const builder = initTxBuilder();
322
+ builder.functionArgs([
323
+ { type: 'uint128', val: amount },
324
+ { type: 'principal', val: testData.ACCOUNT_2.address },
325
+ { type: 'optional' },
326
+ {
327
+ type: 'optional',
328
+ val: {
329
+ type: 'tuple',
330
+ val: [
331
+ { key: 'hashbytes', type: 'buffer', val: Buffer.from('some-hash') },
332
+ { key: 'version', type: 'buffer', val: new bn_js_1.default(1).toBuffer() },
333
+ ],
334
+ },
335
+ },
336
+ ]);
337
+ should_1.default.deepEqual(builder._functionArgs, [
338
+ (0, transactions_1.uintCV)(amount),
339
+ (0, transactions_1.standardPrincipalCV)(testData.ACCOUNT_2.address),
340
+ (0, transactions_1.noneCV)(),
341
+ (0, transactions_1.someCV)((0, transactions_1.tupleCV)({
342
+ hashbytes: (0, transactions_1.bufferCV)(Buffer.from('some-hash')),
343
+ version: (0, transactions_1.bufferCV)(new bn_js_1.default(1).toBuffer()),
344
+ })),
345
+ ]);
346
+ });
347
+ it('use ClarityValue', () => {
348
+ const amount = '400000000';
349
+ const builder = initTxBuilder();
350
+ builder.functionArgs([
351
+ (0, transactions_1.uintCV)(amount),
352
+ (0, transactions_1.standardPrincipalCV)(testData.ACCOUNT_2.address),
353
+ (0, transactions_1.noneCV)(),
354
+ (0, transactions_1.someCV)((0, transactions_1.tupleCV)({
355
+ hashbytes: (0, transactions_1.bufferCV)(Buffer.from('some-hash')),
356
+ version: (0, transactions_1.bufferCV)(new bn_js_1.default(1).toBuffer()),
357
+ })),
358
+ ]);
359
+ should_1.default.deepEqual(builder._functionArgs, [
360
+ (0, transactions_1.uintCV)(amount),
361
+ (0, transactions_1.standardPrincipalCV)(testData.ACCOUNT_2.address),
362
+ (0, transactions_1.noneCV)(),
363
+ (0, transactions_1.someCV)((0, transactions_1.tupleCV)({
364
+ hashbytes: (0, transactions_1.bufferCV)(Buffer.from('some-hash')),
365
+ version: (0, transactions_1.bufferCV)(new bn_js_1.default(1).toBuffer()),
366
+ })),
367
+ ]);
368
+ });
369
+ it('Buffer as string', () => {
370
+ const builder = initTxBuilder();
371
+ builder.functionArgs([
372
+ { type: 'buffer', val: 'some-hash' },
373
+ { type: 'buffer', val: '1' },
374
+ ]);
375
+ should_1.default.deepEqual(builder._functionArgs, [
376
+ (0, transactions_1.bufferCV)(Buffer.from('some-hash')),
377
+ (0, transactions_1.bufferCV)(new bn_js_1.default(1).toBuffer()),
378
+ ]);
379
+ });
380
+ it('Buffer as number', () => {
381
+ const builder = initTxBuilder();
382
+ builder.functionArgs([
383
+ { type: 'buffer', val: '1' },
384
+ { type: 'buffer', val: 1 },
385
+ ]);
386
+ should_1.default.deepEqual(builder._functionArgs, [
387
+ (0, transactions_1.bufferCV)(new bn_js_1.default(1).toBuffer()),
388
+ (0, transactions_1.bufferCV)(new bn_js_1.default(1).toBuffer()),
389
+ ]);
390
+ });
391
+ it('invalid type', () => {
392
+ const builder = initTxBuilder();
393
+ assert_1.default.throws(() => builder.functionArgs([{ type: 'unknow', val: 'any-val' }]), new RegExp('Unexpected Clarity ABI type primitive: "unknow"'));
394
+ });
395
+ });
396
+ describe('should fail', () => {
397
+ it('a contract call with an invalid key', () => {
398
+ const builder = initTxBuilder();
399
+ assert_1.default.throws(() => builder.sign({ key: 'invalidKey' }), /Unsupported private key/);
400
+ });
401
+ it('a contract call with an invalid contract address', () => {
402
+ const builder = initTxBuilder();
403
+ assert_1.default.throws(() => builder.contractAddress(testData.ACCOUNT_1.address), /Invalid contract address/);
404
+ });
405
+ it('a contract call with an invalid contract name pox-2', () => {
406
+ const builder = initTxBuilder();
407
+ assert_1.default.throws(() => builder.contractName('pox-2'), /Only pox-4 and send-many-memo contracts supported/);
408
+ });
409
+ it('a contract call with an invalid contract name pox-3', () => {
410
+ const builder = initTxBuilder();
411
+ assert_1.default.throws(() => builder.contractName('pox-3'), /Only pox-4 and send-many-memo contracts supported/);
412
+ });
413
+ it('a contract call with an invalid contract function name', () => {
414
+ const builder = initTxBuilder();
415
+ assert_1.default.throws(() => builder.functionName('test-function'), new RegExp('test-function is not supported contract function name'));
416
+ });
417
+ });
418
+ });
419
+ });
420
+ });
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jb250cmFjdEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGtEQUEyQjtBQUMzQiw2Q0FBK0Q7QUFDL0QsOENBQWtEO0FBQ2xELHVEQUE2RztBQUM3Ryw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLDRDQUF1QztBQUV2QyxzQ0FBaUQ7QUFDakQsdURBQXlDO0FBRXpDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxZQUFNLENBQUMsS0FBSyxDQUFDO0FBRXJDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRTtJQUNuQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUV4QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM5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QyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IEJpZ051bSBmcm9tICdibi5qcyc7XG5pbXBvcnQgeyBTdGFja3NUZXN0bmV0LCBTdGFja3NNYWlubmV0IH0gZnJvbSAnQHN0YWNrcy9uZXR3b3JrJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBidWZmZXJDViwgbm9uZUNWLCBzb21lQ1YsIHN0YW5kYXJkUHJpbmNpcGFsQ1YsIHR1cGxlQ1YsIHVpbnRDViwgaW50Q1YgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBTdHgsIFRzdHgsIFN0eExpYiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5jb25zdCB7IHN0cmluZ2lmeUN2IH0gPSBTdHhMaWIuVXRpbHM7XG5cbmRlc2NyaWJlKCdTdGFja3M6IENvbnRyYWN0IEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5OYW1lID0gJ3N0eCc7XG4gIGNvbnN0IGNvaW5OYW1lVGVzdCA9ICd0c3R4JztcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwge1xuICAgICAgZW52OiAnbW9jaycsXG4gICAgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdzdHgnLCBTdHguY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHN0eCcsIFRzdHguY3JlYXRlSW5zdGFuY2UpO1xuICB9KTtcblxuICBkZXNjcmliZSgnU3R4IENvbnRyYWN0IGNhbGwgQnVpbGRlcicsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZVRlc3QpKTtcbiAgICBjb25zdCBmYWN0b3J5UHJvZCA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoY29pbk5hbWUpKTtcblxuICAgIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldENvbnRyYWN0QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzE4MCcgfSk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UoMCk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3RBZGRyZXNzKHRlc3REYXRhLkNPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0TmFtZSh0ZXN0RGF0YS5DT05UUkFDVF9OQU1FKTtcbiAgICAgIHR4QnVpbGRlci5mdW5jdGlvbk5hbWUodGVzdERhdGEuQ09OVFJBQ1RfRlVOQ1RJT05fTkFNRSk7XG4gICAgICByZXR1cm4gdHhCdWlsZGVyO1xuICAgIH07XG5cbiAgICBkZXNjcmliZSgnY29udHJhY3QgYnVpbGRlciBlbnZpcm9ubWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgc2VsZWN0IHRoZSByaWdodCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzaG91bGQuZXF1YWwoZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKS5jb2luTmFtZSgpLCAndHN0eCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwoZmFjdG9yeVByb2QuZ2V0VHJhbnNmZXJCdWlsZGVyKCkuY29pbk5hbWUoKSwgJ3N0eCcpO1xuICAgICAgICAvLyB1c2VkIHR5cGUgYW55IHRvIGFjY2VzcyBwcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlclByb2Q6IGFueSA9IGZhY3RvcnlQcm9kLmdldFRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgICAgIHR4QnVpbGRlci5fbmV0d29yay5zaG91bGQuZGVlcEVxdWFsKG5ldyBTdGFja3NUZXN0bmV0KCkpO1xuICAgICAgICB0eEJ1aWxkZXJQcm9kLl9uZXR3b3JrLnNob3VsZC5kZWVwRXF1YWwobmV3IFN0YWNrc01haW5uZXQoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgICAgaXQoJ2FuIHVuc2lnbmVkIGNvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgICAgICB7IHR5cGU6ICd1aW50MTI4JywgdmFsOiAnNDAwMDAwMDAwJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ3ByaW5jaXBhbCcsIHZhbDogdGVzdERhdGEuQUNDT1VOVF8yLmFkZHJlc3MgfSxcbiAgICAgICAgICB7IHR5cGU6ICdvcHRpb25hbCcsIHZhbDogeyB0eXBlOiAndWludDEyOCcsIHZhbDogJzIwMCcgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdvcHRpb25hbCcsXG4gICAgICAgICAgICB2YWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3R1cGxlJyxcbiAgICAgICAgICAgICAgdmFsOiBbXG4gICAgICAgICAgICAgICAgeyBrZXk6ICdoYXNoYnl0ZXMnLCB0eXBlOiAnYnVmZmVyJywgdmFsOiBCdWZmZXIuZnJvbSgnc29tZS1oYXNoJykgfSxcbiAgICAgICAgICAgICAgICB7IGtleTogJ3ZlcnNpb24nLCB0eXBlOiAnYnVmZmVyJywgdmFsOiBuZXcgQmlnTnVtKDEpLnRvQnVmZmVyKCkgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MsIHRlc3REYXRhLkNPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0TmFtZSwgdGVzdERhdGEuQ09OVFJBQ1RfTkFNRSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuZnVuY3Rpb25OYW1lLCB0ZXN0RGF0YS5DT05UUkFDVF9GVU5DVElPTl9OQU1FKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlVOU0lHTkVEX0NPTlRSQUNUX0NBTEwpO1xuXG4gICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIHVuc2lnbmVkIHNlbGYgc3RhY2tpbmcgY29udHJhY3QgY2FsbCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgLyogQ29udHJhY3QgY2FsbCBpbiBjbGFyaXR5IFBPWC00XG4gICAgICAgIChkZWZpbmUtcHVibGljIChzdGFjay1zdHggKGFtb3VudC11c3R4IHVpbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChwb3gtYWRkciAodHVwbGUgKHZlcnNpb24gKGJ1ZmYgMSkpIChoYXNoYnl0ZXMgKGJ1ZmYgMzIpKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFydC1idXJuLWh0IHVpbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NrLXBlcmlvZCB1aW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbmVyLXNpZyAob3B0aW9uYWwgKGJ1ZmYgNjUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25lci1rZXkgKGJ1ZmYgMzMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4LWFtb3VudCB1aW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoYXV0aC1pZCB1aW50KSlcbiAgICAgICAgICovXG4gICAgICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgICAgICB7IHR5cGU6ICd1aW50MTI4JywgdmFsOiAnNDAwMDAwMDAwJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0dXBsZScsXG4gICAgICAgICAgICB2YWw6IFtcbiAgICAgICAgICAgICAgeyBrZXk6ICdoYXNoYnl0ZXMnLCB0eXBlOiAnYnVmZmVyJywgdmFsOiBCdWZmZXIuZnJvbSgnc29tZS1oYXNoJykgfSxcbiAgICAgICAgICAgICAgeyBrZXk6ICd2ZXJzaW9uJywgdHlwZTogJ2J1ZmZlcicsIHZhbDogbmV3IEJpZ051bSgxKS50b0J1ZmZlcigpIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB0eXBlOiAndWludDEyOCcsIHZhbDogJzUyODAwJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ3VpbnQxMjgnLCB2YWw6ICcyJyB9LFxuICAgICAgICAgIC8vIE5ha2Ftb3RvIHVwZ3JhZGUgbmV3IDQgcGFyYW1ldGVyc1xuICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5zdGFja3MuY28vbmFrYW1vdG8tdXBncmFkZS9zaWduaW5nLWFuZC1zdGFja2luZy9zdGFja2luZy1mbG93I3NvbG8tc3RhY2tlci1mbG93XG4gICAgICAgICAgeyB0eXBlOiAnb3B0aW9uYWwnLCB2YWw6IHsgdHlwZTogJ2J1ZmZlcicsIHZhbDogQnVmZmVyLmZyb20oJ3NvbWUtaGFzaCcpIH0gfSxcbiAgICAgICAgICB7IHR5cGU6ICdidWZmZXInLCB2YWw6IEJ1ZmZlci5mcm9tKCdzb21lLWhhc2gnKSB9LFxuICAgICAgICAgIHsgdHlwZTogJ3VpbnQxMjgnLCB2YWw6ICczNDAyODIzNjY5MjA5Mzg0NjM0NjMzNzQ2MDc0MzE3NjgyMTE0NTUnIH0sXG4gICAgICAgICAgeyB0eXBlOiAndWludDEyOCcsIHZhbDogJzEyMzQ1NicgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MsIHRlc3REYXRhLkNPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0TmFtZSwgdGVzdERhdGEuQ09OVFJBQ1RfTkFNRSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuZnVuY3Rpb25OYW1lLCB0ZXN0RGF0YS5DT05UUkFDVF9GVU5DVElPTl9OQU1FKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlVOU0lHTkVEX1NFTEZfU1RBQ0tfQ09OVFJBQ1RfQ0FMTCk7XG5cbiAgICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5DT05UUkFDVF9BRERSRVNTKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBzaWduZWQgY29udHJhY3QgY2FsbCB3aXRoIGFyZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgICAgICB7IHR5cGU6ICd1aW50MTI4JywgdmFsOiAnNDAwMDAwMDAwJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ3ByaW5jaXBhbCcsIHZhbDogdGVzdERhdGEuQUNDT1VOVF8yLmFkZHJlc3MgfSxcbiAgICAgICAgICB7IHR5cGU6ICdvcHRpb25hbCcgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb3B0aW9uYWwnLFxuICAgICAgICAgICAgdmFsOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICd0dXBsZScsXG4gICAgICAgICAgICAgIHZhbDogW1xuICAgICAgICAgICAgICAgIHsga2V5OiAnaGFzaGJ5dGVzJywgdHlwZTogJ2J1ZmZlcicsIHZhbDogQnVmZmVyLmZyb20oJ3NvbWUtaGFzaCcpIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6ICd2ZXJzaW9uJywgdHlwZTogJ2J1ZmZlcicsIHZhbDogbmV3IEJpZ051bSgxKS50b0J1ZmZlcigpIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlRYX1NFTkRFUi5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0QWRkcmVzcywgdGVzdERhdGEuQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuY29udHJhY3ROYW1lLCB0ZXN0RGF0YS5DT05UUkFDVF9OQU1FKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbk5hbWUsIHRlc3REYXRhLkNPTlRSQUNUX0ZVTkNUSU9OX05BTUUpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25jZSwgMCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX0NPTlRSQUNUX1dJVEhfQVJHUyk7XG5cbiAgICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5DT05UUkFDVF9BRERSRVNTKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBzaWduZWQgc2VsZiBzdGFja2luZyBjb250cmFjdCBjYWxsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICAvKiBDb250cmFjdCBjYWxsIGluIGNsYXJpdHkgUE9YLTRcbiAgICAgICAgKGRlZmluZS1wdWJsaWMgKHN0YWNrLXN0eCAoYW1vdW50LXVzdHggdWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHBveC1hZGRyICh0dXBsZSAodmVyc2lvbiAoYnVmZiAxKSkgKGhhc2hieXRlcyAoYnVmZiAzMikpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0LWJ1cm4taHQgdWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2stcGVyaW9kIHVpbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzaWduZXItc2lnIChvcHRpb25hbCAoYnVmZiA2NSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbmVyLWtleSAoYnVmZiAzMykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtYXgtYW1vdW50IHVpbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChhdXRoLWlkIHVpbnQpKVxuICAgICAgICAgKi9cbiAgICAgICAgYnVpbGRlci5mdW5jdGlvbkFyZ3MoW1xuICAgICAgICAgIHsgdHlwZTogJ3VpbnQxMjgnLCB2YWw6ICc0MDAwMDAwMDAnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3R1cGxlJyxcbiAgICAgICAgICAgIHZhbDogW1xuICAgICAgICAgICAgICB7IGtleTogJ2hhc2hieXRlcycsIHR5cGU6ICdidWZmZXInLCB2YWw6IEJ1ZmZlci5mcm9tKCdzb21lLWhhc2gnKSB9LFxuICAgICAgICAgICAgICB7IGtleTogJ3ZlcnNpb24nLCB0eXBlOiAnYnVmZmVyJywgdmFsOiBuZXcgQmlnTnVtKDEpLnRvQnVmZmVyKCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHR5cGU6ICd1aW50MTI4JywgdmFsOiAnNTI4MDAnIH0sXG4gICAgICAgICAgeyB0eXBlOiAndWludDEyOCcsIHZhbDogJzInIH0sXG4gICAgICAgICAgLy8gTmFrYW1vdG8gdXBncmFkZSBuZXcgNCBwYXJhbWV0ZXJzXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLnN0YWNrcy5jby9uYWthbW90by11cGdyYWRlL3NpZ25pbmctYW5kLXN0YWNraW5nL3N0YWNraW5nLWZsb3cjc29sby1zdGFja2VyLWZsb3dcbiAgICAgICAgICB7IHR5cGU6ICdvcHRpb25hbCcsIHZhbDogeyB0eXBlOiAnYnVmZmVyJywgdmFsOiBCdWZmZXIuZnJvbSgnc29tZS1oYXNoJykgfSB9LFxuICAgICAgICAgIHsgdHlwZTogJ2J1ZmZlcicsIHZhbDogQnVmZmVyLmZyb20oJ3NvbWUtaGFzaCcpIH0sXG4gICAgICAgICAgeyB0eXBlOiAndWludDEyOCcsIHZhbDogJzM0MDI4MjM2NjkyMDkzODQ2MzQ2MzM3NDYwNzQzMTc2ODIxMTQ1NScgfSxcbiAgICAgICAgICB7IHR5cGU6ICd1aW50MTI4JywgdmFsOiAnMTIzNDU2JyB9LFxuICAgICAgICBdKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MsIHRlc3REYXRhLkNPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0TmFtZSwgdGVzdERhdGEuQ09OVFJBQ1RfTkFNRSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuZnVuY3Rpb25OYW1lLCB0ZXN0RGF0YS5DT05UUkFDVF9GVU5DVElPTl9OQU1FKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9TRUxGX1NUQUNLX0NPTlRSQUNUX0NBTEwpO1xuXG4gICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Egc2lnbmVkIGNvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IDEyMztcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5mdW5jdGlvbkFyZ3MoW3sgdHlwZTogJ29wdGlvbmFsJywgdmFsOiB7IHR5cGU6ICdpbnQxMjgnLCB2YWw6IGFtb3VudCB9IH1dKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MsIHRlc3REYXRhLkNPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0TmFtZSwgdGVzdERhdGEuQ09OVFJBQ1RfTkFNRSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuZnVuY3Rpb25OYW1lLCB0ZXN0RGF0YS5DT05UUkFDVF9GVU5DVElPTl9OQU1FKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJncywgW3N0cmluZ2lmeUN2KHNvbWVDVihpbnRDVihhbW91bnQpKSldKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfQ09OVFJBQ1RfQ0FMTCk7XG4gICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCBzZXJpYWxpemVkIGNvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU0lHTkVEX0NPTlRSQUNUX0NBTEwpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuY29udHJhY3RBZGRyZXNzLCB0ZXN0RGF0YS5DT05UUkFDVF9BRERSRVNTKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5jb250cmFjdE5hbWUsIHRlc3REYXRhLkNPTlRSQUNUX05BTUUpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uTmFtZSwgdGVzdERhdGEuQ09OVFJBQ1RfRlVOQ1RJT05fTkFNRSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLm5vbmNlLCAwKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3MsIFtzdHJpbmdpZnlDdihzb21lQ1YoaW50Q1YoMTIzKSkpXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX0NPTlRSQUNUX0NBTEwpO1xuICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLkNPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCBzZXJpYWxpemVkIHNlbGYgc3RhY2tpbmcgY29udHJhY3QgY2FsbCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TSUdORURfU0VMRl9TVEFDS19DT05UUkFDVF9DQUxMKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0QWRkcmVzcywgdGVzdERhdGEuQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuY29udHJhY3ROYW1lLCB0ZXN0RGF0YS5DT05UUkFDVF9OQU1FKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbk5hbWUsIHRlc3REYXRhLkNPTlRSQUNUX0ZVTkNUSU9OX05BTUUpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25jZSwgMCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIC8vIE5vdyBzdGFja3Mtc3R4IHNlbGYtc3RhY2tpbmcgc3VwcG9ydHMgOCBwYXJhbWV0ZXJzXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5zdGFja3MuY28vbmFrYW1vdG8tdXBncmFkZS9zaWduaW5nLWFuZC1zdGFja2luZy9zdGFja2luZy1mbG93I3NvbG8tc3RhY2tlci1mbG93XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuZnVuY3Rpb25BcmdzLmxlbmd0aCwgOCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1NFTEZfU1RBQ0tfQ09OVFJBQ1RfQ0FMTCk7XG4gICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFt7IHR5cGU6ICdvcHRpb25hbCcsIHZhbDogeyB0eXBlOiAnaW50MTI4JywgdmFsOiAnMTIzJyB9IH1dKTtcblxuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjEgfSk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MiB9KTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5NVUxUSV9TSUdfQ09OVFJBQ1RfQ0FMTCk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ1BhcnNlQ1YgdGVzdCcsICgpID0+IHtcbiAgICAgICAgaXQoJ09wdGlvbmFsIHdpdGggb3V0IHZhbHVlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9ICc0MDAwMDAwMDAnO1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgICAgYnVpbGRlci5mdW5jdGlvbkFyZ3MoW1xuICAgICAgICAgICAgeyB0eXBlOiAndWludDEyOCcsIHZhbDogYW1vdW50IH0sXG4gICAgICAgICAgICB7IHR5cGU6ICdwcmluY2lwYWwnLCB2YWw6IHRlc3REYXRhLkFDQ09VTlRfMi5hZGRyZXNzIH0sXG4gICAgICAgICAgICB7IHR5cGU6ICdvcHRpb25hbCcgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ29wdGlvbmFsJyxcbiAgICAgICAgICAgICAgdmFsOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3R1cGxlJyxcbiAgICAgICAgICAgICAgICB2YWw6IFtcbiAgICAgICAgICAgICAgICAgIHsga2V5OiAnaGFzaGJ5dGVzJywgdHlwZTogJ2J1ZmZlcicsIHZhbDogQnVmZmVyLmZyb20oJ3NvbWUtaGFzaCcpIH0sXG4gICAgICAgICAgICAgICAgICB7IGtleTogJ3ZlcnNpb24nLCB0eXBlOiAnYnVmZmVyJywgdmFsOiBuZXcgQmlnTnVtKDEpLnRvQnVmZmVyKCkgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKChidWlsZGVyIGFzIGFueSkuX2Z1bmN0aW9uQXJncywgW1xuICAgICAgICAgICAgdWludENWKGFtb3VudCksXG4gICAgICAgICAgICBzdGFuZGFyZFByaW5jaXBhbENWKHRlc3REYXRhLkFDQ09VTlRfMi5hZGRyZXNzKSxcbiAgICAgICAgICAgIG5vbmVDVigpLFxuICAgICAgICAgICAgc29tZUNWKFxuICAgICAgICAgICAgICB0dXBsZUNWKHtcbiAgICAgICAgICAgICAgICBoYXNoYnl0ZXM6IGJ1ZmZlckNWKEJ1ZmZlci5mcm9tKCdzb21lLWhhc2gnKSksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogYnVmZmVyQ1YobmV3IEJpZ051bSgxKS50b0J1ZmZlcigpKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd1c2UgQ2xhcml0eVZhbHVlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9ICc0MDAwMDAwMDAnO1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgICAgYnVpbGRlci5mdW5jdGlvbkFyZ3MoW1xuICAgICAgICAgICAgdWludENWKGFtb3VudCksXG4gICAgICAgICAgICBzdGFuZGFyZFByaW5jaXBhbENWKHRlc3REYXRhLkFDQ09VTlRfMi5hZGRyZXNzKSxcbiAgICAgICAgICAgIG5vbmVDVigpLFxuICAgICAgICAgICAgc29tZUNWKFxuICAgICAgICAgICAgICB0dXBsZUNWKHtcbiAgICAgICAgICAgICAgICBoYXNoYnl0ZXM6IGJ1ZmZlckNWKEJ1ZmZlci5mcm9tKCdzb21lLWhhc2gnKSksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogYnVmZmVyQ1YobmV3IEJpZ051bSgxKS50b0J1ZmZlcigpKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9mdW5jdGlvbkFyZ3MsIFtcbiAgICAgICAgICAgIHVpbnRDVihhbW91bnQpLFxuICAgICAgICAgICAgc3RhbmRhcmRQcmluY2lwYWxDVih0ZXN0RGF0YS5BQ0NPVU5UXzIuYWRkcmVzcyksXG4gICAgICAgICAgICBub25lQ1YoKSxcbiAgICAgICAgICAgIHNvbWVDVihcbiAgICAgICAgICAgICAgdHVwbGVDVih7XG4gICAgICAgICAgICAgICAgaGFzaGJ5dGVzOiBidWZmZXJDVihCdWZmZXIuZnJvbSgnc29tZS1oYXNoJykpLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGJ1ZmZlckNWKG5ldyBCaWdOdW0oMSkudG9CdWZmZXIoKSksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnQnVmZmVyIGFzIHN0cmluZycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgICAgICAgIHsgdHlwZTogJ2J1ZmZlcicsIHZhbDogJ3NvbWUtaGFzaCcgfSxcbiAgICAgICAgICAgIHsgdHlwZTogJ2J1ZmZlcicsIHZhbDogJzEnIH0sXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9mdW5jdGlvbkFyZ3MsIFtcbiAgICAgICAgICAgIGJ1ZmZlckNWKEJ1ZmZlci5mcm9tKCdzb21lLWhhc2gnKSksXG4gICAgICAgICAgICBidWZmZXJDVihuZXcgQmlnTnVtKDEpLnRvQnVmZmVyKCkpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnQnVmZmVyIGFzIG51bWJlcicsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgICAgICAgIHsgdHlwZTogJ2J1ZmZlcicsIHZhbDogJzEnIH0sXG4gICAgICAgICAgICB7IHR5cGU6ICdidWZmZXInLCB2YWw6IDEgfSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKChidWlsZGVyIGFzIGFueSkuX2Z1bmN0aW9uQXJncywgW1xuICAgICAgICAgICAgYnVmZmVyQ1YobmV3IEJpZ051bSgxKS50b0J1ZmZlcigpKSxcbiAgICAgICAgICAgIGJ1ZmZlckNWKG5ldyBCaWdOdW0oMSkudG9CdWZmZXIoKSksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdpbnZhbGlkIHR5cGUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcblxuICAgICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgICAoKSA9PiBidWlsZGVyLmZ1bmN0aW9uQXJncyhbeyB0eXBlOiAndW5rbm93JywgdmFsOiAnYW55LXZhbCcgfV0pLFxuICAgICAgICAgICAgbmV3IFJlZ0V4cCgnVW5leHBlY3RlZCBDbGFyaXR5IEFCSSB0eXBlIHByaW1pdGl2ZTogXCJ1bmtub3dcIicpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgICAgICBpdCgnYSBjb250cmFjdCBjYWxsIHdpdGggYW4gaW52YWxpZCBrZXknLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc2lnbih7IGtleTogJ2ludmFsaWRLZXknIH0pLCAvVW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkvKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdhIGNvbnRyYWN0IGNhbGwgd2l0aCBhbiBpbnZhbGlkIGNvbnRyYWN0IGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuY29udHJhY3RBZGRyZXNzKHRlc3REYXRhLkFDQ09VTlRfMS5hZGRyZXNzKSwgL0ludmFsaWQgY29udHJhY3QgYWRkcmVzcy8pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2EgY29udHJhY3QgY2FsbCB3aXRoIGFuIGludmFsaWQgY29udHJhY3QgbmFtZSBwb3gtMicsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5jb250cmFjdE5hbWUoJ3BveC0yJyksIC9Pbmx5IHBveC00IGFuZCBzZW5kLW1hbnktbWVtbyBjb250cmFjdHMgc3VwcG9ydGVkLyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnYSBjb250cmFjdCBjYWxsIHdpdGggYW4gaW52YWxpZCBjb250cmFjdCBuYW1lIHBveC0zJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmNvbnRyYWN0TmFtZSgncG94LTMnKSwgL09ubHkgcG94LTQgYW5kIHNlbmQtbWFueS1tZW1vIGNvbnRyYWN0cyBzdXBwb3J0ZWQvKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdhIGNvbnRyYWN0IGNhbGwgd2l0aCBhbiBpbnZhbGlkIGNvbnRyYWN0IGZ1bmN0aW9uIG5hbWUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICAgKCkgPT4gYnVpbGRlci5mdW5jdGlvbk5hbWUoJ3Rlc3QtZnVuY3Rpb24nKSxcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoJ3Rlc3QtZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBjb250cmFjdCBmdW5jdGlvbiBuYW1lJylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fungibleTokenTransferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fungibleTokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/fungibleTokenTransferBuilder.ts"],"names":[],"mappings":""}