@bitgo/sdk-core 37.0.0 → 37.1.0
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/account-lib/baseCoin/enum.d.ts +20 -17
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +24 -18
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +10 -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/environments.d.ts +1 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +9 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts +19 -2
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +65 -7
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +1 -0
- 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/tradingAccount.d.ts +1 -0
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +7 -5
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/addressVerification.js +10 -3
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +31 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +60 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +4 -4
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +18 -11
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +0 -17
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +59 -70
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +44 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +7 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +67 -2
- package/dist/src/coins/ofc.d.ts +15 -1
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +8 -1
- package/dist/src/coins/ofcToken.d.ts +14 -4
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +17 -4
- package/dist/test/unit/bitgo/trading/tradingAccount.js +29 -20
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +119 -1
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +305 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +354 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +204 -1
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +160 -37
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +116 -1
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +45 -1
- package/dist/test/unit/coins/ofc.d.ts +2 -0
- package/dist/test/unit/coins/ofc.d.ts.map +1 -0
- package/dist/test/unit/coins/ofc.js +124 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -9,54 +9,177 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
const sinon_1 = __importDefault(require("sinon"));
|
|
10
10
|
require("should");
|
|
11
11
|
const src_1 = require("../../../../src");
|
|
12
|
-
|
|
12
|
+
const coins_1 = require("../../../../src/coins");
|
|
13
|
+
const TEST_TOKEN_CONFIG = {
|
|
14
|
+
coin: 'ofcusdt',
|
|
15
|
+
decimalPlaces: 6,
|
|
16
|
+
name: 'OFCUSDT',
|
|
17
|
+
type: 'ofcusdt',
|
|
18
|
+
backingCoin: 'usdt',
|
|
19
|
+
isFiat: false,
|
|
20
|
+
};
|
|
21
|
+
describe('Wallet - OFC', function () {
|
|
13
22
|
let wallet;
|
|
14
23
|
let mockBitGo;
|
|
15
|
-
let
|
|
16
|
-
let
|
|
24
|
+
let ofcToken;
|
|
25
|
+
let signMessageStub;
|
|
26
|
+
const signatureBytes = Buffer.from('aabbccdd', 'hex');
|
|
27
|
+
const payload = '{"amount":"100","from":"alice","to":"bob"}';
|
|
28
|
+
const prv = 'test-prv';
|
|
29
|
+
// bg-<32 hex chars> is valid for OfcToken without needing to resolve the backing coin
|
|
30
|
+
const recipients = [{ address: 'bg-aabbccddeeff00112233445566778899', amount: '100' }];
|
|
31
|
+
const userPub = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC51xERxh8vDMjc3PiGpQ3VeQcHBiGxbsrRXbCKQZZxBtDMrmBRzxRMkBJGsC9bsYb5tggVF3jGfEE';
|
|
32
|
+
const walletData = {
|
|
33
|
+
id: 'test-wallet-id',
|
|
34
|
+
coin: 'ofcusdt',
|
|
35
|
+
keys: ['user-key', 'backup-key', 'bitgo-key'],
|
|
36
|
+
type: 'trading',
|
|
37
|
+
multisigType: 'onchain',
|
|
38
|
+
enterprise: 'ent-id',
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Creates a fluent request mock that handles .query().send().result() and .send().result()
|
|
42
|
+
* chains, resolving with the provided value.
|
|
43
|
+
*/
|
|
44
|
+
function makeRequestChain(resolved) {
|
|
45
|
+
const chain = {};
|
|
46
|
+
chain.query = sinon_1.default.stub().returns(chain);
|
|
47
|
+
chain.send = sinon_1.default.stub().returns(chain);
|
|
48
|
+
chain.result = sinon_1.default.stub().resolves(resolved);
|
|
49
|
+
return chain;
|
|
50
|
+
}
|
|
17
51
|
beforeEach(function () {
|
|
52
|
+
signMessageStub = sinon_1.default.stub(src_1.BaseCoin.prototype, 'signMessage');
|
|
53
|
+
signMessageStub.withArgs({ prv }, payload).resolves(signatureBytes);
|
|
54
|
+
sinon_1.default.stub(src_1.BaseCoin.prototype, 'keychains').returns({
|
|
55
|
+
getKeysForSigning: sinon_1.default.stub().resolves([{ id: walletData.keys[0], pub: userPub }]),
|
|
56
|
+
});
|
|
18
57
|
mockBitGo = {
|
|
19
|
-
url: sinon_1.default.stub().returns('https://test.bitgo.com'),
|
|
58
|
+
url: sinon_1.default.stub().returns('https://test.bitgo.com/'),
|
|
20
59
|
post: sinon_1.default.stub(),
|
|
21
|
-
get: sinon_1.default.stub(),
|
|
22
60
|
setRequestTracer: sinon_1.default.stub(),
|
|
23
61
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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);
|
|
62
|
+
ofcToken = new coins_1.OfcToken(mockBitGo, TEST_TOKEN_CONFIG);
|
|
63
|
+
mockBitGo.coin = sinon_1.default.stub().returns(ofcToken);
|
|
64
|
+
wallet = new src_1.Wallet(mockBitGo, ofcToken, walletData);
|
|
42
65
|
});
|
|
43
66
|
afterEach(function () {
|
|
44
67
|
sinon_1.default.restore();
|
|
45
68
|
});
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
69
|
+
describe('with userKeySigningRequired: true (local signing via user key)', function () {
|
|
70
|
+
const buildUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/build');
|
|
71
|
+
const signUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/sign');
|
|
72
|
+
const sendUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/send');
|
|
73
|
+
describe('signTransaction', function () {
|
|
74
|
+
it('should call baseCoin.signMessage with the prv and payload', async function () {
|
|
75
|
+
const result = await wallet.signTransaction({ txPrebuild: { payload }, prv });
|
|
76
|
+
signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
|
|
77
|
+
mockBitGo.post.called.should.be.false();
|
|
78
|
+
result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
|
|
79
|
+
});
|
|
80
|
+
describe('with walletPassphrase and keychain', function () {
|
|
81
|
+
const walletPassphrase = 'test-passphrase';
|
|
82
|
+
const encryptedPrv = 'encrypted-prv-blob';
|
|
83
|
+
beforeEach(function () {
|
|
84
|
+
// compiled wallet.js: getUserPrv (sync) → decryptKeychainPrivateKey → bitgo.decrypt
|
|
85
|
+
// TypeScript source: getUserPrvAsync → decryptKeychainPrivateKeyAsync → bitgo.decryptAsync
|
|
86
|
+
mockBitGo.decrypt = sinon_1.default.stub().returns(prv);
|
|
87
|
+
mockBitGo.decryptAsync = sinon_1.default.stub().resolves(prv);
|
|
88
|
+
});
|
|
89
|
+
it('should decrypt the keychain with the passphrase and sign via baseCoin.signMessage', async function () {
|
|
90
|
+
const result = await wallet.signTransaction({
|
|
91
|
+
txPrebuild: { payload },
|
|
92
|
+
walletPassphrase,
|
|
93
|
+
keychain: { pub: userPub, encryptedPrv },
|
|
94
|
+
});
|
|
95
|
+
const decryptCalled = mockBitGo.decrypt.calledWith({ input: encryptedPrv, password: walletPassphrase }) ||
|
|
96
|
+
mockBitGo.decryptAsync.calledWith({ input: encryptedPrv, password: walletPassphrase });
|
|
97
|
+
decryptCalled.should.be.true();
|
|
98
|
+
signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
|
|
99
|
+
mockBitGo.post.called.should.be.false();
|
|
100
|
+
result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('prebuildAndSignTransaction', function () {
|
|
105
|
+
beforeEach(function () {
|
|
106
|
+
mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
|
|
107
|
+
});
|
|
108
|
+
it('should call the prebuild API then sign locally with the prv', async function () {
|
|
109
|
+
const result = await wallet.prebuildAndSignTransaction({ prv });
|
|
110
|
+
mockBitGo.post.calledWith(buildUrl()).should.be.true();
|
|
111
|
+
mockBitGo.post.calledWith(signUrl()).should.be.false();
|
|
112
|
+
signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
|
|
113
|
+
result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('sendMany', function () {
|
|
117
|
+
beforeEach(function () {
|
|
118
|
+
mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
|
|
119
|
+
mockBitGo.post.withArgs(sendUrl()).returns(makeRequestChain({ txid: 'test-txid', status: 'signed' }));
|
|
120
|
+
});
|
|
121
|
+
it('should prebuild, sign locally, and submit to the send endpoint', async function () {
|
|
122
|
+
const result = await wallet.sendMany({ recipients, prv });
|
|
123
|
+
mockBitGo.post.calledWith(buildUrl()).should.be.true();
|
|
124
|
+
signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
|
|
125
|
+
mockBitGo.post.calledWith(sendUrl()).should.be.true();
|
|
126
|
+
result.should.deepEqual({ txid: 'test-txid', status: 'signed' });
|
|
127
|
+
});
|
|
128
|
+
});
|
|
54
129
|
});
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
130
|
+
describe('with userKeySigningRequired: false (remote signing via BitGo key)', function () {
|
|
131
|
+
const signUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/sign');
|
|
132
|
+
const buildUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/build');
|
|
133
|
+
const sendUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/send');
|
|
134
|
+
const hexSignature = 'deadbeef';
|
|
135
|
+
let remoteWallet;
|
|
136
|
+
beforeEach(function () {
|
|
137
|
+
remoteWallet = new src_1.Wallet(mockBitGo, ofcToken, { ...walletData, userKeySigningRequired: false });
|
|
138
|
+
// compiled wallet.js calls getUserPrv (sync) for all coins; stub to return undefined
|
|
139
|
+
// so the remote signing path reaches baseCoin.signTransaction with prv: undefined
|
|
140
|
+
remoteWallet.getUserPrv = sinon_1.default.stub().returns(undefined);
|
|
141
|
+
mockBitGo.post.withArgs(signUrl()).returns(makeRequestChain({ signature: hexSignature }));
|
|
142
|
+
});
|
|
143
|
+
it('should sign locally when userKeySigningRequired is true and prv is provided', async function () {
|
|
144
|
+
const strictWallet = new src_1.Wallet(mockBitGo, ofcToken, { ...walletData, userKeySigningRequired: true });
|
|
145
|
+
const result = await strictWallet.signTransaction({ txPrebuild: { payload }, prv });
|
|
146
|
+
signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
|
|
147
|
+
mockBitGo.post.calledWith(signUrl()).should.be.false();
|
|
148
|
+
result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
|
|
149
|
+
});
|
|
150
|
+
describe('signTransaction', function () {
|
|
151
|
+
it('should POST to the sign endpoint and return the halfSigned result', async function () {
|
|
152
|
+
const result = await remoteWallet.signTransaction({ txPrebuild: { payload } });
|
|
153
|
+
mockBitGo.post.calledWith(signUrl()).should.be.true();
|
|
154
|
+
signMessageStub.called.should.be.false();
|
|
155
|
+
result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('prebuildAndSignTransaction', function () {
|
|
159
|
+
beforeEach(function () {
|
|
160
|
+
mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
|
|
161
|
+
});
|
|
162
|
+
it('should prebuild and remotely sign the transaction', async function () {
|
|
163
|
+
const result = await remoteWallet.prebuildAndSignTransaction({});
|
|
164
|
+
mockBitGo.post.calledWith(buildUrl()).should.be.true();
|
|
165
|
+
mockBitGo.post.calledWith(signUrl()).should.be.true();
|
|
166
|
+
signMessageStub.called.should.be.false();
|
|
167
|
+
result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('sendMany', function () {
|
|
171
|
+
beforeEach(function () {
|
|
172
|
+
mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
|
|
173
|
+
mockBitGo.post.withArgs(sendUrl()).returns(makeRequestChain({ txid: 'test-txid', status: 'signed' }));
|
|
174
|
+
});
|
|
175
|
+
it('should prebuild, remotely sign, and send the transaction', async function () {
|
|
176
|
+
const result = await remoteWallet.sendMany({ recipients });
|
|
177
|
+
mockBitGo.post.calledWith(buildUrl()).should.be.true();
|
|
178
|
+
mockBitGo.post.calledWith(signUrl()).should.be.true();
|
|
179
|
+
signMessageStub.called.should.be.false();
|
|
180
|
+
result.should.deepEqual({ txid: 'test-txid', status: 'signed' });
|
|
181
|
+
});
|
|
182
|
+
});
|
|
60
183
|
});
|
|
61
184
|
});
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDO1lBQ25ELElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztZQUMxRCxTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDN0Isa0JBQWtCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0MsZ0JBQWdCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGVBQWUsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztTQUNqRyxDQUFDO1FBRUYsY0FBYyxHQUFHO1lBQ2YsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1lBQzdDLFlBQVksRUFBRSxTQUFTO1lBQ3ZCLFVBQVUsRUFBRSxRQUFRO1NBQ3JCLENBQUM7UUFFRixNQUFNLEdBQUcsSUFBSSxZQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLGVBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEVBQVMsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFFdkIsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFbEQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxZQUFZLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSztRQUNoRSxNQUFNLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxFQUFTLENBQUM7UUFDdEUsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ1dhbGxldCAtIE9GQyBzaWduVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0RGF0YTogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20nKSxcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvZmMnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vd2FsbGV0JyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKSxcbiAgICAgIHByZXNpZ25UcmFuc2FjdGlvbjogc2lub24uc3R1YigpLnJlc29sdmVzQXJnKDApLFxuICAgICAga2V5SWRzRm9yU2lnbmluZzogc2lub24uc3R1YigpLnJldHVybnMoWzBdKSxcbiAgICAgIHNpZ25UcmFuc2FjdGlvbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkOiAndGVzdCcsIHNpZ25hdHVyZTogJ2FhYmJjYycgfSB9KSxcbiAgICB9O1xuXG4gICAgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgIGNvaW46ICdvZmN1c2R0JyxcbiAgICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcGFzcyBwcnYgYW5kIHBheWxhb2QgdG8gYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7IHR4SW5mbzogeyBwYXlsb2FkOiAne1wiYW1vdW50XCI6XCIxMDBcIn0nIH0gfSBhcyBhbnk7XG4gICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcblxuICAgIGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG5cbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZFdpdGgoeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmdldENhbGwoMCkuYXJnc1swXTtcbiAgICBjYWxsQXJncy5wcnYuc2hvdWxkLmVxdWFsKHBydik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByZXN1bHQgZnJvbSBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IHsgdHhJbmZvOiB7IHBheWxvYWQ6ICd7XCJhbW91bnRcIjpcIjEwMFwifScgfSB9IGFzIGFueTtcbiAgICBjb25zdCBwcnYgPSAndGVzdC1wcnYnO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHBydiB9KTtcblxuICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkOiAndGVzdCcsIHNpZ25hdHVyZTogJ2FhYmJjYycgfSB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQW1EO0FBQ25ELGlEQUFpRDtBQUVqRCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLElBQUksRUFBRSxTQUFTO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsSUFBSSxFQUFFLFNBQVM7SUFDZixJQUFJLEVBQUUsU0FBUztJQUNmLFdBQVcsRUFBRSxNQUFNO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0NBQ2QsQ0FBQztBQUVGLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDdkIsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLElBQUksZUFBZ0MsQ0FBQztJQUNyQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztJQUM3RCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUM7SUFDdkIsc0ZBQXNGO0lBQ3RGLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkYsTUFBTSxPQUFPLEdBQ1gsaUhBQWlILENBQUM7SUFFcEgsTUFBTSxVQUFVLEdBQUc7UUFDakIsRUFBRSxFQUFFLGdCQUFnQjtRQUNwQixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1FBQzdDLElBQUksRUFBRSxTQUFTO1FBQ2YsWUFBWSxFQUFFLFNBQVM7UUFDdkIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztJQUVGOzs7T0FHRztJQUNILFNBQVMsZ0JBQWdCLENBQUMsUUFBaUI7UUFDekMsTUFBTSxLQUFLLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxLQUFLLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsSUFBSSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsS0FBSyxDQUFDLE1BQU0sR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFVBQVUsQ0FBQztRQUNULGVBQWUsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLGNBQVEsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRSxlQUFLLENBQUMsSUFBSSxDQUFDLGNBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2xELGlCQUFpQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzlFLENBQUMsQ0FBQztRQUNWLFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO1lBQ3BELElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUNGLFFBQVEsR0FBRyxJQUFJLGdCQUFRLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsU0FBUyxDQUFDLElBQUksR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxJQUFJLFlBQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsZUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdFQUFnRSxFQUFFO1FBQ3pFLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDOUUsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUM1RSxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBRTVFLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSztnQkFDbkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFckYsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xFLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLENBQUMsQ0FBQyxDQUFDO1lBRUgsUUFBUSxDQUFDLG9DQUFvQyxFQUFFO2dCQUM3QyxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO2dCQUMzQyxNQUFNLFlBQVksR0FBRyxvQkFBb0IsQ0FBQztnQkFFMUMsVUFBVSxDQUFDO29CQUNULG9GQUFvRjtvQkFDcEYsbUdBQW1HO29CQUNuRyxTQUFTLENBQUMsT0FBTyxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLG1GQUFtRixFQUFFLEtBQUs7b0JBQzNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQzt3QkFDMUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFTO3dCQUM5QixnQkFBZ0I7d0JBQ2hCLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFTO3FCQUNoRCxDQUFDLENBQUM7b0JBRUgsTUFBTSxhQUFhLEdBQ2pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDakYsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7b0JBQ3pGLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMvQixlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbEUsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2xHLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtZQUNyQyxVQUFVLENBQUM7Z0JBQ1QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsNkRBQTZELEVBQUUsS0FBSztnQkFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUVoRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkQsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ25CLFVBQVUsQ0FBQztnQkFDVCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0UsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEcsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsS0FBSztnQkFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBRTFELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkQsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtRUFBbUUsRUFBRTtRQUM1RSxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDOUUsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUM1RSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUM7UUFDaEMsSUFBSSxZQUFvQixDQUFDO1FBRXpCLFVBQVUsQ0FBQztZQUNULFlBQVksR0FBRyxJQUFJLFlBQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxVQUFVLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNqRyxxRkFBcUY7WUFDckYsa0ZBQWtGO1lBQ2pGLFlBQW9CLENBQUMsVUFBVSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZFQUE2RSxFQUFFLEtBQUs7WUFDckYsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUUzRixlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEtBQUs7Z0JBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBUyxFQUFFLENBQUMsQ0FBQztnQkFFdEYsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0RCxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtZQUNyQyxVQUFVLENBQUM7Z0JBQ1QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSztnQkFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRWpFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkQsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0RCxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDbkIsVUFBVSxDQUFDO2dCQUNULFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RyxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLO2dCQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUUzRCxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEQsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0LCBCYXNlQ29pbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBPZmNUb2tlbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9jb2lucyc7XG5cbmNvbnN0IFRFU1RfVE9LRU5fQ09ORklHID0ge1xuICBjb2luOiAnb2ZjdXNkdCcsXG4gIGRlY2ltYWxQbGFjZXM6IDYsXG4gIG5hbWU6ICdPRkNVU0RUJyxcbiAgdHlwZTogJ29mY3VzZHQnLFxuICBiYWNraW5nQ29pbjogJ3VzZHQnLFxuICBpc0ZpYXQ6IGZhbHNlLFxufTtcblxuZGVzY3JpYmUoJ1dhbGxldCAtIE9GQycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBvZmNUb2tlbjogT2ZjVG9rZW47XG4gIGxldCBzaWduTWVzc2FnZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBCdWZmZXIuZnJvbSgnYWFiYmNjZGQnLCAnaGV4Jyk7XG4gIGNvbnN0IHBheWxvYWQgPSAne1wiYW1vdW50XCI6XCIxMDBcIixcImZyb21cIjpcImFsaWNlXCIsXCJ0b1wiOlwiYm9iXCJ9JztcbiAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcbiAgLy8gYmctPDMyIGhleCBjaGFycz4gaXMgdmFsaWQgZm9yIE9mY1Rva2VuIHdpdGhvdXQgbmVlZGluZyB0byByZXNvbHZlIHRoZSBiYWNraW5nIGNvaW5cbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6ICdiZy1hYWJiY2NkZGVlZmYwMDExMjIzMzQ0NTU2Njc3ODg5OScsIGFtb3VudDogJzEwMCcgfV07XG4gIGNvbnN0IHVzZXJQdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRnRYZ1M1c1lKQUJxcUc5WUxtQzUxeEVSeGg4dkRNamMzUGlHcFEzVmVRY0hCaUd4YnNyUlhiQ0tRWlp4QnRETXJtQlJ6eFJNa0JKR3NDOWJzWWI1dGdnVkYzakdmRUUnO1xuXG4gIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgY29pbjogJ29mY3VzZHQnLFxuICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICB0eXBlOiAndHJhZGluZycsXG4gICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmbHVlbnQgcmVxdWVzdCBtb2NrIHRoYXQgaGFuZGxlcyAucXVlcnkoKS5zZW5kKCkucmVzdWx0KCkgYW5kIC5zZW5kKCkucmVzdWx0KClcbiAgICogY2hhaW5zLCByZXNvbHZpbmcgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBtYWtlUmVxdWVzdENoYWluKHJlc29sdmVkOiB1bmtub3duKTogYW55IHtcbiAgICBjb25zdCBjaGFpbjogYW55ID0ge307XG4gICAgY2hhaW4ucXVlcnkgPSBzaW5vbi5zdHViKCkucmV0dXJucyhjaGFpbik7XG4gICAgY2hhaW4uc2VuZCA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGNoYWluKTtcbiAgICBjaGFpbi5yZXN1bHQgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzb2x2ZWQpO1xuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpZ25NZXNzYWdlU3R1YiA9IHNpbm9uLnN0dWIoQmFzZUNvaW4ucHJvdG90eXBlLCAnc2lnbk1lc3NhZ2UnKTtcbiAgICBzaWduTWVzc2FnZVN0dWIud2l0aEFyZ3MoeyBwcnYgfSwgcGF5bG9hZCkucmVzb2x2ZXMoc2lnbmF0dXJlQnl0ZXMpO1xuICAgIHNpbm9uLnN0dWIoQmFzZUNvaW4ucHJvdG90eXBlLCAna2V5Y2hhaW5zJykucmV0dXJucyh7XG4gICAgICBnZXRLZXlzRm9yU2lnbmluZzogc2lub24uc3R1YigpLnJlc29sdmVzKFt7IGlkOiB3YWxsZXREYXRhLmtleXNbMF0sIHB1YjogdXNlclB1YiB9XSksXG4gICAgfSBhcyBhbnkpO1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vJyksXG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcbiAgICBvZmNUb2tlbiA9IG5ldyBPZmNUb2tlbihtb2NrQml0R28sIFRFU1RfVE9LRU5fQ09ORklHKTtcbiAgICBtb2NrQml0R28uY29pbiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG9mY1Rva2VuKTtcbiAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgb2ZjVG9rZW4sIHdhbGxldERhdGEpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggdXNlcktleVNpZ25pbmdSZXF1aXJlZDogdHJ1ZSAobG9jYWwgc2lnbmluZyB2aWEgdXNlciBrZXkpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkVXJsID0gKCkgPT4gb2ZjVG9rZW4udXJsKCcvd2FsbGV0LycgKyB3YWxsZXREYXRhLmlkICsgJy90eC9idWlsZCcpO1xuICAgIGNvbnN0IHNpZ25VcmwgPSAoKSA9PiBvZmNUb2tlbi51cmwoJy93YWxsZXQvJyArIHdhbGxldERhdGEuaWQgKyAnL3R4L3NpZ24nKTtcbiAgICBjb25zdCBzZW5kVXJsID0gKCkgPT4gb2ZjVG9rZW4udXJsKCcvd2FsbGV0LycgKyB3YWxsZXREYXRhLmlkICsgJy90eC9zZW5kJyk7XG5cbiAgICBkZXNjcmliZSgnc2lnblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxsIGJhc2VDb2luLnNpZ25NZXNzYWdlIHdpdGggdGhlIHBydiBhbmQgcGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSwgcHJ2IH0pO1xuXG4gICAgICAgIHNpZ25NZXNzYWdlU3R1Yi5jYWxsZWRPbmNlV2l0aCh7IHBydiB9LCBwYXlsb2FkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aXRoIHdhbGxldFBhc3NwaHJhc2UgYW5kIGtleWNoYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3Rlc3QtcGFzc3BocmFzZSc7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9ICdlbmNyeXB0ZWQtcHJ2LWJsb2InO1xuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGNvbXBpbGVkIHdhbGxldC5qczogZ2V0VXNlclBydiAoc3luYykg4oaSIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkg4oaSIGJpdGdvLmRlY3J5cHRcbiAgICAgICAgICAvLyBUeXBlU2NyaXB0IHNvdXJjZTogIGdldFVzZXJQcnZBc3luYyAgICAgICAg4oaSIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyDihpIgYml0Z28uZGVjcnlwdEFzeW5jXG4gICAgICAgICAgbW9ja0JpdEdvLmRlY3J5cHQgPSBzaW5vbi5zdHViKCkucmV0dXJucyhwcnYpO1xuICAgICAgICAgIG1vY2tCaXRHby5kZWNyeXB0QXN5bmMgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocHJ2KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBkZWNyeXB0IHRoZSBrZXljaGFpbiB3aXRoIHRoZSBwYXNzcGhyYXNlIGFuZCBzaWduIHZpYSBiYXNlQ29pbi5zaWduTWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSxcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICBrZXljaGFpbjogeyBwdWI6IHVzZXJQdWIsIGVuY3J5cHRlZFBydiB9IGFzIGFueSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGRlY3J5cHRDYWxsZWQgPVxuICAgICAgICAgICAgbW9ja0JpdEdvLmRlY3J5cHQuY2FsbGVkV2l0aCh7IGlucHV0OiBlbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pIHx8XG4gICAgICAgICAgICBtb2NrQml0R28uZGVjcnlwdEFzeW5jLmNhbGxlZFdpdGgoeyBpbnB1dDogZW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgICAgICBkZWNyeXB0Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZE9uY2VXaXRoKHsgcHJ2IH0sIHBheWxvYWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LndpdGhBcmdzKGJ1aWxkVXJsKCkpLnJldHVybnMobWFrZVJlcXVlc3RDaGFpbih7IHBheWxvYWQgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlYnVpbGQgQVBJIHRoZW4gc2lnbiBsb2NhbGx5IHdpdGggdGhlIHBydicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHsgcHJ2IH0pO1xuXG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoYnVpbGRVcmwoKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChzaWduVXJsKCkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkT25jZVdpdGgoeyBwcnYgfSwgcGF5bG9hZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogc2lnbmF0dXJlQnl0ZXMudG9TdHJpbmcoJ2hleCcpIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZW5kTWFueScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28ucG9zdC53aXRoQXJncyhidWlsZFVybCgpKS5yZXR1cm5zKG1ha2VSZXF1ZXN0Q2hhaW4oeyBwYXlsb2FkIH0pKTtcbiAgICAgICAgbW9ja0JpdEdvLnBvc3Qud2l0aEFyZ3Moc2VuZFVybCgpKS5yZXR1cm5zKG1ha2VSZXF1ZXN0Q2hhaW4oeyB0eGlkOiAndGVzdC10eGlkJywgc3RhdHVzOiAnc2lnbmVkJyB9KSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwcmVidWlsZCwgc2lnbiBsb2NhbGx5LCBhbmQgc3VibWl0IHRvIHRoZSBzZW5kIGVuZHBvaW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZE1hbnkoeyByZWNpcGllbnRzLCBwcnYgfSk7XG5cbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChidWlsZFVybCgpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkT25jZVdpdGgoeyBwcnYgfSwgcGF5bG9hZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChzZW5kVXJsKCkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgdHhpZDogJ3Rlc3QtdHhpZCcsIHN0YXR1czogJ3NpZ25lZCcgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggdXNlcktleVNpZ25pbmdSZXF1aXJlZDogZmFsc2UgKHJlbW90ZSBzaWduaW5nIHZpYSBCaXRHbyBrZXkpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZ25VcmwgPSAoKSA9PiBvZmNUb2tlbi51cmwoJy93YWxsZXQvJyArIHdhbGxldERhdGEuaWQgKyAnL3R4L3NpZ24nKTtcbiAgICBjb25zdCBidWlsZFVybCA9ICgpID0+IG9mY1Rva2VuLnVybCgnL3dhbGxldC8nICsgd2FsbGV0RGF0YS5pZCArICcvdHgvYnVpbGQnKTtcbiAgICBjb25zdCBzZW5kVXJsID0gKCkgPT4gb2ZjVG9rZW4udXJsKCcvd2FsbGV0LycgKyB3YWxsZXREYXRhLmlkICsgJy90eC9zZW5kJyk7XG4gICAgY29uc3QgaGV4U2lnbmF0dXJlID0gJ2RlYWRiZWVmJztcbiAgICBsZXQgcmVtb3RlV2FsbGV0OiBXYWxsZXQ7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW90ZVdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBvZmNUb2tlbiwgeyAuLi53YWxsZXREYXRhLCB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICAgIC8vIGNvbXBpbGVkIHdhbGxldC5qcyBjYWxscyBnZXRVc2VyUHJ2IChzeW5jKSBmb3IgYWxsIGNvaW5zOyBzdHViIHRvIHJldHVybiB1bmRlZmluZWRcbiAgICAgIC8vIHNvIHRoZSByZW1vdGUgc2lnbmluZyBwYXRoIHJlYWNoZXMgYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uIHdpdGggcHJ2OiB1bmRlZmluZWRcbiAgICAgIChyZW1vdGVXYWxsZXQgYXMgYW55KS5nZXRVc2VyUHJ2ID0gc2lub24uc3R1YigpLnJldHVybnModW5kZWZpbmVkKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LndpdGhBcmdzKHNpZ25VcmwoKSkucmV0dXJucyhtYWtlUmVxdWVzdENoYWluKHsgc2lnbmF0dXJlOiBoZXhTaWduYXR1cmUgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGxvY2FsbHkgd2hlbiB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkIGlzIHRydWUgYW5kIHBydiBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0cmljdFdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBvZmNUb2tlbiwgeyAuLi53YWxsZXREYXRhLCB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyaWN0V2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSwgcHJ2IH0pO1xuXG4gICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkT25jZVdpdGgoeyBwcnYgfSwgcGF5bG9hZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoc2lnblVybCgpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NpZ25UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgUE9TVCB0byB0aGUgc2lnbiBlbmRwb2ludCBhbmQgcmV0dXJuIHRoZSBoYWxmU2lnbmVkIHJlc3VsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVtb3RlV2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSB9KTtcblxuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKHNpZ25VcmwoKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogaGV4U2lnbmF0dXJlIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28ucG9zdC53aXRoQXJncyhidWlsZFVybCgpKS5yZXR1cm5zKG1ha2VSZXF1ZXN0Q2hhaW4oeyBwYXlsb2FkIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHByZWJ1aWxkIGFuZCByZW1vdGVseSBzaWduIHRoZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVtb3RlV2FsbGV0LnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHt9KTtcblxuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKGJ1aWxkVXJsKCkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoc2lnblVybCgpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IGhhbGZTaWduZWQ6IHsgcGF5bG9hZCwgc2lnbmF0dXJlOiBoZXhTaWduYXR1cmUgfSB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NlbmRNYW55JywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LndpdGhBcmdzKGJ1aWxkVXJsKCkpLnJldHVybnMobWFrZVJlcXVlc3RDaGFpbih7IHBheWxvYWQgfSkpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC53aXRoQXJncyhzZW5kVXJsKCkpLnJldHVybnMobWFrZVJlcXVlc3RDaGFpbih7IHR4aWQ6ICd0ZXN0LXR4aWQnLCBzdGF0dXM6ICdzaWduZWQnIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHByZWJ1aWxkLCByZW1vdGVseSBzaWduLCBhbmQgc2VuZCB0aGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbW90ZVdhbGxldC5zZW5kTWFueSh7IHJlY2lwaWVudHMgfSk7XG5cbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChidWlsZFVybCgpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKHNpZ25VcmwoKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyB0eGlkOiAndGVzdC10eGlkJywgc3RhdHVzOiAnc2lnbmVkJyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|