@bitgo-beta/sdk-core 8.2.1-beta.1912 → 8.2.1-beta.1913
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/keychain/iKeychains.d.ts +10 -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.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +4 -1
- package/dist/src/bitgo/safe/iSafe.d.ts +5 -0
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafe.js +1 -1
- package/dist/src/bitgo/safe/iSafes.d.ts +34 -6
- package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafes.js +1 -1
- package/dist/src/bitgo/safe/safes.d.ts +52 -12
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safes.js +176 -11
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +3 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +15 -14
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +6 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -2
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +15 -14
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +6 -3
- package/dist/test/unit/bitgo/safe/safes.js +200 -23
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -39,44 +39,221 @@ const src_1 = require("../../../../src");
|
|
|
39
39
|
describe('Safes', function () {
|
|
40
40
|
let safes;
|
|
41
41
|
let mockBitGo;
|
|
42
|
+
const safeDataWire = {
|
|
43
|
+
id: 'test-safe-id',
|
|
44
|
+
enterpriseId: 'test-enterprise-id',
|
|
45
|
+
label: 'my safe',
|
|
46
|
+
status: 'active',
|
|
47
|
+
creator: 'creator-id',
|
|
48
|
+
users: [{ userId: 'creator-id', permissions: ['admin', 'spend'] }],
|
|
49
|
+
createdAt: '2026-07-07T00:00:00.000Z',
|
|
50
|
+
};
|
|
42
51
|
beforeEach(function () {
|
|
43
52
|
mockBitGo = {
|
|
44
53
|
url: sinon.stub().callsFake((path) => path),
|
|
54
|
+
post: sinon.stub(),
|
|
45
55
|
};
|
|
46
56
|
safes = new src_1.Safes(mockBitGo, 'test-enterprise-id');
|
|
47
57
|
});
|
|
48
58
|
afterEach(function () {
|
|
49
59
|
sinon.restore();
|
|
50
60
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
describe('initializeSafe', function () {
|
|
62
|
+
it('POSTs to the safes collection URL and returns a Safe', async function () {
|
|
63
|
+
const send = sinon.stub().returns({ result: sinon.stub().resolves(safeDataWire) });
|
|
64
|
+
mockBitGo.post.returns({ send });
|
|
65
|
+
const result = await safes.initializeSafe({ label: 'my safe' });
|
|
66
|
+
result.should.be.instanceof(src_1.Safe);
|
|
67
|
+
result.id().should.equal('test-safe-id');
|
|
68
|
+
result.enterpriseId().should.equal('test-enterprise-id');
|
|
69
|
+
sinon.assert.calledWith(mockBitGo.post, '/enterprise/test-enterprise-id/safes');
|
|
70
|
+
sinon.assert.calledWith(send, { label: 'my safe' });
|
|
60
71
|
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
});
|
|
73
|
+
describe('createSafeKeys', function () {
|
|
74
|
+
// Per-coin keychains() mock: multisig coins use create/add/createBackup/createBitGo; MPC coins
|
|
75
|
+
// use createMpc. Ids are derived from the coin name so we can assert per-slot coin routing.
|
|
76
|
+
function makeKeychains(coin) {
|
|
77
|
+
return {
|
|
78
|
+
create: sinon.stub().returns({ pub: `${coin}-pub`, prv: `${coin}-prv` }),
|
|
79
|
+
add: sinon.stub().resolves({ id: `${coin}-user` }),
|
|
80
|
+
createBackup: sinon.stub().resolves({ id: `${coin}-backup` }),
|
|
81
|
+
createBitGo: sinon.stub().resolves({ id: `${coin}-bitgo` }),
|
|
82
|
+
createMpc: sinon.stub().resolves({
|
|
83
|
+
userKeychain: { id: `${coin}-user` },
|
|
84
|
+
backupKeychain: { id: `${coin}-backup` },
|
|
85
|
+
bitgoKeychain: { id: `${coin}-bitgo` },
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
let keychainsByCoin;
|
|
90
|
+
beforeEach(function () {
|
|
91
|
+
keychainsByCoin = {};
|
|
92
|
+
mockBitGo.getEnv = sinon.stub().returns('test'); // testnet coin map
|
|
93
|
+
mockBitGo.encrypt = sinon.stub().resolves('encrypted-prv');
|
|
94
|
+
mockBitGo.coin = sinon.stub().callsFake((name) => {
|
|
95
|
+
keychainsByCoin[name] = keychainsByCoin[name] || makeKeychains(name);
|
|
96
|
+
return { keychains: () => keychainsByCoin[name] };
|
|
97
|
+
});
|
|
65
98
|
});
|
|
66
|
-
it('
|
|
67
|
-
await safes
|
|
68
|
-
|
|
99
|
+
it('runs the 4 root ceremonies and returns 12 ids as ordered triplets', async function () {
|
|
100
|
+
const result = await safes.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' });
|
|
101
|
+
result.should.deepEqual({
|
|
69
102
|
rootKeys: {
|
|
70
103
|
hot: {
|
|
71
|
-
secp256k1Multisig: ['
|
|
72
|
-
ecdsaMpc: ['
|
|
73
|
-
eddsaMpc: ['
|
|
74
|
-
ed25519Multisig: ['
|
|
104
|
+
secp256k1Multisig: ['tbtc-user', 'tbtc-backup', 'tbtc-bitgo'],
|
|
105
|
+
ecdsaMpc: ['hteth-user', 'hteth-backup', 'hteth-bitgo'],
|
|
106
|
+
eddsaMpc: ['tsol-user', 'tsol-backup', 'tsol-bitgo'],
|
|
107
|
+
ed25519Multisig: ['txlm-user', 'txlm-backup', 'txlm-bitgo'],
|
|
75
108
|
},
|
|
76
109
|
},
|
|
77
|
-
})
|
|
78
|
-
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
it('tags every multisig key registration with safeId and the correct source', async function () {
|
|
113
|
+
await safes.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' });
|
|
114
|
+
const btc = keychainsByCoin['tbtc'];
|
|
115
|
+
sinon.assert.calledWithMatch(btc.add, {
|
|
116
|
+
pub: 'tbtc-pub',
|
|
117
|
+
encryptedPrv: 'encrypted-prv',
|
|
118
|
+
source: 'user',
|
|
119
|
+
safeId: 'safe-1',
|
|
120
|
+
});
|
|
121
|
+
sinon.assert.calledWithMatch(btc.createBackup, { passphrase: 'pw', safeId: 'safe-1' });
|
|
122
|
+
sinon.assert.calledWithMatch(btc.createBitGo, { enterprise: 'test-enterprise-id', safeId: 'safe-1' });
|
|
123
|
+
});
|
|
124
|
+
it('threads safeId + enterprise into both MPC ceremonies', async function () {
|
|
125
|
+
await safes.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' });
|
|
126
|
+
sinon.assert.calledWithMatch(keychainsByCoin['hteth'].createMpc, {
|
|
127
|
+
multisigType: 'tss',
|
|
128
|
+
passphrase: 'pw',
|
|
129
|
+
enterprise: 'test-enterprise-id',
|
|
130
|
+
safeId: 'safe-1',
|
|
131
|
+
});
|
|
132
|
+
sinon.assert.calledWithMatch(keychainsByCoin['tsol'].createMpc, {
|
|
133
|
+
multisigType: 'tss',
|
|
134
|
+
passphrase: 'pw',
|
|
135
|
+
enterprise: 'test-enterprise-id',
|
|
136
|
+
safeId: 'safe-1',
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
it('selects mainnet coins in a prod environment', async function () {
|
|
140
|
+
mockBitGo.getEnv = sinon.stub().returns('prod');
|
|
141
|
+
await safes.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' });
|
|
142
|
+
sinon.assert.calledWith(mockBitGo.coin, 'btc');
|
|
143
|
+
sinon.assert.calledWith(mockBitGo.coin, 'eth');
|
|
144
|
+
sinon.assert.calledWith(mockBitGo.coin, 'sol');
|
|
145
|
+
sinon.assert.calledWith(mockBitGo.coin, 'xlm');
|
|
146
|
+
});
|
|
147
|
+
it('runs the 4 root ceremonies in parallel (none awaits another)', async function () {
|
|
148
|
+
// Gate exactly one call per root on a shared latch that only opens once all 4 roots have
|
|
149
|
+
// entered. If the roots ran sequentially, the first would await the latch forever → the
|
|
150
|
+
// test would time out; completing proves all 4 were in flight concurrently.
|
|
151
|
+
let release = () => undefined;
|
|
152
|
+
const gate = new Promise((resolve) => (release = resolve));
|
|
153
|
+
let started = 0;
|
|
154
|
+
const gated = (result) => sinon.stub().callsFake(async () => {
|
|
155
|
+
if (++started === 4) {
|
|
156
|
+
release();
|
|
157
|
+
}
|
|
158
|
+
await gate;
|
|
159
|
+
return result;
|
|
160
|
+
});
|
|
161
|
+
// one gated entry point per root: multisig roots via createBitGo, MPC roots via createMpc
|
|
162
|
+
keychainsByCoin['tbtc'] = makeKeychains('tbtc');
|
|
163
|
+
keychainsByCoin['tbtc'].createBitGo = gated({ id: 'tbtc-bitgo' });
|
|
164
|
+
keychainsByCoin['txlm'] = makeKeychains('txlm');
|
|
165
|
+
keychainsByCoin['txlm'].createBitGo = gated({ id: 'txlm-bitgo' });
|
|
166
|
+
keychainsByCoin['hteth'] = makeKeychains('hteth');
|
|
167
|
+
keychainsByCoin['hteth'].createMpc = gated({
|
|
168
|
+
userKeychain: { id: 'hteth-user' },
|
|
169
|
+
backupKeychain: { id: 'hteth-backup' },
|
|
170
|
+
bitgoKeychain: { id: 'hteth-bitgo' },
|
|
171
|
+
});
|
|
172
|
+
keychainsByCoin['tsol'] = makeKeychains('tsol');
|
|
173
|
+
keychainsByCoin['tsol'].createMpc = gated({
|
|
174
|
+
userKeychain: { id: 'tsol-user' },
|
|
175
|
+
backupKeychain: { id: 'tsol-backup' },
|
|
176
|
+
bitgoKeychain: { id: 'tsol-bitgo' },
|
|
177
|
+
});
|
|
178
|
+
await safes.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' });
|
|
179
|
+
started.should.equal(4);
|
|
180
|
+
});
|
|
181
|
+
it('archives the safe and throws listing every failed ceremony', async function () {
|
|
182
|
+
// Two ceremonies fail (an MPC and a multisig root).
|
|
183
|
+
keychainsByCoin['hteth'] = makeKeychains('hteth');
|
|
184
|
+
keychainsByCoin['hteth'].createMpc = sinon.stub().rejects(new Error('dkls boom'));
|
|
185
|
+
keychainsByCoin['txlm'] = makeKeychains('txlm');
|
|
186
|
+
keychainsByCoin['txlm'].createBitGo = sinon.stub().rejects(new Error('bitgo key boom'));
|
|
187
|
+
// archive succeeds, returning a valid (archived) SafeData
|
|
188
|
+
const send = sinon.stub().returns({
|
|
189
|
+
result: sinon.stub().resolves({ ...safeDataWire, status: 'archived' }),
|
|
190
|
+
});
|
|
191
|
+
mockBitGo.post.returns({ send });
|
|
192
|
+
const err = await safes
|
|
193
|
+
.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' })
|
|
194
|
+
.should.be.rejectedWith(/Safe key generation failed for 2 root/);
|
|
195
|
+
err.message.should.match(/ecdsaMpc: dkls boom/);
|
|
196
|
+
err.message.should.match(/ed25519Multisig: bitgo key boom/);
|
|
197
|
+
err.message.should.match(/has been archived/);
|
|
198
|
+
err.message.should.not.match(/archiving the safe also failed/);
|
|
199
|
+
sinon.assert.calledWith(mockBitGo.post, '/enterprise/test-enterprise-id/safes/safe-1/archive');
|
|
79
200
|
});
|
|
201
|
+
it('notes when archiving also fails', async function () {
|
|
202
|
+
keychainsByCoin['tsol'] = makeKeychains('tsol');
|
|
203
|
+
keychainsByCoin['tsol'].createMpc = sinon.stub().rejects(new Error('eddsa boom'));
|
|
204
|
+
mockBitGo.post.returns({
|
|
205
|
+
send: sinon.stub().returns({ result: sinon.stub().rejects(new Error('archive 500')) }),
|
|
206
|
+
});
|
|
207
|
+
await safes
|
|
208
|
+
.createSafeKeys({ label: 'my safe', passphrase: 'pw', safeId: 'safe-1' })
|
|
209
|
+
.should.be.rejectedWith(/archiving the safe also failed \(archive 500\).*archive it manually/);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('finalizeSafe', function () {
|
|
213
|
+
const rootKeys = {
|
|
214
|
+
hot: {
|
|
215
|
+
secp256k1Multisig: ['u1', 'b1', 'g1'],
|
|
216
|
+
ecdsaMpc: ['u2', 'b2', 'g2'],
|
|
217
|
+
eddsaMpc: ['u3', 'b3', 'g3'],
|
|
218
|
+
ed25519Multisig: ['u4', 'b4', 'g4'],
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
it('POSTs the rootKeys to the finalize URL and returns the active Safe', async function () {
|
|
222
|
+
const send = sinon.stub().returns({ result: sinon.stub().resolves(safeDataWire) });
|
|
223
|
+
mockBitGo.post.returns({ send });
|
|
224
|
+
const result = await safes.finalizeSafe('test-safe-id', { rootKeys });
|
|
225
|
+
result.should.be.instanceof(src_1.Safe);
|
|
226
|
+
result.status().should.equal('active');
|
|
227
|
+
sinon.assert.calledWith(mockBitGo.post, '/enterprise/test-enterprise-id/safes/test-safe-id/finalize');
|
|
228
|
+
sinon.assert.calledWithMatch(send, { rootKeys });
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe('archiveSafe', function () {
|
|
232
|
+
it('POSTs to the archive URL and returns the archived Safe', async function () {
|
|
233
|
+
const send = sinon.stub().returns({ result: sinon.stub().resolves({ ...safeDataWire, status: 'archived' }) });
|
|
234
|
+
mockBitGo.post.returns({ send });
|
|
235
|
+
const result = await safes.archiveSafe('test-safe-id');
|
|
236
|
+
result.should.be.instanceof(src_1.Safe);
|
|
237
|
+
result.status().should.equal('archived');
|
|
238
|
+
sinon.assert.calledWith(mockBitGo.post, '/enterprise/test-enterprise-id/safes/test-safe-id/archive');
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe('generateSafe', function () {
|
|
242
|
+
it('chains initialize → createSafeKeys → finalize, threading the safeId', async function () {
|
|
243
|
+
const initializing = new src_1.Safe(mockBitGo, { ...safeDataWire, status: 'initializing' });
|
|
244
|
+
const rootKeys = { rootKeys: { hot: {} } };
|
|
245
|
+
const initStub = sinon.stub(safes, 'initializeSafe').resolves(initializing);
|
|
246
|
+
const keysStub = sinon.stub(safes, 'createSafeKeys').resolves(rootKeys);
|
|
247
|
+
const finalizeStub = sinon.stub(safes, 'finalizeSafe').resolves(new src_1.Safe(mockBitGo, safeDataWire));
|
|
248
|
+
const result = await safes.generateSafe({ label: 'my safe', passphrase: 'pw' });
|
|
249
|
+
sinon.assert.calledWithMatch(initStub, { label: 'my safe' });
|
|
250
|
+
sinon.assert.calledWithMatch(keysStub, { label: 'my safe', passphrase: 'pw', safeId: 'test-safe-id' });
|
|
251
|
+
sinon.assert.calledWith(finalizeStub, 'test-safe-id', rootKeys);
|
|
252
|
+
sinon.assert.callOrder(initStub, keysStub, finalizeStub);
|
|
253
|
+
result.status().should.equal('active');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('unimplemented lifecycle methods', function () {
|
|
80
257
|
it('list throws (Phase 3)', async function () {
|
|
81
258
|
await safes.list().should.be.rejectedWith(/not yet implemented .*Phase 3/);
|
|
82
259
|
});
|
|
@@ -91,4 +268,4 @@ describe('Safes', function () {
|
|
|
91
268
|
});
|
|
92
269
|
});
|
|
93
270
|
});
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9zYWZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQW9EO0FBRXBELFFBQVEsQ0FBQyxPQUFPLEVBQUU7SUFDaEIsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxTQUFjLENBQUM7SUFFbkIsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztTQUNwRCxDQUFDO1FBQ0YsS0FBSyxHQUFHLElBQUksV0FBSyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsK0ZBQStGO0lBQy9GLGdHQUFnRztJQUNoRyx1QkFBdUI7SUFDdkIsUUFBUSxDQUFDLGlDQUFpQyxFQUFFO1FBQzFDLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLO1lBQ3ZDLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNwSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLO1lBQ3pDLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDckcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSztZQUN6QyxNQUFNLEtBQUs7aUJBQ1IsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztpQkFDOUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLO1lBQ3ZDLE1BQU0sS0FBSztpQkFDUixZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUNuQixRQUFRLEVBQUU7b0JBQ1IsR0FBRyxFQUFFO3dCQUNILGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7d0JBQ2xDLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO3dCQUN6QixRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzt3QkFDekIsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7cUJBQ2pDO2lCQUNGO2FBQ0YsQ0FBQztpQkFDRCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEtBQUs7WUFDL0IsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLO1lBQzlCLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtRQUN0QyxFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQkFBVSxDQUFDLFNBQVMsRUFBRSxFQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBFbnRlcnByaXNlLCBTYWZlcyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdTYWZlcycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHNhZmVzOiBTYWZlcztcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBwYXRoKSxcbiAgICB9O1xuICAgIHNhZmVzID0gbmV3IFNhZmVzKG1vY2tCaXRHbywgJ3Rlc3QtZW50ZXJwcmlzZS1pZCcpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgLy8gUGhhc2UgMiAoZ2VuZXJhdGVTYWZlL2luaXRpYWxpemUvY3JlYXRlU2FmZUtleXMvZmluYWxpemUpIGFuZCBQaGFzZSAzIChsaXN0L2dldCkgYXJlIG5vdCB5ZXRcbiAgLy8gaW1wbGVtZW50ZWQg4oCUIHRoZXkgYXJlIGdhdGVkIG9uIFdDTi0xMTc1IC8gV0NOLTExNzYgLyBXQ04tMTE3Ny4gQXNzZXJ0IHRoZSBpbnRlcmZhY2UgaXMgd2lyZWRcbiAgLy8gYW5kIHN0dWJiZWQgZm9yIG5vdy5cbiAgZGVzY3JpYmUoJ3VuaW1wbGVtZW50ZWQgbGlmZWN5Y2xlIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2dlbmVyYXRlU2FmZSB0aHJvd3MgKFBoYXNlIDIpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZXMuZ2VuZXJhdGVTYWZlKHsgbGFiZWw6ICd2JywgcGFzc3BocmFzZTogJ3AnIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQgLipQaGFzZSAyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZVNhZmUgdGhyb3dzIChQaGFzZSAyKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNhZmVzLmluaXRpYWxpemVTYWZlKHsgbGFiZWw6ICd2JyB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub3QgeWV0IGltcGxlbWVudGVkIC4qUGhhc2UgMi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZVNhZmVLZXlzIHRocm93cyAoUGhhc2UgMiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzYWZlc1xuICAgICAgICAuY3JlYXRlU2FmZUtleXMoeyBsYWJlbDogJ3YnLCBwYXNzcGhyYXNlOiAncCcsIHNhZmVJZDogJ3ZpZCcgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQgLipQaGFzZSAyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmluYWxpemVTYWZlIHRocm93cyAoUGhhc2UgMiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzYWZlc1xuICAgICAgICAuZmluYWxpemVTYWZlKCd2aWQnLCB7XG4gICAgICAgICAgcm9vdEtleXM6IHtcbiAgICAgICAgICAgIGhvdDoge1xuICAgICAgICAgICAgICBzZWNwMjU2azFNdWx0aXNpZzogWyd1JywgJ2InLCAnZyddLFxuICAgICAgICAgICAgICBlY2RzYU1wYzogWyd1JywgJ2InLCAnZyddLFxuICAgICAgICAgICAgICBlZGRzYU1wYzogWyd1JywgJ2InLCAnZyddLFxuICAgICAgICAgICAgICBlZDI1NTE5TXVsdGlzaWc6IFsndScsICdiJywgJ2cnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQgLipQaGFzZSAyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGlzdCB0aHJvd3MgKFBoYXNlIDMpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZXMubGlzdCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQgLipQaGFzZSAzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0IHRocm93cyAoUGhhc2UgMyknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzYWZlcy5nZXQoeyBpZDogJ3ZpZCcgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm90IHlldCBpbXBsZW1lbnRlZCAuKlBoYXNlIDMvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VudGVycHJpc2Uuc2FmZXMoKSBhY2Nlc3NvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncmV0dXJucyBhIFNhZmVzIGluc3RhbmNlIHNjb3BlZCB0byB0aGUgZW50ZXJwcmlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShtb2NrQml0R28sIHt9IGFzIGFueSwgeyBpZDogJ2VudC1pZCcsIG5hbWU6ICdlbnQnIH0pO1xuICAgICAgZW50ZXJwcmlzZS5zYWZlcygpLnNob3VsZC5iZS5pbnN0YW5jZW9mKFNhZmVzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9zYWZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQTBEO0FBRTFELFFBQVEsQ0FBQyxPQUFPLEVBQUU7SUFDaEIsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxTQUFjLENBQUM7SUFDbkIsTUFBTSxZQUFZLEdBQUc7UUFDbkIsRUFBRSxFQUFFLGNBQWM7UUFDbEIsWUFBWSxFQUFFLG9CQUFvQjtRQUNsQyxLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsUUFBUTtRQUNoQixPQUFPLEVBQUUsWUFBWTtRQUNyQixLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsU0FBUyxFQUFFLDBCQUEwQjtLQUN0QyxDQUFDO0lBRUYsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNuRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtTQUNuQixDQUFDO1FBQ0YsS0FBSyxHQUFHLElBQUksV0FBSyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO1lBQzlELE1BQU0s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QUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLO1lBQzlCLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtRQUN0QyxFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQkFBVSxDQUFDLFNBQVMsRUFBRSxFQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBFbnRlcnByaXNlLCBTYWZlLCBTYWZlcyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdTYWZlcycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHNhZmVzOiBTYWZlcztcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBjb25zdCBzYWZlRGF0YVdpcmUgPSB7XG4gICAgaWQ6ICd0ZXN0LXNhZmUtaWQnLFxuICAgIGVudGVycHJpc2VJZDogJ3Rlc3QtZW50ZXJwcmlzZS1pZCcsXG4gICAgbGFiZWw6ICdteSBzYWZlJyxcbiAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgIGNyZWF0b3I6ICdjcmVhdG9yLWlkJyxcbiAgICB1c2VyczogW3sgdXNlcklkOiAnY3JlYXRvci1pZCcsIHBlcm1pc3Npb25zOiBbJ2FkbWluJywgJ3NwZW5kJ10gfV0sXG4gICAgY3JlYXRlZEF0OiAnMjAyNi0wNy0wN1QwMDowMDowMC4wMDBaJyxcbiAgfTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgfTtcbiAgICBzYWZlcyA9IG5ldyBTYWZlcyhtb2NrQml0R28sICd0ZXN0LWVudGVycHJpc2UtaWQnKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0aWFsaXplU2FmZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnUE9TVHMgdG8gdGhlIHNhZmVzIGNvbGxlY3Rpb24gVVJMIGFuZCByZXR1cm5zIGEgU2FmZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHNhZmVEYXRhV2lyZSkgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZCB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZXMuaW5pdGlhbGl6ZVNhZmUoeyBsYWJlbDogJ215IHNhZmUnIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmluc3RhbmNlb2YoU2FmZSk7XG4gICAgICByZXN1bHQuaWQoKS5zaG91bGQuZXF1YWwoJ3Rlc3Qtc2FmZS1pZCcpO1xuICAgICAgcmVzdWx0LmVudGVycHJpc2VJZCgpLnNob3VsZC5lcXVhbCgndGVzdC1lbnRlcnByaXNlLWlkJyk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aChtb2NrQml0R28ucG9zdCwgJy9lbnRlcnByaXNlL3Rlc3QtZW50ZXJwcmlzZS1pZC9zYWZlcycpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGgoc2VuZCwgeyBsYWJlbDogJ215IHNhZmUnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY3JlYXRlU2FmZUtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gUGVyLWNvaW4ga2V5Y2hhaW5zKCkgbW9jazogbXVsdGlzaWcgY29pbnMgdXNlIGNyZWF0ZS9hZGQvY3JlYXRlQmFja3VwL2NyZWF0ZUJpdEdvOyBNUEMgY29pbnNcbiAgICAvLyB1c2UgY3JlYXRlTXBjLiBJZHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgY29pbiBuYW1lIHNvIHdlIGNhbiBhc3NlcnQgcGVyLXNsb3QgY29pbiByb3V0aW5nLlxuICAgIGZ1bmN0aW9uIG1ha2VLZXljaGFpbnMoY29pbjogc3RyaW5nKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViOiBgJHtjb2lufS1wdWJgLCBwcnY6IGAke2NvaW59LXBydmAgfSksXG4gICAgICAgIGFkZDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6IGAke2NvaW59LXVzZXJgIH0pLFxuICAgICAgICBjcmVhdGVCYWNrdXA6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiBgJHtjb2lufS1iYWNrdXBgIH0pLFxuICAgICAgICBjcmVhdGVCaXRHbzogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6IGAke2NvaW59LWJpdGdvYCB9KSxcbiAgICAgICAgY3JlYXRlTXBjOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHVzZXJLZXljaGFpbjogeyBpZDogYCR7Y29pbn0tdXNlcmAgfSxcbiAgICAgICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDogYCR7Y29pbn0tYmFja3VwYCB9LFxuICAgICAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6IGAke2NvaW59LWJpdGdvYCB9LFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGtleWNoYWluc0J5Q29pbjogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUtleWNoYWlucz4+O1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBrZXljaGFpbnNCeUNvaW4gPSB7fTtcbiAgICAgIG1vY2tCaXRHby5nZXRFbnYgPSBzaW5vbi5zdHViKCkucmV0dXJucygndGVzdCcpOyAvLyB0ZXN0bmV0IGNvaW4gbWFwXG4gICAgICBtb2NrQml0R28uZW5jcnlwdCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZW5jcnlwdGVkLXBydicpO1xuICAgICAgbW9ja0JpdEdvLmNvaW4gPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAga2V5Y2hhaW5zQnlDb2luW25hbWVdID0ga2V5Y2hhaW5zQnlDb2luW25hbWVdIHx8IG1ha2VLZXljaGFpbnMobmFtZSk7XG4gICAgICAgIHJldHVybiB7IGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zQnlDb2luW25hbWVdIH07XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdydW5zIHRoZSA0IHJvb3QgY2VyZW1vbmllcyBhbmQgcmV0dXJucyAxMiBpZHMgYXMgb3JkZXJlZCB0cmlwbGV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhZmVzLmNyZWF0ZVNhZmVLZXlzKHsgbGFiZWw6ICdteSBzYWZlJywgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiAnc2FmZS0xJyB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICByb290S2V5czoge1xuICAgICAgICAgIGhvdDoge1xuICAgICAgICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6IFsndGJ0Yy11c2VyJywgJ3RidGMtYmFja3VwJywgJ3RidGMtYml0Z28nXSxcbiAgICAgICAgICAgIGVjZHNhTXBjOiBbJ2h0ZXRoLXVzZXInLCAnaHRldGgtYmFja3VwJywgJ2h0ZXRoLWJpdGdvJ10sXG4gICAgICAgICAgICBlZGRzYU1wYzogWyd0c29sLXVzZXInLCAndHNvbC1iYWNrdXAnLCAndHNvbC1iaXRnbyddLFxuICAgICAgICAgICAgZWQyNTUxOU11bHRpc2lnOiBbJ3R4bG0tdXNlcicsICd0eGxtLWJhY2t1cCcsICd0eGxtLWJpdGdvJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RhZ3MgZXZlcnkgbXVsdGlzaWcga2V5IHJlZ2lzdHJhdGlvbiB3aXRoIHNhZmVJZCBhbmQgdGhlIGNvcnJlY3Qgc291cmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZXMuY3JlYXRlU2FmZUtleXMoeyBsYWJlbDogJ215IHNhZmUnLCBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6ICdzYWZlLTEnIH0pO1xuXG4gICAgICBjb25zdCBidGMgPSBrZXljaGFpbnNCeUNvaW5bJ3RidGMnXTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRXaXRoTWF0Y2goYnRjLmFkZCwge1xuICAgICAgICBwdWI6ICd0YnRjLXB1YicsXG4gICAgICAgIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1wcnYnLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgc2FmZUlkOiAnc2FmZS0xJyxcbiAgICAgIH0pO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGhNYXRjaChidGMuY3JlYXRlQmFja3VwLCB7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogJ3NhZmUtMScgfSk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aE1hdGNoKGJ0Yy5jcmVhdGVCaXRHbywgeyBlbnRlcnByaXNlOiAndGVzdC1lbnRlcnByaXNlLWlkJywgc2FmZUlkOiAnc2FmZS0xJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJlYWRzIHNhZmVJZCArIGVudGVycHJpc2UgaW50byBib3RoIE1QQyBjZXJlbW9uaWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZXMuY3JlYXRlU2FmZUtleXMoeyBsYWJlbDogJ215IHNhZmUnLCBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6ICdzYWZlLTEnIH0pO1xuXG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aE1hdGNoKGtleWNoYWluc0J5Q29pblsnaHRldGgnXS5jcmVhdGVNcGMsIHtcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3B3JyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ3Rlc3QtZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIHNhZmVJZDogJ3NhZmUtMScsXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRXaXRoTWF0Y2goa2V5Y2hhaW5zQnlDb2luWyd0c29sJ10uY3JlYXRlTXBjLCB7XG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgIHBhc3NwaHJhc2U6ICdwdycsXG4gICAgICAgIGVudGVycHJpc2U6ICd0ZXN0LWVudGVycHJpc2UtaWQnLFxuICAgICAgICBzYWZlSWQ6ICdzYWZlLTEnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VsZWN0cyBtYWlubmV0IGNvaW5zIGluIGEgcHJvZCBlbnZpcm9ubWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXRFbnYgPSBzaW5vbi5zdHViKCkucmV0dXJucygncHJvZCcpO1xuICAgICAgYXdhaXQgc2FmZXMuY3JlYXRlU2FmZUtleXMoeyBsYWJlbDogJ215IHNhZmUnLCBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6ICdzYWZlLTEnIH0pO1xuXG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aChtb2NrQml0R28uY29pbiwgJ2J0YycpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGgobW9ja0JpdEdvLmNvaW4sICdldGgnKTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRXaXRoKG1vY2tCaXRHby5jb2luLCAnc29sJyk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aChtb2NrQml0R28uY29pbiwgJ3hsbScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3J1bnMgdGhlIDQgcm9vdCBjZXJlbW9uaWVzIGluIHBhcmFsbGVsIChub25lIGF3YWl0cyBhbm90aGVyKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEdhdGUgZXhhY3RseSBvbmUgY2FsbCBwZXIgcm9vdCBvbiBhIHNoYXJlZCBsYXRjaCB0aGF0IG9ubHkgb3BlbnMgb25jZSBhbGwgNCByb290cyBoYXZlXG4gICAgICAvLyBlbnRlcmVkLiBJZiB0aGUgcm9vdHMgcmFuIHNlcXVlbnRpYWxseSwgdGhlIGZpcnN0IHdvdWxkIGF3YWl0IHRoZSBsYXRjaCBmb3JldmVyIOKGkiB0aGVcbiAgICAgIC8vIHRlc3Qgd291bGQgdGltZSBvdXQ7IGNvbXBsZXRpbmcgcHJvdmVzIGFsbCA0IHdlcmUgaW4gZmxpZ2h0IGNvbmN1cnJlbnRseS5cbiAgICAgIGxldCByZWxlYXNlOiAoKSA9PiB2b2lkID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZ2F0ZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICAgIGxldCBzdGFydGVkID0gMDtcbiAgICAgIGNvbnN0IGdhdGVkID0gKHJlc3VsdDogYW55KSA9PlxuICAgICAgICBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoKytzdGFydGVkID09PSA0KSB7XG4gICAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGdhdGU7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAvLyBvbmUgZ2F0ZWQgZW50cnkgcG9pbnQgcGVyIHJvb3Q6IG11bHRpc2lnIHJvb3RzIHZpYSBjcmVhdGVCaXRHbywgTVBDIHJvb3RzIHZpYSBjcmVhdGVNcGNcbiAgICAgIGtleWNoYWluc0J5Q29pblsndGJ0YyddID0gbWFrZUtleWNoYWlucygndGJ0YycpO1xuICAgICAga2V5Y2hhaW5zQnlDb2luWyd0YnRjJ10uY3JlYXRlQml0R28gPSBnYXRlZCh7IGlkOiAndGJ0Yy1iaXRnbycgfSk7XG4gICAgICBrZXljaGFpbnNCeUNvaW5bJ3R4bG0nXSA9IG1ha2VLZXljaGFpbnMoJ3R4bG0nKTtcbiAgICAgIGtleWNoYWluc0J5Q29pblsndHhsbSddLmNyZWF0ZUJpdEdvID0gZ2F0ZWQoeyBpZDogJ3R4bG0tYml0Z28nIH0pO1xuICAgICAga2V5Y2hhaW5zQnlDb2luWydodGV0aCddID0gbWFrZUtleWNoYWlucygnaHRldGgnKTtcbiAgICAgIGtleWNoYWluc0J5Q29pblsnaHRldGgnXS5jcmVhdGVNcGMgPSBnYXRlZCh7XG4gICAgICAgIHVzZXJLZXljaGFpbjogeyBpZDogJ2h0ZXRoLXVzZXInIH0sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiAnaHRldGgtYmFja3VwJyB9LFxuICAgICAgICBiaXRnb0tleWNoYWluOiB7IGlkOiAnaHRldGgtYml0Z28nIH0sXG4gICAgICB9KTtcbiAgICAgIGtleWNoYWluc0J5Q29pblsndHNvbCddID0gbWFrZUtleWNoYWlucygndHNvbCcpO1xuICAgICAga2V5Y2hhaW5zQnlDb2luWyd0c29sJ10uY3JlYXRlTXBjID0gZ2F0ZWQoe1xuICAgICAgICB1c2VyS2V5Y2hhaW46IHsgaWQ6ICd0c29sLXVzZXInIH0sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiAndHNvbC1iYWNrdXAnIH0sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6ICd0c29sLWJpdGdvJyB9LFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHNhZmVzLmNyZWF0ZVNhZmVLZXlzKHsgbGFiZWw6ICdteSBzYWZlJywgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiAnc2FmZS0xJyB9KTtcbiAgICAgIHN0YXJ0ZWQuc2hvdWxkLmVxdWFsKDQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FyY2hpdmVzIHRoZSBzYWZlIGFuZCB0aHJvd3MgbGlzdGluZyBldmVyeSBmYWlsZWQgY2VyZW1vbnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUd28gY2VyZW1vbmllcyBmYWlsIChhbiBNUEMgYW5kIGEgbXVsdGlzaWcgcm9vdCkuXG4gICAgICBrZXljaGFpbnNCeUNvaW5bJ2h0ZXRoJ10gPSBtYWtlS2V5Y2hhaW5zKCdodGV0aCcpO1xuICAgICAga2V5Y2hhaW5zQnlDb2luWydodGV0aCddLmNyZWF0ZU1wYyA9IHNpbm9uLnN0dWIoKS5yZWplY3RzKG5ldyBFcnJvcignZGtscyBib29tJykpO1xuICAgICAga2V5Y2hhaW5zQnlDb2luWyd0eGxtJ10gPSBtYWtlS2V5Y2hhaW5zKCd0eGxtJyk7XG4gICAgICBrZXljaGFpbnNCeUNvaW5bJ3R4bG0nXS5jcmVhdGVCaXRHbyA9IHNpbm9uLnN0dWIoKS5yZWplY3RzKG5ldyBFcnJvcignYml0Z28ga2V5IGJvb20nKSk7XG4gICAgICAvLyBhcmNoaXZlIHN1Y2NlZWRzLCByZXR1cm5pbmcgYSB2YWxpZCAoYXJjaGl2ZWQpIFNhZmVEYXRhXG4gICAgICBjb25zdCBzZW5kID0gc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IC4uLnNhZmVEYXRhV2lyZSwgc3RhdHVzOiAnYXJjaGl2ZWQnIH0pLFxuICAgICAgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZCB9KTtcblxuICAgICAgY29uc3QgZXJyID0gYXdhaXQgc2FmZXNcbiAgICAgICAgLmNyZWF0ZVNhZmVLZXlzKHsgbGFiZWw6ICdteSBzYWZlJywgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiAnc2FmZS0xJyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvU2FmZSBrZXkgZ2VuZXJhdGlvbiBmYWlsZWQgZm9yIDIgcm9vdC8pO1xuICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLm1hdGNoKC9lY2RzYU1wYzogZGtscyBib29tLyk7XG4gICAgICBlcnIubWVzc2FnZS5zaG91bGQubWF0Y2goL2VkMjU1MTlNdWx0aXNpZzogYml0Z28ga2V5IGJvb20vKTtcbiAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5tYXRjaCgvaGFzIGJlZW4gYXJjaGl2ZWQvKTtcbiAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5ub3QubWF0Y2goL2FyY2hpdmluZyB0aGUgc2FmZSBhbHNvIGZhaWxlZC8pO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGgobW9ja0JpdEdvLnBvc3QsICcvZW50ZXJwcmlzZS90ZXN0LWVudGVycHJpc2UtaWQvc2FmZXMvc2FmZS0xL2FyY2hpdmUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdub3RlcyB3aGVuIGFyY2hpdmluZyBhbHNvIGZhaWxzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAga2V5Y2hhaW5zQnlDb2luWyd0c29sJ10gPSBtYWtlS2V5Y2hhaW5zKCd0c29sJyk7XG4gICAgICBrZXljaGFpbnNCeUNvaW5bJ3Rzb2wnXS5jcmVhdGVNcGMgPSBzaW5vbi5zdHViKCkucmVqZWN0cyhuZXcgRXJyb3IoJ2VkZHNhIGJvb20nKSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZWplY3RzKG5ldyBFcnJvcignYXJjaGl2ZSA1MDAnKSkgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgc2FmZXNcbiAgICAgICAgLmNyZWF0ZVNhZmVLZXlzKHsgbGFiZWw6ICdteSBzYWZlJywgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiAnc2FmZS0xJyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvYXJjaGl2aW5nIHRoZSBzYWZlIGFsc28gZmFpbGVkIFxcKGFyY2hpdmUgNTAwXFwpLiphcmNoaXZlIGl0IG1hbnVhbGx5Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaW5hbGl6ZVNhZmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgcm9vdEtleXMgPSB7XG4gICAgICBob3Q6IHtcbiAgICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6IFsndTEnLCAnYjEnLCAnZzEnXSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10sXG4gICAgICAgIGVjZHNhTXBjOiBbJ3UyJywgJ2IyJywgJ2cyJ10gYXMgW3N0cmluZywgc3RyaW5nLCBzdHJpbmddLFxuICAgICAgICBlZGRzYU1wYzogWyd1MycsICdiMycsICdnMyddIGFzIFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSxcbiAgICAgICAgZWQyNTUxOU11bHRpc2lnOiBbJ3U0JywgJ2I0JywgJ2c0J10gYXMgW3N0cmluZywgc3RyaW5nLCBzdHJpbmddLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaXQoJ1BPU1RzIHRoZSByb290S2V5cyB0byB0aGUgZmluYWxpemUgVVJMIGFuZCByZXR1cm5zIHRoZSBhY3RpdmUgU2FmZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHNhZmVEYXRhV2lyZSkgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZCB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZXMuZmluYWxpemVTYWZlKCd0ZXN0LXNhZmUtaWQnLCB7IHJvb3RLZXlzIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmluc3RhbmNlb2YoU2FmZSk7XG4gICAgICByZXN1bHQuc3RhdHVzKCkuc2hvdWxkLmVxdWFsKCdhY3RpdmUnKTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRXaXRoKG1vY2tCaXRHby5wb3N0LCAnL2VudGVycHJpc2UvdGVzdC1lbnRlcnByaXNlLWlkL3NhZmVzL3Rlc3Qtc2FmZS1pZC9maW5hbGl6ZScpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGhNYXRjaChzZW5kLCB7IHJvb3RLZXlzIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXJjaGl2ZVNhZmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ1BPU1RzIHRvIHRoZSBhcmNoaXZlIFVSTCBhbmQgcmV0dXJucyB0aGUgYXJjaGl2ZWQgU2FmZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgLi4uc2FmZURhdGFXaXJlLCBzdGF0dXM6ICdhcmNoaXZlZCcgfSkgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZCB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZXMuYXJjaGl2ZVNhZmUoJ3Rlc3Qtc2FmZS1pZCcpO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmluc3RhbmNlb2YoU2FmZSk7XG4gICAgICByZXN1bHQuc3RhdHVzKCkuc2hvdWxkLmVxdWFsKCdhcmNoaXZlZCcpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGgobW9ja0JpdEdvLnBvc3QsICcvZW50ZXJwcmlzZS90ZXN0LWVudGVycHJpc2UtaWQvc2FmZXMvdGVzdC1zYWZlLWlkL2FyY2hpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlU2FmZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnY2hhaW5zIGluaXRpYWxpemUg4oaSIGNyZWF0ZVNhZmVLZXlzIOKGkiBmaW5hbGl6ZSwgdGhyZWFkaW5nIHRoZSBzYWZlSWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbml0aWFsaXppbmcgPSBuZXcgU2FmZShtb2NrQml0R28sIHsgLi4uc2FmZURhdGFXaXJlLCBzdGF0dXM6ICdpbml0aWFsaXppbmcnIH0gYXMgYW55KTtcbiAgICAgIGNvbnN0IHJvb3RLZXlzID0geyByb290S2V5czogeyBob3Q6IHt9IH0gfSBhcyBhbnk7XG4gICAgICBjb25zdCBpbml0U3R1YiA9IHNpbm9uLnN0dWIoc2FmZXMsICdpbml0aWFsaXplU2FmZScpLnJlc29sdmVzKGluaXRpYWxpemluZyk7XG4gICAgICBjb25zdCBrZXlzU3R1YiA9IHNpbm9uLnN0dWIoc2FmZXMsICdjcmVhdGVTYWZlS2V5cycpLnJlc29sdmVzKHJvb3RLZXlzKTtcbiAgICAgIGNvbnN0IGZpbmFsaXplU3R1YiA9IHNpbm9uLnN0dWIoc2FmZXMsICdmaW5hbGl6ZVNhZmUnKS5yZXNvbHZlcyhuZXcgU2FmZShtb2NrQml0R28sIHNhZmVEYXRhV2lyZSBhcyBhbnkpKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZXMuZ2VuZXJhdGVTYWZlKHsgbGFiZWw6ICdteSBzYWZlJywgcGFzc3BocmFzZTogJ3B3JyB9KTtcblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGhNYXRjaChpbml0U3R1YiwgeyBsYWJlbDogJ215IHNhZmUnIH0pO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGhNYXRjaChrZXlzU3R1YiwgeyBsYWJlbDogJ215IHNhZmUnLCBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6ICd0ZXN0LXNhZmUtaWQnIH0pO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZFdpdGgoZmluYWxpemVTdHViLCAndGVzdC1zYWZlLWlkJywgcm9vdEtleXMpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxPcmRlcihpbml0U3R1Yiwga2V5c1N0dWIsIGZpbmFsaXplU3R1Yik7XG4gICAgICByZXN1bHQuc3RhdHVzKCkuc2hvdWxkLmVxdWFsKCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VuaW1wbGVtZW50ZWQgbGlmZWN5Y2xlIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2xpc3QgdGhyb3dzIChQaGFzZSAzKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNhZmVzLmxpc3QoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub3QgeWV0IGltcGxlbWVudGVkIC4qUGhhc2UgMy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dldCB0aHJvd3MgKFBoYXNlIDMpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZXMuZ2V0KHsgaWQ6ICd2aWQnIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQgLipQaGFzZSAzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFbnRlcnByaXNlLnNhZmVzKCkgYWNjZXNzb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3JldHVybnMgYSBTYWZlcyBpbnN0YW5jZSBzY29wZWQgdG8gdGhlIGVudGVycHJpc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbnRlcnByaXNlID0gbmV3IEVudGVycHJpc2UobW9ja0JpdEdvLCB7fSBhcyBhbnksIHsgaWQ6ICdlbnQtaWQnLCBuYW1lOiAnZW50JyB9KTtcbiAgICAgIGVudGVycHJpc2Uuc2FmZXMoKS5zaG91bGQuYmUuaW5zdGFuY2VvZihTYWZlcyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|