@bitgo-beta/sdk-core 8.2.1-beta.1737 → 8.2.1-beta.1739
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.
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +4 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +12 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/network/network.d.ts +1 -1
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/network.js +3 -5
- package/dist/src/bitgo/trading/network/types.d.ts +1 -1
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/types.js +1 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts +14 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +52 -7
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +4 -1
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +35 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +100 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +2 -2
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +50 -14
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +11 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +4 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +9 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +4 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +9 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +7 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts +49 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +70 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +201 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +162 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +239 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +62 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +326 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
/**
|
|
7
|
+
* @prettier
|
|
8
|
+
*/
|
|
9
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
10
|
+
require("should");
|
|
11
|
+
const src_1 = require("../../../../src");
|
|
12
|
+
describe('Wallet - OFC signTransaction', function () {
|
|
13
|
+
let wallet;
|
|
14
|
+
let mockBitGo;
|
|
15
|
+
let mockBaseCoin;
|
|
16
|
+
let mockWalletData;
|
|
17
|
+
beforeEach(function () {
|
|
18
|
+
mockBitGo = {
|
|
19
|
+
url: sinon_1.default.stub().returns('https://test.bitgo.com'),
|
|
20
|
+
post: sinon_1.default.stub(),
|
|
21
|
+
get: sinon_1.default.stub(),
|
|
22
|
+
setRequestTracer: sinon_1.default.stub(),
|
|
23
|
+
};
|
|
24
|
+
mockBaseCoin = {
|
|
25
|
+
getFamily: sinon_1.default.stub().returns('ofc'),
|
|
26
|
+
url: sinon_1.default.stub().returns('https://test.bitgo.com/wallet'),
|
|
27
|
+
keychains: sinon_1.default.stub(),
|
|
28
|
+
supportsTss: sinon_1.default.stub().returns(false),
|
|
29
|
+
getMPCAlgorithm: sinon_1.default.stub(),
|
|
30
|
+
presignTransaction: sinon_1.default.stub().resolvesArg(0),
|
|
31
|
+
keyIdsForSigning: sinon_1.default.stub().returns([0]),
|
|
32
|
+
signTransaction: sinon_1.default.stub().resolves({ halfSigned: { payload: 'test', signature: 'aabbcc' } }),
|
|
33
|
+
};
|
|
34
|
+
mockWalletData = {
|
|
35
|
+
id: 'test-wallet-id',
|
|
36
|
+
coin: 'ofcusdt',
|
|
37
|
+
keys: ['user-key', 'backup-key', 'bitgo-key'],
|
|
38
|
+
multisigType: 'onchain',
|
|
39
|
+
enterprise: 'ent-id',
|
|
40
|
+
};
|
|
41
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
42
|
+
});
|
|
43
|
+
afterEach(function () {
|
|
44
|
+
sinon_1.default.restore();
|
|
45
|
+
});
|
|
46
|
+
it('should pass prv and paylaod to baseCoin.signTransaction', async function () {
|
|
47
|
+
const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
|
|
48
|
+
const prv = 'test-prv';
|
|
49
|
+
await wallet.signTransaction({ txPrebuild, prv });
|
|
50
|
+
mockBaseCoin.signTransaction.calledOnce.should.be.true();
|
|
51
|
+
mockBaseCoin.signTransaction.calledWith({ txPrebuild, prv });
|
|
52
|
+
const callArgs = mockBaseCoin.signTransaction.getCall(0).args[0];
|
|
53
|
+
callArgs.prv.should.equal(prv);
|
|
54
|
+
});
|
|
55
|
+
it('should return the result from baseCoin.signTransaction', async function () {
|
|
56
|
+
const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
|
|
57
|
+
const prv = 'test-prv';
|
|
58
|
+
const result = await wallet.signTransaction({ txPrebuild, prv });
|
|
59
|
+
result.should.deepEqual({ halfSigned: { payload: 'test', signature: 'aabbcc' } });
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDO1lBQ25ELElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztZQUMxRCxTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDN0Isa0JBQWtCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0MsZ0JBQWdCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGVBQWUsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztTQUNqRyxDQUFDO1FBRUYsY0FBYyxHQUFHO1lBQ2YsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1lBQzdDLFlBQVksRUFBRSxTQUFTO1lBQ3ZCLFVBQVUsRUFBRSxRQUFRO1NBQ3JCLENBQUM7UUFFRixNQUFNLEdBQUcsSUFBSSxZQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLGVBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEVBQVMsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFFdkIsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFbEQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxZQUFZLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSztRQUNoRSxNQUFNLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxFQUFTLENBQUM7UUFDdEUsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ1dhbGxldCAtIE9GQyBzaWduVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0RGF0YTogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20nKSxcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvZmMnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vd2FsbGV0JyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKSxcbiAgICAgIHByZXNpZ25UcmFuc2FjdGlvbjogc2lub24uc3R1YigpLnJlc29sdmVzQXJnKDApLFxuICAgICAga2V5SWRzRm9yU2lnbmluZzogc2lub24uc3R1YigpLnJldHVybnMoWzBdKSxcbiAgICAgIHNpZ25UcmFuc2FjdGlvbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkOiAndGVzdCcsIHNpZ25hdHVyZTogJ2FhYmJjYycgfSB9KSxcbiAgICB9O1xuXG4gICAgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgIGNvaW46ICdvZmN1c2R0JyxcbiAgICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcGFzcyBwcnYgYW5kIHBheWxhb2QgdG8gYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7IHR4SW5mbzogeyBwYXlsb2FkOiAne1wiYW1vdW50XCI6XCIxMDBcIn0nIH0gfSBhcyBhbnk7XG4gICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcblxuICAgIGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG5cbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZFdpdGgoeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmdldENhbGwoMCkuYXJnc1swXTtcbiAgICBjYWxsQXJncy5wcnYuc2hvdWxkLmVxdWFsKHBydik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByZXN1bHQgZnJvbSBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IHsgdHhJbmZvOiB7IHBheWxvYWQ6ICd7XCJhbW91bnRcIjpcIjEwMFwifScgfSB9IGFzIGFueTtcbiAgICBjb25zdCBwcnYgPSAndGVzdC1wcnYnO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHBydiB9KTtcblxuICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkOiAndGVzdCcsIHNpZ25hdHVyZTogJ2FhYmJjYycgfSB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceManagement.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/resourceManagement.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC;AAChB,OAAO,cAAc,CAAC"}
|
|
@@ -0,0 +1,326 @@
|
|
|
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 = __importStar(require("assert"));
|
|
40
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
41
|
+
require("should");
|
|
42
|
+
require("should-sinon");
|
|
43
|
+
const src_1 = require("../../../../src");
|
|
44
|
+
describe('Wallet - resource management', function () {
|
|
45
|
+
let wallet;
|
|
46
|
+
let mockBitGo;
|
|
47
|
+
let mockBaseCoin;
|
|
48
|
+
let mockWalletData;
|
|
49
|
+
const delegations = [
|
|
50
|
+
{ receiverAddress: 'TRecv1', amount: '1000', resource: 'ENERGY' },
|
|
51
|
+
{ receiverAddress: 'TRecv2', amount: '2000', resource: 'BANDWIDTH' },
|
|
52
|
+
];
|
|
53
|
+
const undelegations = [{ receiverAddress: 'TRecv1', amount: '1000', resource: 'ENERGY' }];
|
|
54
|
+
function stubPost(response) {
|
|
55
|
+
const resultStub = sinon_1.default.stub().resolves(response);
|
|
56
|
+
const sendStub = sinon_1.default.stub().returns({ result: resultStub });
|
|
57
|
+
mockBitGo.post.returns({ send: sendStub });
|
|
58
|
+
return { sendStub };
|
|
59
|
+
}
|
|
60
|
+
beforeEach(function () {
|
|
61
|
+
mockBitGo = {
|
|
62
|
+
post: sinon_1.default.stub(),
|
|
63
|
+
setRequestTracer: sinon_1.default.stub(),
|
|
64
|
+
};
|
|
65
|
+
mockBaseCoin = {
|
|
66
|
+
url: sinon_1.default.stub().callsFake((path) => `/ttrx${path}`),
|
|
67
|
+
supportsResourceDelegation: sinon_1.default.stub().returns(true),
|
|
68
|
+
supportsTss: sinon_1.default.stub().returns(false),
|
|
69
|
+
getMPCAlgorithm: sinon_1.default.stub().returns('ecdsa'),
|
|
70
|
+
getFullName: sinon_1.default.stub().returns('Tron'),
|
|
71
|
+
postProcessPrebuild: sinon_1.default.stub().callsFake((prebuild) => Promise.resolve(prebuild)),
|
|
72
|
+
};
|
|
73
|
+
mockWalletData = {
|
|
74
|
+
id: 'test-wallet-id',
|
|
75
|
+
keys: ['user-key', 'backup-key', 'bitgo-key'],
|
|
76
|
+
type: 'hot',
|
|
77
|
+
multisigType: 'hot',
|
|
78
|
+
};
|
|
79
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
80
|
+
});
|
|
81
|
+
afterEach(function () {
|
|
82
|
+
sinon_1.default.restore();
|
|
83
|
+
});
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// buildResourceDelegations
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
describe('buildResourceDelegations', function () {
|
|
88
|
+
it('should throw if coin does not support resource delegation', async function () {
|
|
89
|
+
mockBaseCoin.supportsResourceDelegation.returns(false);
|
|
90
|
+
await wallet.buildResourceDelegations({ delegations }).should.be.rejectedWith('Tron does not support resource delegation.');
|
|
91
|
+
});
|
|
92
|
+
it('should throw if delegations array is empty', async function () {
|
|
93
|
+
await wallet.buildResourceDelegations({ delegations: [] }).should.be.rejectedWith('delegations must be a non-empty array.');
|
|
94
|
+
});
|
|
95
|
+
it('should POST to /delegateResources/build and return prebuilds with walletId', async function () {
|
|
96
|
+
stubPost({ transactions: [{ txHex: 'aaa' }, { txHex: 'bbb' }], errors: [] });
|
|
97
|
+
const result = await wallet.buildResourceDelegations({ delegations });
|
|
98
|
+
result.prebuilds.should.have.length(2);
|
|
99
|
+
result.buildFailures.should.have.length(0);
|
|
100
|
+
result.prebuilds[0].walletId.should.equal('test-wallet-id');
|
|
101
|
+
result.prebuilds[1].walletId.should.equal('test-wallet-id');
|
|
102
|
+
sinon_1.default.assert.calledOnce(mockBitGo.post);
|
|
103
|
+
mockBitGo.post.firstCall.args[0].should.containEql('/delegateResources/build');
|
|
104
|
+
});
|
|
105
|
+
it('should return buildFailures when API returns errors', async function () {
|
|
106
|
+
stubPost({
|
|
107
|
+
transactions: [{ txHex: 'aaa' }],
|
|
108
|
+
errors: [{ error: 'insufficient balance', receiverAddress: 'TRecv2' }],
|
|
109
|
+
});
|
|
110
|
+
const result = await wallet.buildResourceDelegations({ delegations });
|
|
111
|
+
result.prebuilds.should.have.length(1);
|
|
112
|
+
result.buildFailures.should.have.length(1);
|
|
113
|
+
result.buildFailures[0].should.deepEqual({ message: 'insufficient balance', receiverAddress: 'TRecv2' });
|
|
114
|
+
});
|
|
115
|
+
it('should throw if API response is missing transactions array', async function () {
|
|
116
|
+
stubPost({ errors: [] });
|
|
117
|
+
await wallet.buildResourceDelegations({ delegations }).should.be.rejectedWith('Unexpected response from /delegateResources/build: missing transactions array');
|
|
118
|
+
});
|
|
119
|
+
it('should only send whitelisted params (delegations, apiVersion) to the API', async function () {
|
|
120
|
+
const { sendStub } = stubPost({ transactions: [{ txHex: 'aaa' }], errors: [] });
|
|
121
|
+
await wallet.buildResourceDelegations({ delegations, walletPassphrase: 'secret' });
|
|
122
|
+
const bodyArg = sendStub.firstCall.args[0];
|
|
123
|
+
bodyArg.should.have.property('delegations');
|
|
124
|
+
bodyArg.should.not.have.property('walletPassphrase');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// buildResourceUndelegations
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
describe('buildResourceUndelegations', function () {
|
|
131
|
+
it('should throw if undelegations array is empty', async function () {
|
|
132
|
+
await wallet.buildResourceUndelegations({ undelegations: [] }).should.be.rejectedWith('undelegations must be a non-empty array.');
|
|
133
|
+
});
|
|
134
|
+
it('should POST to /undelegateResources/build and return prebuilds', async function () {
|
|
135
|
+
stubPost({ transactions: [{ txHex: 'ccc' }], errors: [] });
|
|
136
|
+
const result = await wallet.buildResourceUndelegations({ undelegations });
|
|
137
|
+
result.prebuilds.should.have.length(1);
|
|
138
|
+
result.buildFailures.should.have.length(0);
|
|
139
|
+
sinon_1.default.assert.calledOnce(mockBitGo.post);
|
|
140
|
+
mockBitGo.post.firstCall.args[0].should.containEql('/undelegateResources/build');
|
|
141
|
+
});
|
|
142
|
+
it('should return buildFailures when API returns errors for undelegations', async function () {
|
|
143
|
+
stubPost({
|
|
144
|
+
transactions: [],
|
|
145
|
+
errors: [{ error: 'lock period active', receiverAddress: 'TRecv1' }],
|
|
146
|
+
});
|
|
147
|
+
const result = await wallet.buildResourceUndelegations({ undelegations });
|
|
148
|
+
result.prebuilds.should.have.length(0);
|
|
149
|
+
result.buildFailures.should.have.length(1);
|
|
150
|
+
result.buildFailures[0].should.deepEqual({ message: 'lock period active', receiverAddress: 'TRecv1' });
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// sendResourceDelegation (single)
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
describe('sendResourceDelegation', function () {
|
|
157
|
+
it('should throw if coin does not support resource delegation', async function () {
|
|
158
|
+
mockBaseCoin.supportsResourceDelegation.returns(false);
|
|
159
|
+
await wallet.sendResourceDelegation({ prebuildTx: { txHex: 'aaa' } }).should.be.rejectedWith('Tron does not support resource delegation.');
|
|
160
|
+
});
|
|
161
|
+
it('should throw if prebuildTx is undefined for a non-custodial wallet', async function () {
|
|
162
|
+
await wallet.sendResourceDelegation({}).should.be.rejectedWith('Invalid prebuild for resource management transaction.');
|
|
163
|
+
});
|
|
164
|
+
it('should call sendManyTxRequests for a TSS wallet', async function () {
|
|
165
|
+
mockWalletData.multisigType = 'tss';
|
|
166
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
167
|
+
const sendManyStub = sinon_1.default.stub(wallet, 'sendManyTxRequests').resolves({ txid: 'tss-tx-1' });
|
|
168
|
+
const result = await wallet.sendResourceDelegation({ prebuildTx: { txRequestId: 'req-1' } });
|
|
169
|
+
result.should.deepEqual({ txid: 'tss-tx-1' });
|
|
170
|
+
sendManyStub.should.be.calledOnce();
|
|
171
|
+
});
|
|
172
|
+
it('should call prebuildAndSignTransaction + submitTransaction for a hot wallet', async function () {
|
|
173
|
+
const signedPrebuild = { txHex: 'signed-aaa', wallet };
|
|
174
|
+
sinon_1.default.stub(wallet, 'prebuildAndSignTransaction').resolves(signedPrebuild);
|
|
175
|
+
const submitStub = sinon_1.default.stub(wallet, 'submitTransaction').resolves({ txid: 'hot-tx-1' });
|
|
176
|
+
const result = await wallet.sendResourceDelegation({ prebuildTx: { txHex: 'aaa' } });
|
|
177
|
+
result.should.deepEqual({ txid: 'hot-tx-1' });
|
|
178
|
+
submitStub.should.be.calledOnce();
|
|
179
|
+
});
|
|
180
|
+
it('should call initiateTransaction for a custodial non-TSS wallet with stakingParams and recipients promoted from prebuildTx', async function () {
|
|
181
|
+
mockWalletData.type = 'custodial';
|
|
182
|
+
mockWalletData.multisigType = 'multisig';
|
|
183
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
184
|
+
const initiateStub = sinon_1.default.stub(wallet, 'initiateTransaction').resolves({ txid: 'custodial-tx-1' });
|
|
185
|
+
const stakingParams = {
|
|
186
|
+
actionType: 'delegateResource',
|
|
187
|
+
owner_address: 'TOwner',
|
|
188
|
+
receiver_address: 'TReceiver',
|
|
189
|
+
receiverAddress: 'TReceiver',
|
|
190
|
+
amount: '1000000000',
|
|
191
|
+
resource: 'ENERGY',
|
|
192
|
+
};
|
|
193
|
+
const recipients = [{ address: 'TReceiver', amount: '0' }];
|
|
194
|
+
const result = await wallet.sendResourceDelegation({
|
|
195
|
+
prebuildTx: { txHex: 'aaa', stakingParams, recipients },
|
|
196
|
+
});
|
|
197
|
+
result.should.deepEqual({ txid: 'custodial-tx-1' });
|
|
198
|
+
initiateStub.should.be.calledOnce();
|
|
199
|
+
const calledWith = initiateStub.firstCall.args[0];
|
|
200
|
+
calledWith.should.containEql({ type: 'delegateResource', stakingParams, recipients });
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// sendResourceDelegations (bulk)
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
describe('sendResourceDelegations', function () {
|
|
207
|
+
beforeEach(function () {
|
|
208
|
+
sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves();
|
|
209
|
+
});
|
|
210
|
+
it('should throw if coin does not support resource delegation', async function () {
|
|
211
|
+
mockBaseCoin.supportsResourceDelegation.returns(false);
|
|
212
|
+
await wallet.sendResourceDelegations({ delegations }).should.be.rejectedWith('Tron does not support resource delegation.');
|
|
213
|
+
});
|
|
214
|
+
it('should propagate build failures with receiverAddress into the failure array', async function () {
|
|
215
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
216
|
+
prebuilds: [],
|
|
217
|
+
buildFailures: [{ message: 'build error', receiverAddress: 'TRecv2' }],
|
|
218
|
+
});
|
|
219
|
+
const result = await wallet.sendResourceDelegations({ delegations });
|
|
220
|
+
result.success.should.have.length(0);
|
|
221
|
+
result.failure.should.have.length(1);
|
|
222
|
+
result.failure[0].should.deepEqual({ message: 'build error', receiverAddress: 'TRecv2' });
|
|
223
|
+
});
|
|
224
|
+
it('should return all successes when no failures', async function () {
|
|
225
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
226
|
+
prebuilds: [{ txHex: 'aaa' }, { txHex: 'bbb' }],
|
|
227
|
+
buildFailures: [],
|
|
228
|
+
});
|
|
229
|
+
sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').resolves({ txid: 'tx-ok' });
|
|
230
|
+
const result = await wallet.sendResourceDelegations({ delegations });
|
|
231
|
+
result.success.should.have.length(2);
|
|
232
|
+
result.failure.should.have.length(0);
|
|
233
|
+
});
|
|
234
|
+
it('should capture send failures with the correct receiverAddress from input entries', async function () {
|
|
235
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
236
|
+
prebuilds: [{ txHex: 'aaa' }, { txHex: 'bbb' }],
|
|
237
|
+
buildFailures: [],
|
|
238
|
+
});
|
|
239
|
+
const sendStub = sinon_1.default.stub(wallet, 'sendResourceManagementTransaction');
|
|
240
|
+
sendStub.onFirstCall().resolves({ txid: 'tx-1' });
|
|
241
|
+
sendStub.onSecondCall().rejects(new Error('send failed'));
|
|
242
|
+
const result = await wallet.sendResourceDelegations({ delegations });
|
|
243
|
+
result.success.should.have.length(1);
|
|
244
|
+
result.failure.should.have.length(1);
|
|
245
|
+
result.failure[0].message.should.equal('send failed');
|
|
246
|
+
result.failure[0].should.have.property('receiverAddress', 'TRecv2');
|
|
247
|
+
});
|
|
248
|
+
it('should combine build failures and send failures in the failure array', async function () {
|
|
249
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
250
|
+
prebuilds: [{ txHex: 'aaa' }],
|
|
251
|
+
buildFailures: [{ message: 'build error', receiverAddress: 'TRecv2' }],
|
|
252
|
+
});
|
|
253
|
+
sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').rejects(new Error('send failed'));
|
|
254
|
+
const result = await wallet.sendResourceDelegations({ delegations });
|
|
255
|
+
result.success.should.have.length(0);
|
|
256
|
+
result.failure.should.have.length(2);
|
|
257
|
+
assert.ok(result.failure.find((f) => f.receiverAddress === 'TRecv2' && f.message === 'build error'));
|
|
258
|
+
assert.ok(result.failure.find((f) => f.receiverAddress === 'TRecv1' && f.message === 'send failed'));
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// sendResourceUndelegation (single)
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
describe('sendResourceUndelegation', function () {
|
|
265
|
+
it('should throw if coin does not support resource delegation', async function () {
|
|
266
|
+
mockBaseCoin.supportsResourceDelegation.returns(false);
|
|
267
|
+
await wallet.sendResourceUndelegation({ prebuildTx: { txHex: 'aaa' } }).should.be.rejectedWith('Tron does not support resource delegation.');
|
|
268
|
+
});
|
|
269
|
+
it('should call sendManyTxRequests for a TSS wallet', async function () {
|
|
270
|
+
mockWalletData.multisigType = 'tss';
|
|
271
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
272
|
+
const sendManyStub = sinon_1.default.stub(wallet, 'sendManyTxRequests').resolves({ txid: 'tss-undel-1' });
|
|
273
|
+
const result = await wallet.sendResourceUndelegation({ prebuildTx: { txRequestId: 'req-2' } });
|
|
274
|
+
result.should.deepEqual({ txid: 'tss-undel-1' });
|
|
275
|
+
sendManyStub.should.be.calledOnce();
|
|
276
|
+
});
|
|
277
|
+
it('should call prebuildAndSignTransaction + submitTransaction for a hot wallet', async function () {
|
|
278
|
+
const signedPrebuild = { txHex: 'signed-ccc', wallet };
|
|
279
|
+
sinon_1.default.stub(wallet, 'prebuildAndSignTransaction').resolves(signedPrebuild);
|
|
280
|
+
const submitStub = sinon_1.default.stub(wallet, 'submitTransaction').resolves({ txid: 'hot-undel-1' });
|
|
281
|
+
const result = await wallet.sendResourceUndelegation({ prebuildTx: { txHex: 'ccc' } });
|
|
282
|
+
result.should.deepEqual({ txid: 'hot-undel-1' });
|
|
283
|
+
submitStub.should.be.calledOnce();
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
// ---------------------------------------------------------------------------
|
|
287
|
+
// sendResourceUndelegations (bulk)
|
|
288
|
+
// ---------------------------------------------------------------------------
|
|
289
|
+
describe('sendResourceUndelegations', function () {
|
|
290
|
+
beforeEach(function () {
|
|
291
|
+
sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves();
|
|
292
|
+
});
|
|
293
|
+
it('should return all successes for undelegations', async function () {
|
|
294
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
295
|
+
prebuilds: [{ txHex: 'ccc' }],
|
|
296
|
+
buildFailures: [],
|
|
297
|
+
});
|
|
298
|
+
sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').resolves({ txid: 'undel-tx-1' });
|
|
299
|
+
const result = await wallet.sendResourceUndelegations({ undelegations });
|
|
300
|
+
result.success.should.have.length(1);
|
|
301
|
+
result.failure.should.have.length(0);
|
|
302
|
+
});
|
|
303
|
+
it('should capture send failures with correct receiverAddress for undelegations', async function () {
|
|
304
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
305
|
+
prebuilds: [{ txHex: 'ccc' }],
|
|
306
|
+
buildFailures: [],
|
|
307
|
+
});
|
|
308
|
+
sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').rejects(new Error('undel send failed'));
|
|
309
|
+
const result = await wallet.sendResourceUndelegations({ undelegations });
|
|
310
|
+
result.failure.should.have.length(1);
|
|
311
|
+
result.failure[0].message.should.equal('undel send failed');
|
|
312
|
+
result.failure[0].should.have.property('receiverAddress', 'TRecv1');
|
|
313
|
+
});
|
|
314
|
+
it('should propagate undelegation build failures into the failure array', async function () {
|
|
315
|
+
sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
|
|
316
|
+
prebuilds: [],
|
|
317
|
+
buildFailures: [{ message: 'lock period active', receiverAddress: 'TRecv1' }],
|
|
318
|
+
});
|
|
319
|
+
const result = await wallet.sendResourceUndelegations({ undelegations });
|
|
320
|
+
result.success.should.have.length(0);
|
|
321
|
+
result.failure.should.have.length(1);
|
|
322
|
+
result.failure[0].should.deepEqual({ message: 'lock period active', receiverAddress: 'TRecv1' });
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VNYW5hZ2VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9yZXNvdXJjZU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQix3QkFBc0I7QUFDdEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDakUsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtLQUNyRSxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUUxRixTQUFTLFFBQVEsQ0FBQyxRQUFhO1FBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlELFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFD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QU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgJ3Nob3VsZC1zaW5vbic7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gcmVzb3VyY2UgbWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tXYWxsZXREYXRhOiBhbnk7XG5cbiAgY29uc3QgZGVsZWdhdGlvbnMgPSBbXG4gICAgeyByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnLCBhbW91bnQ6ICcxMDAwJywgcmVzb3VyY2U6ICdFTkVSR1knIH0sXG4gICAgeyByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInLCBhbW91bnQ6ICcyMDAwJywgcmVzb3VyY2U6ICdCQU5EV0lEVEgnIH0sXG4gIF07XG5cbiAgY29uc3QgdW5kZWxlZ2F0aW9ucyA9IFt7IHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScsIGFtb3VudDogJzEwMDAnLCByZXNvdXJjZTogJ0VORVJHWScgfV07XG5cbiAgZnVuY3Rpb24gc3R1YlBvc3QocmVzcG9uc2U6IGFueSkge1xuICAgIGNvbnN0IHJlc3VsdFN0dWIgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzcG9uc2UpO1xuICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHJlc3VsdFN0dWIgfSk7XG4gICAgbW9ja0JpdEdvLnBvc3QucmV0dXJucyh7IHNlbmQ6IHNlbmRTdHViIH0pO1xuICAgIHJldHVybiB7IHNlbmRTdHViIH07XG4gIH1cblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBgL3R0cngke3BhdGh9YCksXG4gICAgICBzdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbjogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICAgIGdldEZ1bGxOYW1lOiBzaW5vbi5zdHViKCkucmV0dXJucygnVHJvbicpLFxuICAgICAgcG9zdFByb2Nlc3NQcmVidWlsZDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocHJlYnVpbGQ6IGFueSkgPT4gUHJvbWlzZS5yZXNvbHZlKHByZWJ1aWxkKSksXG4gICAgfTtcblxuICAgIG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZTogJ2hvdCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBidWlsZFJlc291cmNlRGVsZWdhdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGRlc2NyaWJlKCdidWlsZFJlc291cmNlRGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSkgYXMgYW55KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnVHJvbiBkb2VzIG5vdCBzdXBwb3J0IHJlc291cmNlIGRlbGVnYXRpb24uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZGVsZWdhdGlvbnMgYXJyYXkgaXMgZW1wdHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCAod2FsbGV0LmJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zOiBbXSB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdkZWxlZ2F0aW9ucyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5LidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIFBPU1QgdG8gL2RlbGVnYXRlUmVzb3VyY2VzL2J1aWxkIGFuZCByZXR1cm4gcHJlYnVpbGRzIHdpdGggd2FsbGV0SWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7IHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH0sIHsgdHhIZXg6ICdiYmInIH1dLCBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5wcmVidWlsZHMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgICAgcmVzdWx0LnByZWJ1aWxkc1swXS53YWxsZXRJZC5zaG91bGQuZXF1YWwoJ3Rlc3Qtd2FsbGV0LWlkJyk7XG4gICAgICByZXN1bHQucHJlYnVpbGRzWzFdLndhbGxldElkLnNob3VsZC5lcXVhbCgndGVzdC13YWxsZXQtaWQnKTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRPbmNlKG1vY2tCaXRHby5wb3N0KTtcbiAgICAgIChtb2NrQml0R28ucG9zdC5maXJzdENhbGwuYXJnc1swXSBhcyBzdHJpbmcpLnNob3VsZC5jb250YWluRXFsKCcvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGJ1aWxkRmFpbHVyZXMgd2hlbiBBUEkgcmV0dXJucyBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH1dLFxuICAgICAgICBlcnJvcnM6IFt7IGVycm9yOiAnaW5zdWZmaWNpZW50IGJhbGFuY2UnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5idWlsZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnByZWJ1aWxkcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlc1swXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2luc3VmZmljaWVudCBiYWxhbmNlJywgcmVjZWl2ZXJBZGRyZXNzOiAnVFJlY3YyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgQVBJIHJlc3BvbnNlIGlzIG1pc3NpbmcgdHJhbnNhY3Rpb25zIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YlBvc3QoeyBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCAod2FsbGV0LmJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSAvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQ6IG1pc3NpbmcgdHJhbnNhY3Rpb25zIGFycmF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBzZW5kIHdoaXRlbGlzdGVkIHBhcmFtcyAoZGVsZWdhdGlvbnMsIGFwaVZlcnNpb24pIHRvIHRoZSBBUEknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHNlbmRTdHViIH0gPSBzdHViUG9zdCh7IHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH1dLCBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMsIHdhbGxldFBhc3NwaHJhc2U6ICdzZWNyZXQnIH0pO1xuXG4gICAgICBjb25zdCBib2R5QXJnID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBib2R5QXJnLnNob3VsZC5oYXZlLnByb3BlcnR5KCdkZWxlZ2F0aW9ucycpO1xuICAgICAgYm9keUFyZy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3dhbGxldFBhc3NwaHJhc2UnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIGJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnYnVpbGRSZXNvdXJjZVVuZGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB1bmRlbGVnYXRpb25zIGFycmF5IGlzIGVtcHR5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKHdhbGxldC5idWlsZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnM6IFtdIH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ3VuZGVsZWdhdGlvbnMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIC91bmRlbGVnYXRlUmVzb3VyY2VzL2J1aWxkIGFuZCByZXR1cm4gcHJlYnVpbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YlBvc3QoeyB0cmFuc2FjdGlvbnM6IFt7IHR4SGV4OiAnY2NjJyB9XSwgZXJyb3JzOiBbXSB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zKHsgdW5kZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnByZWJ1aWxkcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShtb2NrQml0R28ucG9zdCk7XG4gICAgICAobW9ja0JpdEdvLnBvc3QuZmlyc3RDYWxsLmFyZ3NbMF0gYXMgc3RyaW5nKS5zaG91bGQuY29udGFpbkVxbCgnL3VuZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGJ1aWxkRmFpbHVyZXMgd2hlbiBBUEkgcmV0dXJucyBlcnJvcnMgZm9yIHVuZGVsZWdhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW10sXG4gICAgICAgIGVycm9yczogW3sgZXJyb3I6ICdsb2NrIHBlcmlvZCBhY3RpdmUnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5idWlsZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5wcmVidWlsZHMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7IG1lc3NhZ2U6ICdsb2NrIHBlcmlvZCBhY3RpdmUnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc2VuZFJlc291cmNlRGVsZWdhdGlvbiAoc2luZ2xlKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZURlbGVnYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbih7IHByZWJ1aWxkVHg6IHsgdHhIZXg6ICdhYWEnIH0gYXMgYW55IH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ1Ryb24gZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBkZWxlZ2F0aW9uLidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHByZWJ1aWxkVHggaXMgdW5kZWZpbmVkIGZvciBhIG5vbi1jdXN0b2RpYWwgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9uKHt9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIHByZWJ1aWxkIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uLidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc2VuZE1hbnlUeFJlcXVlc3RzIGZvciBhIFRTUyB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrV2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGUgPSAndHNzJztcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRNYW55VHhSZXF1ZXN0cycpLnJlc29sdmVzKHsgdHhpZDogJ3Rzcy10eC0xJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4UmVxdWVzdElkOiAncmVxLTEnIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICd0c3MtdHgtMScgfSk7XG4gICAgICBzZW5kTWFueVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiArIHN1Ym1pdFRyYW5zYWN0aW9uIGZvciBhIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IHsgdHhIZXg6ICdzaWduZWQtYWFhJywgd2FsbGV0IH07XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoc2lnbmVkUHJlYnVpbGQgYXMgYW55KTtcbiAgICAgIGNvbnN0IHN1Ym1pdFN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3N1Ym1pdFRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnaG90LXR4LTEnIH0gYXMgYW55KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJyB9IGFzIGFueSB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyB0eGlkOiAnaG90LXR4LTEnIH0pO1xuICAgICAgc3VibWl0U3R1Yi5zaG91bGQuYmUuY2FsbGVkT25jZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIGluaXRpYXRlVHJhbnNhY3Rpb24gZm9yIGEgY3VzdG9kaWFsIG5vbi1UU1Mgd2FsbGV0IHdpdGggc3Rha2luZ1BhcmFtcyBhbmQgcmVjaXBpZW50cyBwcm9tb3RlZCBmcm9tIHByZWJ1aWxkVHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrV2FsbGV0RGF0YS50eXBlID0gJ2N1c3RvZGlhbCc7XG4gICAgICBtb2NrV2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGUgPSAnbXVsdGlzaWcnO1xuICAgICAgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG1vY2tCYXNlQ29pbiwgbW9ja1dhbGxldERhdGEpO1xuICAgICAgY29uc3QgaW5pdGlhdGVTdHViID0gc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnaW5pdGlhdGVUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ2N1c3RvZGlhbC10eC0xJyB9KTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1BhcmFtcyA9IHtcbiAgICAgICAgYWN0aW9uVHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnLFxuICAgICAgICBvd25lcl9hZGRyZXNzOiAnVE93bmVyJyxcbiAgICAgICAgcmVjZWl2ZXJfYWRkcmVzczogJ1RSZWNlaXZlcicsXG4gICAgICAgIHJlY2VpdmVyQWRkcmVzczogJ1RSZWNlaXZlcicsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAnLFxuICAgICAgICByZXNvdXJjZTogJ0VORVJHWScsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6ICdUUmVjZWl2ZXInLCBhbW91bnQ6ICcwJyB9XTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oe1xuICAgICAgICBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJywgc3Rha2luZ1BhcmFtcywgcmVjaXBpZW50cyB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICdjdXN0b2RpYWwtdHgtMScgfSk7XG4gICAgICBpbml0aWF0ZVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICAgIGNvbnN0IGNhbGxlZFdpdGggPSBpbml0aWF0ZVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjYWxsZWRXaXRoLnNob3VsZC5jb250YWluRXFsKHsgdHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnLCBzdGFraW5nUGFyYW1zLCByZWNpcGllbnRzIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc2VuZFJlc291cmNlRGVsZWdhdGlvbnMgKGJ1bGspXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnc2VuZFJlc291cmNlRGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2UnKS5yZXNvbHZlcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdUcm9uIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgYnVpbGQgZmFpbHVyZXMgd2l0aCByZWNlaXZlckFkZHJlc3MgaW50byB0aGUgZmFpbHVyZSBhcnJheScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFtdLFxuICAgICAgICBidWlsZEZhaWx1cmVzOiBbeyBtZXNzYWdlOiAnYnVpbGQgZXJyb3InLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2J1aWxkIGVycm9yJywgcmVjZWl2ZXJBZGRyZXNzOiAnVFJlY3YyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBzdWNjZXNzZXMgd2hlbiBubyBmYWlsdXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnYWFhJyB9LCB7IHR4SGV4OiAnYmJiJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ3R4LW9rJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJlc3VsdC5mYWlsdXJlLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FwdHVyZSBzZW5kIGZhaWx1cmVzIHdpdGggdGhlIGNvcnJlY3QgcmVjZWl2ZXJBZGRyZXNzIGZyb20gaW5wdXQgZW50cmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnYWFhJyB9LCB7IHR4SGV4OiAnYmJiJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnc2VuZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9uJyk7XG4gICAgICBzZW5kU3R1Yi5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHsgdHhpZDogJ3R4LTEnIH0pO1xuICAgICAgc2VuZFN0dWIub25TZWNvbmRDYWxsKCkucmVqZWN0cyhuZXcgRXJyb3IoJ3NlbmQgZmFpbGVkJykpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnN1Y2Nlc3Muc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmUuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmVbMF0ubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3NlbmQgZmFpbGVkJyk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVjZWl2ZXJBZGRyZXNzJywgJ1RSZWN2MicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb21iaW5lIGJ1aWxkIGZhaWx1cmVzIGFuZCBzZW5kIGZhaWx1cmVzIGluIHRoZSBmYWlsdXJlIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnYnVpbGRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnMnKS5yZXNvbHZlcyh7XG4gICAgICAgIHByZWJ1aWxkczogW3sgdHhIZXg6ICdhYWEnIH1dLFxuICAgICAgICBidWlsZEZhaWx1cmVzOiBbeyBtZXNzYWdlOiAnYnVpbGQgZXJyb3InLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24nKS5yZWplY3RzKG5ldyBFcnJvcignc2VuZCBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgICBhc3NlcnQub2socmVzdWx0LmZhaWx1cmUuZmluZCgoZikgPT4gZi5yZWNlaXZlckFkZHJlc3MgPT09ICdUUmVjdjInICYmIGYubWVzc2FnZSA9PT0gJ2J1aWxkIGVycm9yJykpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5mYWlsdXJlLmZpbmQoKGYpID0+IGYucmVjZWl2ZXJBZGRyZXNzID09PSAnVFJlY3YxJyAmJiBmLm1lc3NhZ2UgPT09ICdzZW5kIGZhaWxlZCcpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbiAoc2luZ2xlKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGNvaW4gZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBkZWxlZ2F0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLnN1cHBvcnRzUmVzb3VyY2VEZWxlZ2F0aW9uLnJldHVybnMoZmFsc2UpO1xuICAgICAgYXdhaXQgKHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJyB9IGFzIGFueSB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdUcm9uIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55VHhSZXF1ZXN0cyBmb3IgYSBUU1Mgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja1dhbGxldERhdGEubXVsdGlzaWdUeXBlID0gJ3Rzcyc7XG4gICAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luLCBtb2NrV2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kTWFueVR4UmVxdWVzdHMnKS5yZXNvbHZlcyh7IHR4aWQ6ICd0c3MtdW5kZWwtMScgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4UmVxdWVzdElkOiAncmVxLTInIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICd0c3MtdW5kZWwtMScgfSk7XG4gICAgICBzZW5kTWFueVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiArIHN1Ym1pdFRyYW5zYWN0aW9uIGZvciBhIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IHsgdHhIZXg6ICdzaWduZWQtY2NjJywgd2FsbGV0IH07XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoc2lnbmVkUHJlYnVpbGQgYXMgYW55KTtcbiAgICAgIGNvbnN0IHN1Ym1pdFN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3N1Ym1pdFRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnaG90LXVuZGVsLTEnIH0gYXMgYW55KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbih7IHByZWJ1aWxkVHg6IHsgdHhIZXg6ICdjY2MnIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICdob3QtdW5kZWwtMScgfSk7XG4gICAgICBzdWJtaXRTdHViLnNob3VsZC5iZS5jYWxsZWRPbmNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBzZW5kUmVzb3VyY2VVbmRlbGVnYXRpb25zIChidWxrKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2UnKS5yZXNvbHZlcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYWxsIHN1Y2Nlc3NlcyBmb3IgdW5kZWxlZ2F0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnY2NjJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ3VuZGVsLXR4LTEnIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIHJlc3VsdC5mYWlsdXJlLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FwdHVyZSBzZW5kIGZhaWx1cmVzIHdpdGggY29ycmVjdCByZWNlaXZlckFkZHJlc3MgZm9yIHVuZGVsZWdhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdidWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucycpLnJlc29sdmVzKHtcbiAgICAgICAgcHJlYnVpbGRzOiBbeyB0eEhleDogJ2NjYycgfV0sXG4gICAgICAgIGJ1aWxkRmFpbHVyZXM6IFtdLFxuICAgICAgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24nKS5yZWplY3RzKG5ldyBFcnJvcigndW5kZWwgc2VuZCBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb25zKHsgdW5kZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LmZhaWx1cmUuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmVbMF0ubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3VuZGVsIHNlbmQgZmFpbGVkJyk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVjZWl2ZXJBZGRyZXNzJywgJ1RSZWN2MScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgdW5kZWxlZ2F0aW9uIGJ1aWxkIGZhaWx1cmVzIGludG8gdGhlIGZhaWx1cmUgYXJyYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdidWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucycpLnJlc29sdmVzKHtcbiAgICAgICAgcHJlYnVpbGRzOiBbXSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW3sgbWVzc2FnZTogJ2xvY2sgcGVyaW9kIGFjdGl2ZScsIHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScgfV0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMoeyB1bmRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2xvY2sgcGVyaW9kIGFjdGl2ZScsIHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|