@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.21 → 0.0.1-beta.211
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/README.md +224 -33
- package/dist/src/kaspa.d.ts +86 -18
- package/dist/src/kaspa.d.ts.map +1 -1
- package/dist/src/kaspa.js +119 -31
- package/dist/src/lib/constants.d.ts +38 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +56 -5
- package/dist/src/lib/iface.d.ts +28 -17
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/keyPair.d.ts +6 -2
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +7 -4
- package/dist/src/lib/pskt.d.ts +257 -0
- package/dist/src/lib/pskt.d.ts.map +1 -0
- package/dist/src/lib/pskt.js +439 -0
- package/dist/src/lib/sighash.d.ts +34 -13
- package/dist/src/lib/sighash.d.ts.map +1 -1
- package/dist/src/lib/sighash.js +115 -56
- package/dist/src/lib/transaction.d.ts +94 -6
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +199 -21
- package/dist/src/lib/transactionBuilder.d.ts +22 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +53 -5
- package/dist/src/lib/transactionBuilderFactory.d.ts +8 -3
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +14 -4
- package/dist/src/lib/utils.d.ts +17 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +45 -11
- package/dist/src/register.js +2 -2
- package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
- package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
- package/dist/test/fixtures/kaspa.fixtures.js +76 -11
- package/dist/test/unit/coin.test.js +129 -9
- package/dist/test/unit/keyPair.test.js +35 -1
- package/dist/test/unit/pskt.test.d.ts +15 -0
- package/dist/test/unit/pskt.test.d.ts.map +1 -0
- package/dist/test/unit/pskt.test.js +383 -0
- package/dist/test/unit/transaction.test.js +291 -11
- package/dist/test/unit/transactionBuilder.test.js +16 -3
- package/dist/test/unit/transactionFlow.test.js +67 -2
- package/dist/test/unit/utils.test.js +63 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const assert_1 = __importDefault(require("assert"));
|
|
7
7
|
const transaction_1 = require("../../src/lib/transaction");
|
|
8
8
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
|
-
const
|
|
9
|
+
const constants_1 = require("../../src/lib/constants");
|
|
10
10
|
const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
|
|
11
11
|
const COIN = 'kaspa';
|
|
12
12
|
describe('Kaspa Transaction', function () {
|
|
@@ -86,12 +86,12 @@ describe('Kaspa Transaction', function () {
|
|
|
86
86
|
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
87
87
|
const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
|
|
88
88
|
tx.sign(privKey);
|
|
89
|
-
const sigHex = tx.txData.inputs[0].signatureScript;
|
|
90
|
-
//
|
|
91
|
-
assert_1.default.equal(sigHex.length,
|
|
89
|
+
const sigHex = tx.txData.inputs[0].signatureScript ?? '';
|
|
90
|
+
// 66 bytes = 132 hex chars: 0x41 push opcode (1) + 64-byte sig + 1-byte sighash type
|
|
91
|
+
assert_1.default.equal(sigHex.length, 132);
|
|
92
92
|
// Last byte is sighash type (0x01 = SIGHASH_ALL)
|
|
93
93
|
const lastByte = parseInt(sigHex.slice(-2), 16);
|
|
94
|
-
assert_1.default.equal(lastByte,
|
|
94
|
+
assert_1.default.equal(lastByte, constants_1.SIGHASH_ALL);
|
|
95
95
|
});
|
|
96
96
|
});
|
|
97
97
|
describe('verifySignature', function () {
|
|
@@ -129,6 +129,109 @@ describe('Kaspa Transaction', function () {
|
|
|
129
129
|
assert_1.default.equal(tx.verifySignature(pubKey, 99), false);
|
|
130
130
|
});
|
|
131
131
|
});
|
|
132
|
+
// ── ECDSA (v1 address) signing ────────────────────────────────────────────
|
|
133
|
+
//
|
|
134
|
+
// These tests cover the auto-detection path in sign() / verifySignature() /
|
|
135
|
+
// signablePayloads when the input's scriptPublicKey ends with 0xAB (ECDSA).
|
|
136
|
+
describe('sign (ECDSA inputs)', function () {
|
|
137
|
+
it('should sign a single ECDSA input', function () {
|
|
138
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
|
|
139
|
+
const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
|
|
140
|
+
tx.sign(privKey);
|
|
141
|
+
const sigScript = tx.txData.inputs[0].signatureScript ?? '';
|
|
142
|
+
assert_1.default.ok(sigScript.length > 0, 'ECDSA input should have a signatureScript');
|
|
143
|
+
// 66 bytes = 132 hex chars: 0x41 + 64-byte sig + 1-byte sighash type
|
|
144
|
+
assert_1.default.equal(sigScript.length, 132);
|
|
145
|
+
assert_1.default.equal(parseInt(sigScript.slice(-2), 16), constants_1.SIGHASH_ALL);
|
|
146
|
+
});
|
|
147
|
+
it('should sign multiple ECDSA inputs', function () {
|
|
148
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInputEcdsa);
|
|
149
|
+
const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
|
|
150
|
+
tx.sign(privKey);
|
|
151
|
+
assert_1.default.equal(tx.txData.inputs.length, 2);
|
|
152
|
+
for (const input of tx.txData.inputs) {
|
|
153
|
+
assert_1.default.ok(input.signatureScript && input.signatureScript.length > 0);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
it('should produce distinct sighashes for ECDSA vs Schnorr inputs on the same key', function () {
|
|
157
|
+
const schnorrTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
158
|
+
const ecdsaTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
|
|
159
|
+
const [schnorrHash] = schnorrTx.signablePayloads;
|
|
160
|
+
const [ecdsaHash] = ecdsaTx.signablePayloads;
|
|
161
|
+
assert_1.default.ok(!schnorrHash.equals(ecdsaHash), 'ECDSA and Schnorr hashes must differ');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('verifySignature (ECDSA inputs)', function () {
|
|
165
|
+
it('should verify a valid ECDSA signature with compressed pubkey', function () {
|
|
166
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
|
|
167
|
+
tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
|
|
168
|
+
const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
|
|
169
|
+
assert_1.default.ok(tx.verifySignature(pubKey, 0), 'ECDSA signature should verify');
|
|
170
|
+
});
|
|
171
|
+
it('should return false for wrong public key on ECDSA input', function () {
|
|
172
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
|
|
173
|
+
tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
|
|
174
|
+
const wrongPub = Buffer.from('02' + 'ab'.repeat(32), 'hex');
|
|
175
|
+
assert_1.default.equal(tx.verifySignature(wrongPub, 0), false);
|
|
176
|
+
});
|
|
177
|
+
it('should verify all inputs in a multi-input ECDSA transaction', function () {
|
|
178
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInputEcdsa);
|
|
179
|
+
tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
|
|
180
|
+
const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
|
|
181
|
+
assert_1.default.ok(tx.verifySignature(pubKey, 0));
|
|
182
|
+
assert_1.default.ok(tx.verifySignature(pubKey, 1));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('sign + verifySignature (mixed Schnorr + ECDSA inputs)', function () {
|
|
186
|
+
it('should sign and verify each input with the correct algorithm', function () {
|
|
187
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.mixedSchnorrEcdsa);
|
|
188
|
+
const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
|
|
189
|
+
tx.sign(privKey);
|
|
190
|
+
assert_1.default.equal(tx.txData.inputs.length, 2, 'should have 2 inputs');
|
|
191
|
+
const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
|
|
192
|
+
// input[0] is Schnorr (scriptPublicKey ends 0xAC)
|
|
193
|
+
assert_1.default.ok(tx.verifySignature(pubKey, 0), 'Schnorr input[0] should verify');
|
|
194
|
+
// input[1] is ECDSA (scriptPublicKey ends 0xAB)
|
|
195
|
+
assert_1.default.ok(tx.verifySignature(pubKey, 1), 'ECDSA input[1] should verify');
|
|
196
|
+
});
|
|
197
|
+
it('should produce different script types for Schnorr and ECDSA inputs', function () {
|
|
198
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.mixedSchnorrEcdsa);
|
|
199
|
+
tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
|
|
200
|
+
// Both produce 66-byte (132 hex char) scriptSigs but via different algorithms —
|
|
201
|
+
// the last opcode of their scriptPublicKey is the differentiator.
|
|
202
|
+
assert_1.default.equal((tx.txData.inputs[0].signatureScript ?? '').length, 132);
|
|
203
|
+
assert_1.default.equal((tx.txData.inputs[1].signatureScript ?? '').length, 132);
|
|
204
|
+
// The signatures themselves should differ (different sighash algorithm)
|
|
205
|
+
assert_1.default.notEqual(tx.txData.inputs[0].signatureScript, tx.txData.inputs[1].signatureScript);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('signablePayloads (ECDSA inputs)', function () {
|
|
209
|
+
it('should return a 32-byte hash for a single ECDSA input', function () {
|
|
210
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
|
|
211
|
+
const [hash] = tx.signablePayloads;
|
|
212
|
+
assert_1.default.ok(Buffer.isBuffer(hash));
|
|
213
|
+
assert_1.default.equal(hash.length, 32);
|
|
214
|
+
});
|
|
215
|
+
it('should return distinct hashes for each ECDSA input', function () {
|
|
216
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInputEcdsa);
|
|
217
|
+
const [h0, h1] = tx.signablePayloads;
|
|
218
|
+
assert_1.default.ok(!h0.equals(h1));
|
|
219
|
+
});
|
|
220
|
+
it('should return different hashes for Schnorr and ECDSA inputs on the same index', function () {
|
|
221
|
+
const schnorrTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
222
|
+
const ecdsaTx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simpleEcdsa);
|
|
223
|
+
// Both transactions have the same structure except scriptPublicKey type.
|
|
224
|
+
// The ECDSA hash applies an additional SHA256 step so the result must differ.
|
|
225
|
+
assert_1.default.ok(!schnorrTx.signablePayloads[0].equals(ecdsaTx.signablePayloads[0]));
|
|
226
|
+
});
|
|
227
|
+
it('mixed tx: Schnorr hash at index 0, ECDSA hash at index 1 — both 32 bytes', function () {
|
|
228
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.mixedSchnorrEcdsa);
|
|
229
|
+
const [h0, h1] = tx.signablePayloads;
|
|
230
|
+
assert_1.default.equal(h0.length, 32);
|
|
231
|
+
assert_1.default.equal(h1.length, 32);
|
|
232
|
+
assert_1.default.ok(!h0.equals(h1));
|
|
233
|
+
});
|
|
234
|
+
});
|
|
132
235
|
describe('explainTransaction', function () {
|
|
133
236
|
it('should return a TransactionExplanation with correct fields', function () {
|
|
134
237
|
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
@@ -152,6 +255,119 @@ describe('Kaspa Transaction', function () {
|
|
|
152
255
|
assert_1.default.equal(explanation.outputAmount, '299998000');
|
|
153
256
|
});
|
|
154
257
|
});
|
|
258
|
+
describe('fee', function () {
|
|
259
|
+
it('should return explicit fee when set in txData', function () {
|
|
260
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
261
|
+
assert_1.default.equal(tx.fee, '2000');
|
|
262
|
+
});
|
|
263
|
+
it('should compute fee from inputs - outputs when fee is not set', function () {
|
|
264
|
+
const txData = { ...kaspa_fixtures_1.TRANSACTIONS.simple };
|
|
265
|
+
delete txData.fee;
|
|
266
|
+
const tx = new transaction_1.Transaction(COIN, txData);
|
|
267
|
+
// input: 100000000, output: 99998000, fee = 2000
|
|
268
|
+
assert_1.default.equal(tx.fee, '2000');
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
describe('signablePayloads', function () {
|
|
272
|
+
it('should return one Buffer per input', function () {
|
|
273
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
274
|
+
const payloads = tx.signablePayloads;
|
|
275
|
+
assert_1.default.equal(payloads.length, 1);
|
|
276
|
+
assert_1.default.ok(Buffer.isBuffer(payloads[0]));
|
|
277
|
+
assert_1.default.equal(payloads[0].length, 32);
|
|
278
|
+
});
|
|
279
|
+
it('should return two Buffers for a two-input transaction', function () {
|
|
280
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
281
|
+
const payloads = tx.signablePayloads;
|
|
282
|
+
assert_1.default.equal(payloads.length, 2);
|
|
283
|
+
for (const p of payloads) {
|
|
284
|
+
assert_1.default.ok(Buffer.isBuffer(p));
|
|
285
|
+
assert_1.default.equal(p.length, 32);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
it('should return distinct hashes for each input in a multi-input tx', function () {
|
|
289
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
290
|
+
const [p0, p1] = tx.signablePayloads;
|
|
291
|
+
assert_1.default.ok(!p0.equals(p1), 'per-input sighashes must differ (each commits to its own index)');
|
|
292
|
+
});
|
|
293
|
+
it('should throw when transaction has no inputs', function () {
|
|
294
|
+
const tx = new transaction_1.Transaction(COIN);
|
|
295
|
+
assert_1.default.throws(() => {
|
|
296
|
+
tx.signablePayloads;
|
|
297
|
+
}, /no inputs/);
|
|
298
|
+
});
|
|
299
|
+
it('should be deterministic for the same transaction data', function () {
|
|
300
|
+
const tx1 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
301
|
+
const tx2 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
302
|
+
const [a0, a1] = tx1.signablePayloads;
|
|
303
|
+
const [b0, b1] = tx2.signablePayloads;
|
|
304
|
+
assert_1.default.ok(a0.equals(b0));
|
|
305
|
+
assert_1.default.ok(a1.equals(b1));
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('addSignatureForInput', function () {
|
|
309
|
+
it('should write the signature only to the specified input', function () {
|
|
310
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
311
|
+
const fakeSig = Buffer.alloc(64, 0xaa);
|
|
312
|
+
tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, fakeSig);
|
|
313
|
+
assert_1.default.ok(tx.txData.inputs[0].signatureScript, 'input[0] should be signed');
|
|
314
|
+
assert_1.default.equal(tx.txData.inputs[1].signatureScript, undefined, 'input[1] should remain unsigned');
|
|
315
|
+
});
|
|
316
|
+
it('should write different signatures to different inputs independently', function () {
|
|
317
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
318
|
+
const sig0 = Buffer.alloc(64, 0xaa);
|
|
319
|
+
const sig1 = Buffer.alloc(64, 0xbb);
|
|
320
|
+
tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, sig0);
|
|
321
|
+
tx.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, sig1);
|
|
322
|
+
assert_1.default.notEqual(tx.txData.inputs[0].signatureScript, tx.txData.inputs[1].signatureScript, 'each input should carry its own signature script');
|
|
323
|
+
});
|
|
324
|
+
it('should produce a 66-byte script (push opcode + 64 sig + 1 sighash type) for the target input', function () {
|
|
325
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
326
|
+
tx.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64, 0xcc));
|
|
327
|
+
// 66 bytes = 132 hex chars: 0x41 push opcode + 64-byte sig + 1-byte sighash type
|
|
328
|
+
assert_1.default.equal((tx.txData.inputs[1].signatureScript ?? '').length, 132);
|
|
329
|
+
});
|
|
330
|
+
it('should append SIGHASH_ALL byte by default', function () {
|
|
331
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
332
|
+
tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64, 0xdd));
|
|
333
|
+
const lastByte = parseInt((tx.txData.inputs[0].signatureScript ?? '').slice(-2), 16);
|
|
334
|
+
assert_1.default.equal(lastByte, constants_1.SIGHASH_ALL);
|
|
335
|
+
});
|
|
336
|
+
it('should produce a verifiable signature when given the correct Schnorr sig for that input', function () {
|
|
337
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
338
|
+
const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
|
|
339
|
+
// sign() computes the correct per-input sighash internally
|
|
340
|
+
tx.sign(privKey);
|
|
341
|
+
// Skip the leading 0x41 push opcode (2 hex chars), read the next 64 bytes (128 hex chars)
|
|
342
|
+
const sig0 = Buffer.from((tx.txData.inputs[0].signatureScript ?? '').slice(2, 130), 'hex');
|
|
343
|
+
const sig1 = Buffer.from((tx.txData.inputs[1].signatureScript ?? '').slice(2, 130), 'hex');
|
|
344
|
+
// Rebuild unsigned and apply via addSignatureForInput
|
|
345
|
+
const tx2 = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
346
|
+
tx2.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, sig0);
|
|
347
|
+
tx2.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, sig1);
|
|
348
|
+
const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
|
|
349
|
+
assert_1.default.ok(tx2.verifySignature(pubKey, 0), 'input[0] signature should verify');
|
|
350
|
+
assert_1.default.ok(tx2.verifySignature(pubKey, 1), 'input[1] signature should verify');
|
|
351
|
+
});
|
|
352
|
+
it('should throw for an out-of-range index', function () {
|
|
353
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
354
|
+
assert_1.default.throws(() => {
|
|
355
|
+
tx.addSignatureForInput(5, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64));
|
|
356
|
+
}, /out of range/);
|
|
357
|
+
});
|
|
358
|
+
it('should throw for a negative index', function () {
|
|
359
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
360
|
+
assert_1.default.throws(() => {
|
|
361
|
+
tx.addSignatureForInput(-1, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(64));
|
|
362
|
+
}, /out of range/);
|
|
363
|
+
});
|
|
364
|
+
it('should throw for a non-64-byte signature', function () {
|
|
365
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
366
|
+
assert_1.default.throws(() => {
|
|
367
|
+
tx.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, Buffer.alloc(32));
|
|
368
|
+
}, /64-byte/);
|
|
369
|
+
});
|
|
370
|
+
});
|
|
155
371
|
describe('Serialization', function () {
|
|
156
372
|
it('toJson should return a copy of txData', function () {
|
|
157
373
|
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
@@ -159,21 +375,48 @@ describe('Kaspa Transaction', function () {
|
|
|
159
375
|
assert_1.default.deepEqual(json, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
160
376
|
assert_1.default.notEqual(json, tx.txData);
|
|
161
377
|
});
|
|
162
|
-
it('toBroadcastFormat should return a JSON string', function () {
|
|
378
|
+
it('toBroadcastFormat should return a REST API JSON string', function () {
|
|
163
379
|
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
164
380
|
const broadcast = tx.toBroadcastFormat();
|
|
165
381
|
assert_1.default.equal(typeof broadcast, 'string');
|
|
166
382
|
const parsed = JSON.parse(broadcast);
|
|
167
383
|
assert_1.default.equal(parsed.version, 0);
|
|
168
384
|
assert_1.default.equal(parsed.inputs.length, 1);
|
|
385
|
+
// REST API shape: inputs use previousOutpoint
|
|
386
|
+
assert_1.default.ok(parsed.inputs[0].previousOutpoint, 'inputs should use previousOutpoint');
|
|
387
|
+
assert_1.default.equal(parsed.inputs[0].transactionId, undefined, 'transactionId should not be at root of input');
|
|
388
|
+
// REST API shape: outputs use scriptPublicKey object
|
|
389
|
+
assert_1.default.equal(typeof parsed.outputs[0].scriptPublicKey, 'object');
|
|
390
|
+
assert_1.default.equal(parsed.outputs[0].scriptPublicKey.version, 0);
|
|
391
|
+
});
|
|
392
|
+
it('toBroadcastFormat should include required wire fields', function () {
|
|
393
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
394
|
+
const parsed = JSON.parse(tx.toBroadcastFormat());
|
|
395
|
+
assert_1.default.equal(parsed.lockTime, 0);
|
|
396
|
+
assert_1.default.equal(parsed.subnetworkId, '0000000000000000000000000000000000000000');
|
|
397
|
+
assert_1.default.equal(parsed.gas, 0);
|
|
398
|
+
assert_1.default.equal(parsed.payload, '');
|
|
169
399
|
});
|
|
170
|
-
it('
|
|
400
|
+
it('toBroadcastFormat should include signatureScript after signing', function () {
|
|
401
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
402
|
+
tx.sign(Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex'));
|
|
403
|
+
const parsed = JSON.parse(tx.toBroadcastFormat());
|
|
404
|
+
assert_1.default.ok(parsed.inputs[0].signatureScript.length > 0);
|
|
405
|
+
});
|
|
406
|
+
it('toHex should return hex-encoded internal JSON (for round-trips)', function () {
|
|
171
407
|
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
172
408
|
const hex = tx.toHex();
|
|
173
409
|
assert_1.default.ok(/^[0-9a-fA-F]+$/.test(hex));
|
|
174
|
-
const decoded = Buffer.from(hex, 'hex').toString();
|
|
175
|
-
|
|
176
|
-
assert_1.default.equal(
|
|
410
|
+
const decoded = JSON.parse(Buffer.from(hex, 'hex').toString());
|
|
411
|
+
// Internal format: transactionId at root of input (not previousOutpoint)
|
|
412
|
+
assert_1.default.equal(decoded.inputs[0].transactionId, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].transactionId);
|
|
413
|
+
assert_1.default.equal(decoded.inputs[0].amount, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].amount);
|
|
414
|
+
});
|
|
415
|
+
it('toHex and toBroadcastFormat produce different formats', function () {
|
|
416
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
417
|
+
const internalHex = tx.toHex();
|
|
418
|
+
const broadcastHex = Buffer.from(tx.toBroadcastFormat()).toString('hex');
|
|
419
|
+
assert_1.default.notEqual(internalHex, broadcastHex);
|
|
177
420
|
});
|
|
178
421
|
it('fromHex should reconstruct the transaction', function () {
|
|
179
422
|
const original = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
@@ -202,5 +445,42 @@ describe('Kaspa Transaction', function () {
|
|
|
202
445
|
assert_1.default.deepEqual(restored.signature, tx.signature);
|
|
203
446
|
});
|
|
204
447
|
});
|
|
448
|
+
describe('toBroadcastFormat (REST API shape)', function () {
|
|
449
|
+
it('should map inputs to previousOutpoint shape', function () {
|
|
450
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
451
|
+
const api = JSON.parse(tx.toBroadcastFormat());
|
|
452
|
+
assert_1.default.equal(api.inputs.length, 1);
|
|
453
|
+
assert_1.default.ok(api.inputs[0].previousOutpoint, 'input should have previousOutpoint');
|
|
454
|
+
assert_1.default.equal(api.inputs[0].previousOutpoint.transactionId, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].transactionId);
|
|
455
|
+
assert_1.default.equal(api.inputs[0].previousOutpoint.index, kaspa_fixtures_1.TRANSACTIONS.simple.inputs[0].transactionIndex);
|
|
456
|
+
});
|
|
457
|
+
it('should not include amount or scriptPublicKey on inputs', function () {
|
|
458
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
459
|
+
const api = JSON.parse(tx.toBroadcastFormat());
|
|
460
|
+
assert_1.default.equal(api.inputs[0].amount, undefined);
|
|
461
|
+
assert_1.default.equal(api.inputs[0].scriptPublicKey, undefined);
|
|
462
|
+
});
|
|
463
|
+
it('should map outputs to scriptPublicKey object shape', function () {
|
|
464
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
465
|
+
const api = JSON.parse(tx.toBroadcastFormat());
|
|
466
|
+
assert_1.default.equal(api.outputs.length, 1);
|
|
467
|
+
assert_1.default.equal(typeof api.outputs[0].scriptPublicKey, 'object');
|
|
468
|
+
assert_1.default.equal(api.outputs[0].scriptPublicKey.version, 0);
|
|
469
|
+
assert_1.default.ok(typeof api.outputs[0].scriptPublicKey.scriptPublicKey === 'string');
|
|
470
|
+
assert_1.default.equal(api.outputs[0].amount, Number(kaspa_fixtures_1.TRANSACTIONS.simple.outputs[0].amount));
|
|
471
|
+
});
|
|
472
|
+
it('should include signatureScript as empty string for unsigned inputs', function () {
|
|
473
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
|
|
474
|
+
const api = JSON.parse(tx.toBroadcastFormat());
|
|
475
|
+
assert_1.default.equal(api.inputs[0].signatureScript, '');
|
|
476
|
+
});
|
|
477
|
+
it('should handle multi-input transactions', function () {
|
|
478
|
+
const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
|
|
479
|
+
const api = JSON.parse(tx.toBroadcastFormat());
|
|
480
|
+
assert_1.default.equal(api.inputs.length, 2);
|
|
481
|
+
assert_1.default.equal(api.inputs[0].previousOutpoint.transactionId, kaspa_fixtures_1.TRANSACTIONS.multiInput.inputs[0].transactionId);
|
|
482
|
+
assert_1.default.equal(api.inputs[1].previousOutpoint.transactionId, kaspa_fixtures_1.TRANSACTIONS.multiInput.inputs[1].transactionId);
|
|
483
|
+
});
|
|
484
|
+
});
|
|
205
485
|
});
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJEQUF3RDtBQUN4RCxtREFBdUQ7QUFDdkQsbURBQW9EO0FBQ3BELCtEQUFnRTtBQUVoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7QUFFckIsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQ3BCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtZQUNqRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtZQUM1QyxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsNkJBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGtCQUFrQixFQUFFO1FBQzNCLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUMxQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRTtZQUNsRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDMUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxxQkFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUNmLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtZQUM1QyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLDZCQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM3RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakIsS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7Z0JBQzdFLGdCQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7WUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpRUFBaUUsRUFBRTtZQUNwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWdCLENBQUM7WUFDcEQsMkJBQTJCO1lBQzNCLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakMsaURBQWlEO1lBQ2pELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLHFCQUFXLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRTtZQUN2RCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELGdCQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLEVBQUUsQ0FBQyw0REFBNEQsRUFBRTtZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLG9DQUFvQztZQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRTtRQUN4QixFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixnQkFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1lBQ2xELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyx5QkFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsTUFBTSxRQUFRLEdBQUcseUJBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELGdCQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtZQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNsRCxNQUFNLFFBQVEsR0FBRyx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFO1lBQ2hFLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFakIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLHlCQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVoRCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgU0lHSEFTSF9BTEwgfSBmcm9tICcuLi8uLi9zcmMvbGliL3NpZ2hhc2gnO1xuaW1wb3J0IHsgS0VZUywgVFJBTlNBQ1RJT05TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBDT0lOID0gJ2thc3BhJztcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC5vayh0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnR4RGF0YS5pbnB1dHMsIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodHgudHhEYXRhLm91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGEgdHJhbnNhY3Rpb24gZnJvbSB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaWQgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGVuIG5vIGlkIGlzIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaWQgaWYgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlLCBpZDogJ2RlYWRiZWVmJyArICcwMCcucmVwZWF0KDMwKSB9O1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgdHhEYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgdHhEYXRhLmlkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hdHVyZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgc2lnbmF0dXJlcyBmb3IgdW5zaWduZWQgdHgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBhc3NlcnQub2soc2lncy5ldmVyeSgocykgPT4gcyA9PT0gJycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHNpZ25hdHVyZSBzY3JpcHRzIGFmdGVyIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQub2sodHguY2FuU2lnbih7IGtleTogS0VZUy5wcnYgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIG5vbi0zMi1ieXRlIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguc2lnbihCdWZmZXIuZnJvbSgnMDEwMicsICdoZXgnKSk7XG4gICAgICB9LCAvMzItYnl0ZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFsbCBpbnB1dHMgd2l0aCBhIHZhbGlkIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgeyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlIH0pO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdFYWNoIGlucHV0IHNob3VsZCBoYXZlIGEgc2lnbmF0dXJlU2NyaXB0Jyk7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQhLmxlbmd0aCA+IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIG11bHRpcGxlIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMik7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHR4LnR4RGF0YS5pbnB1dHMpIHtcbiAgICAgICAgYXNzZXJ0Lm9rKGlucHV0LnNpZ25hdHVyZVNjcmlwdCAmJiBpbnB1dC5zaWduYXR1cmVTY3JpcHQubGVuZ3RoID4gMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgNjUtYnl0ZSBzaWduYXR1cmVzICg2NCBTY2hub3JyICsgMSBzaWdoYXNoIHR5cGUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBzaWdIZXggPSB0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCE7XG4gICAgICAvLyA2NSBieXRlcyA9IDEzMCBoZXggY2hhcnNcbiAgICAgIGFzc2VydC5lcXVhbChzaWdIZXgubGVuZ3RoLCAxMzApO1xuICAgICAgLy8gTGFzdCBieXRlIGlzIHNpZ2hhc2ggdHlwZSAoMHgwMSA9IFNJR0hBU0hfQUxMKVxuICAgICAgY29uc3QgbGFzdEJ5dGUgPSBwYXJzZUludChzaWdIZXguc2xpY2UoLTIpLCAxNik7XG4gICAgICBhc3NlcnQuZXF1YWwobGFzdEJ5dGUsIFNJR0hBU0hfQUxMKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcmlmeVNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgdW5zaWduZWQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgYWZ0ZXIgc2lnbmluZyB3aXRoIG1hdGNoaW5nIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB4LW9ubHkgKDMyLWJ5dGUpIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHhPbmx5UHViID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKS5zbGljZSgxKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUoeE9ubHlQdWIsIDApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciB3cm9uZyBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCB3cm9uZ1B1YiA9IEJ1ZmZlci5mcm9tKCcwMicgKyAnYWInLnJlcGVhdCgzMiksICdoZXgnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC52ZXJpZnlTaWduYXR1cmUod3JvbmdQdWIsIDApLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igb3V0LW9mLXJhbmdlIGlucHV0IGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDk5KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZXhwbGFpblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB3aXRoIGNvcnJlY3QgZmllbGRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24uaWQsICcnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYW1vdW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHNbMF0uYW1vdW50LCAnMTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0aGUgZmVlIGFzIHRvdGFsSW4gLSB0b3RhbE91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIC8vIGZlZSA9IDEwMDAwMDAwMCAtIDk5OTk4MDAwID0gMjAwMFxuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLmZlZS5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1bSBhbGwgb3V0cHV0cyBpbiBvdXRwdXRBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCwgJzI5OTk5ODAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2VyaWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndG9Kc29uIHNob3VsZCByZXR1cm4gYSBjb3B5IG9mIHR4RGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChqc29uLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5ub3RFcXVhbChqc29uLCB0eC50eERhdGEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvQnJvYWRjYXN0Rm9ybWF0IHNob3VsZCByZXR1cm4gYSBKU09OIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgYnJvYWRjYXN0LCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGJyb2FkY2FzdCk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLnZlcnNpb24sIDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0hleCBzaG91bGQgcmV0dXJuIGhleC1lbmNvZGVkIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG4gICAgICBhc3NlcnQub2soL15bMC05YS1mQS1GXSskLy50ZXN0KGhleCkpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC52ZXJzaW9uLCAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tSGV4IHNob3VsZCByZWNvbnN0cnVjdCB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGhleCA9IG9yaWdpbmFsLnRvSGV4KCk7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoQ09JTiwgaGV4KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzdG9yZWQudG9Kc29uKCksIG9yaWdpbmFsLnRvSnNvbigpKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tSnNvbiBzaG91bGQgcmVjb25zdHJ1Y3QgZnJvbSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGpzb24gPSBvcmlnaW5hbC50b0pzb24oKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUpzb24oQ09JTiwganNvbik7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnRvSnNvbigpLCBqc29uKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tSnNvbiBzaG91bGQgcmVjb25zdHJ1Y3QgZnJvbSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbC50b0pzb24oKSk7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IFRyYW5zYWN0aW9uLmZyb21Kc29uKENPSU4sIGpzb25TdHIpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC50b0pzb24oKSwgb3JpZ2luYWwudG9Kc29uKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JvdW5kLXRyaXAgdGhyb3VnaCB0b0hleC9mcm9tSGV4IHNob3VsZCBwcmVzZXJ2ZSBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG5cbiAgICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoQ09JTiwgaGV4KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC5zaWduYXR1cmUsIHR4LnNpZ25hdHVyZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
486
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJEQUF3RDtBQUN4RCxtREFBdUQ7QUFDdkQsdURBQXNEO0FBQ3RELCtEQUFnRTtBQUVoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7QUFFckIsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0s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LElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUUvQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLDZCQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLDZCQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1RyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSw2QkFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFNJR0hBU0hfQUxMIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgS0VZUywgVFJBTlNBQ1RJT05TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBDT0lOID0gJ2thc3BhJztcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC5vayh0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnR4RGF0YS5pbnB1dHMsIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodHgudHhEYXRhLm91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGEgdHJhbnNhY3Rpb24gZnJvbSB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaWQgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGVuIG5vIGlkIGlzIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaWQgaWYgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlLCBpZDogJ2RlYWRiZWVmJyArICcwMCcucmVwZWF0KDMwKSB9O1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgdHhEYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgdHhEYXRhLmlkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hdHVyZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgc2lnbmF0dXJlcyBmb3IgdW5zaWduZWQgdHgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBhc3NlcnQub2soc2lncy5ldmVyeSgocykgPT4gcyA9PT0gJycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHNpZ25hdHVyZSBzY3JpcHRzIGFmdGVyIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQub2sodHguY2FuU2lnbih7IGtleTogS0VZUy5wcnYgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIG5vbi0zMi1ieXRlIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguc2lnbihCdWZmZXIuZnJvbSgnMDEwMicsICdoZXgnKSk7XG4gICAgICB9LCAvMzItYnl0ZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFsbCBpbnB1dHMgd2l0aCBhIHZhbGlkIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgeyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlIH0pO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdFYWNoIGlucHV0IHNob3VsZCBoYXZlIGEgc2lnbmF0dXJlU2NyaXB0Jyk7XG4gICAgICAgIGFzc2VydC5vaygoaW5wdXQuc2lnbmF0dXJlU2NyaXB0IGFzIHN0cmluZykubGVuZ3RoID4gMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpZ24gbXVsdGlwbGUgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXQpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdHgudHhEYXRhLmlucHV0cykge1xuICAgICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0ICYmIGlucHV0LnNpZ25hdHVyZVNjcmlwdC5sZW5ndGggPiAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSA2NS1ieXRlIHNpZ25hdHVyZXMgKDY0IFNjaG5vcnIgKyAxIHNpZ2hhc2ggdHlwZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ0hleCA9IHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnO1xuICAgICAgLy8gNjYgYnl0ZXMgPSAxMzIgaGV4IGNoYXJzOiAweDQxIHB1c2ggb3Bjb2RlICgxKSArIDY0LWJ5dGUgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ0hleC5sZW5ndGgsIDEzMik7XG4gICAgICAvLyBMYXN0IGJ5dGUgaXMgc2lnaGFzaCB0eXBlICgweDAxID0gU0lHSEFTSF9BTEwpXG4gICAgICBjb25zdCBsYXN0Qnl0ZSA9IHBhcnNlSW50KHNpZ0hleC5zbGljZSgtMiksIDE2KTtcbiAgICAgIGFzc2VydC5lcXVhbChsYXN0Qnl0ZSwgU0lHSEFTSF9BTEwpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVyaWZ5U2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciB1bnNpZ25lZCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBhZnRlciBzaWduaW5nIHdpdGggbWF0Y2hpbmcga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHgtb25seSAoMzItYnl0ZSkgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3QgeE9ubHlQdWIgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpLnNsaWNlKDEpO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZSh4T25seVB1YiwgMCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIHdyb25nIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHdyb25nUHViID0gQnVmZmVyLmZyb20oJzAyJyArICdhYicucmVwZWF0KDMyKSwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnZlcmlmeVNpZ25hdHVyZSh3cm9uZ1B1YiwgMCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBvdXQtb2YtcmFuZ2UgaW5wdXQgaW5kZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgOTkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIOKUgOKUgCBFQ0RTQSAodjEgYWRkcmVzcykgc2lnbmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgdGVzdHMgY292ZXIgdGhlIGF1dG8tZGV0ZWN0aW9uIHBhdGggaW4gc2lnbigpIC8gdmVyaWZ5U2lnbmF0dXJlKCkgL1xuICAvLyBzaWduYWJsZVBheWxvYWRzIHdoZW4gdGhlIGlucHV0J3Mgc2NyaXB0UHVibGljS2V5IGVuZHMgd2l0aCAweEFCIChFQ0RTQSkuXG5cbiAgZGVzY3JpYmUoJ3NpZ24gKEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGEgc2luZ2xlIEVDRFNBIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZUVjZHNhKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ1NjcmlwdCA9IHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ1NjcmlwdC5sZW5ndGggPiAwLCAnRUNEU0EgaW5wdXQgc2hvdWxkIGhhdmUgYSBzaWduYXR1cmVTY3JpcHQnKTtcbiAgICAgIC8vIDY2IGJ5dGVzID0gMTMyIGhleCBjaGFyczogMHg0MSArIDY0LWJ5dGUgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ1NjcmlwdC5sZW5ndGgsIDEzMik7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VJbnQoc2lnU2NyaXB0LnNsaWNlKC0yKSwgMTYpLCBTSUdIQVNIX0FMTCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpZ24gbXVsdGlwbGUgRUNEU0EgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXRFY2RzYSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQgJiYgaW5wdXQuc2lnbmF0dXJlU2NyaXB0Lmxlbmd0aCA+IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGRpc3RpbmN0IHNpZ2hhc2hlcyBmb3IgRUNEU0EgdnMgU2Nobm9yciBpbnB1dHMgb24gdGhlIHNhbWUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2Nobm9yclR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZWNkc2FUeCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlRWNkc2EpO1xuICAgICAgY29uc3QgW3NjaG5vcnJIYXNoXSA9IHNjaG5vcnJUeC5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgY29uc3QgW2VjZHNhSGFzaF0gPSBlY2RzYVR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQub2soIXNjaG5vcnJIYXNoLmVxdWFscyhlY2RzYUhhc2gpLCAnRUNEU0EgYW5kIFNjaG5vcnIgaGFzaGVzIG11c3QgZGlmZmVyJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlTaWduYXR1cmUgKEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBFQ0RTQSBzaWduYXR1cmUgd2l0aCBjb21wcmVzc2VkIHB1YmtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGVFY2RzYSk7XG4gICAgICB0eC5zaWduKEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4JykpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSwgJ0VDRFNBIHNpZ25hdHVyZSBzaG91bGQgdmVyaWZ5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igd3JvbmcgcHVibGljIGtleSBvbiBFQ0RTQSBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGVFY2RzYSk7XG4gICAgICB0eC5zaWduKEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4JykpO1xuICAgICAgY29uc3Qgd3JvbmdQdWIgPSBCdWZmZXIuZnJvbSgnMDInICsgJ2FiJy5yZXBlYXQoMzIpLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHdyb25nUHViLCAwKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYWxsIGlucHV0cyBpbiBhIG11bHRpLWlucHV0IEVDRFNBIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXRFY2RzYSk7XG4gICAgICB0eC5zaWduKEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4JykpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSk7XG4gICAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbiArIHZlcmlmeVNpZ25hdHVyZSAobWl4ZWQgU2Nobm9yciArIEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGFuZCB2ZXJpZnkgZWFjaCBpbnB1dCB3aXRoIHRoZSBjb3JyZWN0IGFsZ29yaXRobScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5taXhlZFNjaG5vcnJFY2RzYSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMiwgJ3Nob3VsZCBoYXZlIDIgaW5wdXRzJyk7XG5cbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICAvLyBpbnB1dFswXSBpcyBTY2hub3JyIChzY3JpcHRQdWJsaWNLZXkgZW5kcyAweEFDKVxuICAgICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApLCAnU2Nobm9yciBpbnB1dFswXSBzaG91bGQgdmVyaWZ5Jyk7XG4gICAgICAvLyBpbnB1dFsxXSBpcyBFQ0RTQSAoc2NyaXB0UHVibGljS2V5IGVuZHMgMHhBQilcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAxKSwgJ0VDRFNBIGlucHV0WzFdIHNob3VsZCB2ZXJpZnknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBkaWZmZXJlbnQgc2NyaXB0IHR5cGVzIGZvciBTY2hub3JyIGFuZCBFQ0RTQSBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubWl4ZWRTY2hub3JyRWNkc2EpO1xuICAgICAgdHguc2lnbihCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpKTtcbiAgICAgIC8vIEJvdGggcHJvZHVjZSA2Ni1ieXRlICgxMzIgaGV4IGNoYXIpIHNjcmlwdFNpZ3MgYnV0IHZpYSBkaWZmZXJlbnQgYWxnb3JpdGhtcyDigJRcbiAgICAgIC8vIHRoZSBsYXN0IG9wY29kZSBvZiB0aGVpciBzY3JpcHRQdWJsaWNLZXkgaXMgdGhlIGRpZmZlcmVudGlhdG9yLlxuICAgICAgYXNzZXJ0LmVxdWFsKCh0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykubGVuZ3RoLCAxMzIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKCh0eC50eERhdGEuaW5wdXRzWzFdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykubGVuZ3RoLCAxMzIpO1xuICAgICAgLy8gVGhlIHNpZ25hdHVyZXMgdGhlbXNlbHZlcyBzaG91bGQgZGlmZmVyIChkaWZmZXJlbnQgc2lnaGFzaCBhbGdvcml0aG0pXG4gICAgICBhc3NlcnQubm90RXF1YWwodHgudHhEYXRhLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQsIHR4LnR4RGF0YS5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hYmxlUGF5bG9hZHMgKEVDRFNBIGlucHV0cyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSAzMi1ieXRlIGhhc2ggZm9yIGEgc2luZ2xlIEVDRFNBIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZUVjZHNhKTtcbiAgICAgIGNvbnN0IFtoYXNoXSA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQub2soQnVmZmVyLmlzQnVmZmVyKGhhc2gpKTtcbiAgICAgIGFzc2VydC5lcXVhbChoYXNoLmxlbmd0aCwgMzIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGlzdGluY3QgaGFzaGVzIGZvciBlYWNoIEVDRFNBIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXRFY2RzYSk7XG4gICAgICBjb25zdCBbaDAsIGgxXSA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQub2soIWgwLmVxdWFscyhoMSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGlmZmVyZW50IGhhc2hlcyBmb3IgU2Nobm9yciBhbmQgRUNEU0EgaW5wdXRzIG9uIHRoZSBzYW1lIGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2Nobm9yclR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZWNkc2FUeCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlRWNkc2EpO1xuICAgICAgLy8gQm90aCB0cmFuc2FjdGlvbnMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgZXhjZXB0IHNjcmlwdFB1YmxpY0tleSB0eXBlLlxuICAgICAgLy8gVGhlIEVDRFNBIGhhc2ggYXBwbGllcyBhbiBhZGRpdGlvbmFsIFNIQTI1NiBzdGVwIHNvIHRoZSByZXN1bHQgbXVzdCBkaWZmZXIuXG4gICAgICBhc3NlcnQub2soIXNjaG5vcnJUeC5zaWduYWJsZVBheWxvYWRzWzBdLmVxdWFscyhlY2RzYVR4LnNpZ25hYmxlUGF5bG9hZHNbMF0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaXhlZCB0eDogU2Nobm9yciBoYXNoIGF0IGluZGV4IDAsIEVDRFNBIGhhc2ggYXQgaW5kZXggMSDigJQgYm90aCAzMiBieXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5taXhlZFNjaG5vcnJFY2RzYSk7XG4gICAgICBjb25zdCBbaDAsIGgxXSA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQuZXF1YWwoaDAubGVuZ3RoLCAzMik7XG4gICAgICBhc3NlcnQuZXF1YWwoaDEubGVuZ3RoLCAzMik7XG4gICAgICBhc3NlcnQub2soIWgwLmVxdWFscyhoMSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZXhwbGFpblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB3aXRoIGNvcnJlY3QgZmllbGRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24uaWQsICcnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYW1vdW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHNbMF0uYW1vdW50LCAnMTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0aGUgZmVlIGFzIHRvdGFsSW4gLSB0b3RhbE91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIC8vIGZlZSA9IDEwMDAwMDAwMCAtIDk5OTk4MDAwID0gMjAwMFxuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLmZlZS5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1bSBhbGwgb3V0cHV0cyBpbiBvdXRwdXRBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCwgJzI5OTk5ODAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmVlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGxpY2l0IGZlZSB3aGVuIHNldCBpbiB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbXB1dGUgZmVlIGZyb20gaW5wdXRzIC0gb3V0cHV0cyB3aGVuIGZlZSBpcyBub3Qgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlIH07XG4gICAgICBkZWxldGUgdHhEYXRhLmZlZTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIHR4RGF0YSk7XG4gICAgICAvLyBpbnB1dDogMTAwMDAwMDAwLCBvdXRwdXQ6IDk5OTk4MDAwLCBmZWUgPSAyMDAwXG4gICAgICBhc3NlcnQuZXF1YWwodHguZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbmFibGVQYXlsb2FkcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBvbmUgQnVmZmVyIHBlciBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcGF5bG9hZHMgPSB0eC5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBheWxvYWRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQub2soQnVmZmVyLmlzQnVmZmVyKHBheWxvYWRzWzBdKSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGF5bG9hZHNbMF0ubGVuZ3RoLCAzMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0d28gQnVmZmVycyBmb3IgYSB0d28taW5wdXQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBwYXlsb2FkcyA9IHR4LnNpZ25hYmxlUGF5bG9hZHM7XG4gICAgICBhc3NlcnQuZXF1YWwocGF5bG9hZHMubGVuZ3RoLCAyKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwYXlsb2Fkcykge1xuICAgICAgICBhc3NlcnQub2soQnVmZmVyLmlzQnVmZmVyKHApKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHAubGVuZ3RoLCAzMik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBkaXN0aW5jdCBoYXNoZXMgZm9yIGVhY2ggaW5wdXQgaW4gYSBtdWx0aS1pbnB1dCB0eCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IFtwMCwgcDFdID0gdHguc2lnbmFibGVQYXlsb2FkcztcbiAgICAgIGFzc2VydC5vayghcDAuZXF1YWxzKHAxKSwgJ3Blci1pbnB1dCBzaWdoYXNoZXMgbXVzdCBkaWZmZXIgKGVhY2ggY29tbWl0cyB0byBpdHMgb3duIGluZGV4KScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRyYW5zYWN0aW9uIGhhcyBubyBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eC5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgfSwgL25vIGlucHV0cy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBkZXRlcm1pbmlzdGljIGZvciB0aGUgc2FtZSB0cmFuc2FjdGlvbiBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHgxID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHR4MiA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBbYTAsIGExXSA9IHR4MS5zaWduYWJsZVBheWxvYWRzO1xuICAgICAgY29uc3QgW2IwLCBiMV0gPSB0eDIuc2lnbmFibGVQYXlsb2FkcztcbiAgICAgIGFzc2VydC5vayhhMC5lcXVhbHMoYjApKTtcbiAgICAgIGFzc2VydC5vayhhMS5lcXVhbHMoYjEpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZFNpZ25hdHVyZUZvcklucHV0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgd3JpdGUgdGhlIHNpZ25hdHVyZSBvbmx5IHRvIHRoZSBzcGVjaWZpZWQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBmYWtlU2lnID0gQnVmZmVyLmFsbG9jKDY0LCAweGFhKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDAsIEtFWVMucHViLCBmYWtlU2lnKTtcblxuICAgICAgYXNzZXJ0Lm9rKHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCAnaW5wdXRbMF0gc2hvdWxkIGJlIHNpZ25lZCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0LCB1bmRlZmluZWQsICdpbnB1dFsxXSBzaG91bGQgcmVtYWluIHVuc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdyaXRlIGRpZmZlcmVudCBzaWduYXR1cmVzIHRvIGRpZmZlcmVudCBpbnB1dHMgaW5kZXBlbmRlbnRseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHNpZzAgPSBCdWZmZXIuYWxsb2MoNjQsIDB4YWEpO1xuICAgICAgY29uc3Qgc2lnMSA9IEJ1ZmZlci5hbGxvYyg2NCwgMHhiYik7XG5cbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDAsIEtFWVMucHViLCBzaWcwKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDEsIEtFWVMucHViLCBzaWcxKTtcblxuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKFxuICAgICAgICB0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCxcbiAgICAgICAgdHgudHhEYXRhLmlucHV0c1sxXS5zaWduYXR1cmVTY3JpcHQsXG4gICAgICAgICdlYWNoIGlucHV0IHNob3VsZCBjYXJyeSBpdHMgb3duIHNpZ25hdHVyZSBzY3JpcHQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgNjYtYnl0ZSBzY3JpcHQgKHB1c2ggb3Bjb2RlICsgNjQgc2lnICsgMSBzaWdoYXNoIHR5cGUpIGZvciB0aGUgdGFyZ2V0IGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLm11bHRpSW5wdXQpO1xuICAgICAgdHguYWRkU2lnbmF0dXJlRm9ySW5wdXQoMSwgS0VZUy5wdWIsIEJ1ZmZlci5hbGxvYyg2NCwgMHhjYykpO1xuICAgICAgLy8gNjYgYnl0ZXMgPSAxMzIgaGV4IGNoYXJzOiAweDQxIHB1c2ggb3Bjb2RlICsgNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlXG4gICAgICBhc3NlcnQuZXF1YWwoKHR4LnR4RGF0YS5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnKS5sZW5ndGgsIDEzMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGVuZCBTSUdIQVNIX0FMTCBieXRlIGJ5IGRlZmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIHR4LmFkZFNpZ25hdHVyZUZvcklucHV0KDAsIEtFWVMucHViLCBCdWZmZXIuYWxsb2MoNjQsIDB4ZGQpKTtcbiAgICAgIGNvbnN0IGxhc3RCeXRlID0gcGFyc2VJbnQoKHR4LnR4RGF0YS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0ID8/ICcnKS5zbGljZSgtMiksIDE2KTtcbiAgICAgIGFzc2VydC5lcXVhbChsYXN0Qnl0ZSwgU0lHSEFTSF9BTEwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmVyaWZpYWJsZSBzaWduYXR1cmUgd2hlbiBnaXZlbiB0aGUgY29ycmVjdCBTY2hub3JyIHNpZyBmb3IgdGhhdCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuXG4gICAgICAvLyBzaWduKCkgY29tcHV0ZXMgdGhlIGNvcnJlY3QgcGVyLWlucHV0IHNpZ2hhc2ggaW50ZXJuYWxseVxuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIC8vIFNraXAgdGhlIGxlYWRpbmcgMHg0MSBwdXNoIG9wY29kZSAoMiBoZXggY2hhcnMpLCByZWFkIHRoZSBuZXh0IDY0IGJ5dGVzICgxMjggaGV4IGNoYXJzKVxuICAgICAgY29uc3Qgc2lnMCA9IEJ1ZmZlci5mcm9tKCh0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykuc2xpY2UoMiwgMTMwKSwgJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnMSA9IEJ1ZmZlci5mcm9tKCh0eC50eERhdGEuaW5wdXRzWzFdLnNpZ25hdHVyZVNjcmlwdCA/PyAnJykuc2xpY2UoMiwgMTMwKSwgJ2hleCcpO1xuXG4gICAgICAvLyBSZWJ1aWxkIHVuc2lnbmVkIGFuZCBhcHBseSB2aWEgYWRkU2lnbmF0dXJlRm9ySW5wdXRcbiAgICAgIGNvbnN0IHR4MiA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICB0eDIuYWRkU2lnbmF0dXJlRm9ySW5wdXQoMCwgS0VZUy5wdWIsIHNpZzApO1xuICAgICAgdHgyLmFkZFNpZ25hdHVyZUZvcklucHV0KDEsIEtFWVMucHViLCBzaWcxKTtcblxuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eDIudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksICdpbnB1dFswXSBzaWduYXR1cmUgc2hvdWxkIHZlcmlmeScpO1xuICAgICAgYXNzZXJ0Lm9rKHR4Mi52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAxKSwgJ2lucHV0WzFdIHNpZ25hdHVyZSBzaG91bGQgdmVyaWZ5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBhbiBvdXQtb2YtcmFuZ2UgaW5kZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eC5hZGRTaWduYXR1cmVGb3JJbnB1dCg1LCBLRVlTLnB1YiwgQnVmZmVyLmFsbG9jKDY0KSk7XG4gICAgICB9LCAvb3V0IG9mIHJhbmdlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBhIG5lZ2F0aXZlIGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguYWRkU2lnbmF0dXJlRm9ySW5wdXQoLTEsIEtFWVMucHViLCBCdWZmZXIuYWxsb2MoNjQpKTtcbiAgICAgIH0sIC9vdXQgb2YgcmFuZ2UvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGEgbm9uLTY0LWJ5dGUgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguYWRkU2lnbmF0dXJlRm9ySW5wdXQoMCwgS0VZUy5wdWIsIEJ1ZmZlci5hbGxvYygzMikpO1xuICAgICAgfSwgLzY0LWJ5dGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NlcmlhbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3RvSnNvbiBzaG91bGQgcmV0dXJuIGEgY29weSBvZiB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoanNvbiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQubm90RXF1YWwoanNvbiwgdHgudHhEYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgcmV0dXJuIGEgUkVTVCBBUEkgSlNPTiBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGJyb2FkY2FzdCwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShicm9hZGNhc3QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC52ZXJzaW9uLCAwKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWQuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICAvLyBSRVNUIEFQSSBzaGFwZTogaW5wdXRzIHVzZSBwcmV2aW91c091dHBvaW50XG4gICAgICBhc3NlcnQub2socGFyc2VkLmlucHV0c1swXS5wcmV2aW91c091dHBvaW50LCAnaW5wdXRzIHNob3VsZCB1c2UgcHJldmlvdXNPdXRwb2ludCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5pbnB1dHNbMF0udHJhbnNhY3Rpb25JZCwgdW5kZWZpbmVkLCAndHJhbnNhY3Rpb25JZCBzaG91bGQgbm90IGJlIGF0IHJvb3Qgb2YgaW5wdXQnKTtcbiAgICAgIC8vIFJFU1QgQVBJIHNoYXBlOiBvdXRwdXRzIHVzZSBzY3JpcHRQdWJsaWNLZXkgb2JqZWN0XG4gICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIHBhcnNlZC5vdXRwdXRzWzBdLnNjcmlwdFB1YmxpY0tleSwgJ29iamVjdCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5vdXRwdXRzWzBdLnNjcmlwdFB1YmxpY0tleS52ZXJzaW9uLCAwKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgaW5jbHVkZSByZXF1aXJlZCB3aXJlIGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWQubG9ja1RpbWUsIDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5zdWJuZXR3b3JrSWQsICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLmdhcywgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLnBheWxvYWQsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgaW5jbHVkZSBzaWduYXR1cmVTY3JpcHQgYWZ0ZXIgc2lnbmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgdHguc2lnbihCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQub2socGFyc2VkLmlucHV0c1swXS5zaWduYXR1cmVTY3JpcHQubGVuZ3RoID4gMCk7XG4gICAgfSk7XG5cbiAgICBpdCgndG9IZXggc2hvdWxkIHJldHVybiBoZXgtZW5jb2RlZCBpbnRlcm5hbCBKU09OIChmb3Igcm91bmQtdHJpcHMpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuICAgICAgYXNzZXJ0Lm9rKC9eWzAtOWEtZkEtRl0rJC8udGVzdChoZXgpKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpLnRvU3RyaW5nKCkpO1xuICAgICAgLy8gSW50ZXJuYWwgZm9ybWF0OiB0cmFuc2FjdGlvbklkIGF0IHJvb3Qgb2YgaW5wdXQgKG5vdCBwcmV2aW91c091dHBvaW50KVxuICAgICAgYXNzZXJ0LmVxdWFsKGRlY29kZWQuaW5wdXRzWzBdLnRyYW5zYWN0aW9uSWQsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzWzBdLnRyYW5zYWN0aW9uSWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlY29kZWQuaW5wdXRzWzBdLmFtb3VudCwgVFJBTlNBQ1RJT05TLnNpbXBsZS5pbnB1dHNbMF0uYW1vdW50KTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0hleCBhbmQgdG9Ccm9hZGNhc3RGb3JtYXQgcHJvZHVjZSBkaWZmZXJlbnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgaW50ZXJuYWxIZXggPSB0eC50b0hleCgpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0SGV4ID0gQnVmZmVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKGludGVybmFsSGV4LCBicm9hZGNhc3RIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21IZXggc2hvdWxkIHJlY29uc3RydWN0IHRoZSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgaGV4ID0gb3JpZ2luYWwudG9IZXgoKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChDT0lOLCBoZXgpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC50b0pzb24oKSwgb3JpZ2luYWwudG9Kc29uKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21Kc29uIHNob3VsZCByZWNvbnN0cnVjdCBmcm9tIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvbiA9IG9yaWdpbmFsLnRvSnNvbigpO1xuICAgICAgY29uc3QgcmVzdG9yZWQgPSBUcmFuc2FjdGlvbi5mcm9tSnNvbihDT0lOLCBqc29uKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzdG9yZWQudG9Kc29uKCksIGpzb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21Kc29uIHNob3VsZCByZWNvbnN0cnVjdCBmcm9tIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsLnRvSnNvbigpKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUpzb24oQ09JTiwganNvblN0cik7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnRvSnNvbigpLCBvcmlnaW5hbC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcCB0aHJvdWdoIHRvSGV4L2Zyb21IZXggc2hvdWxkIHByZXNlcnZlIHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcblxuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChDT0lOLCBoZXgpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnNpZ25hdHVyZSwgdHguc2lnbmF0dXJlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvQnJvYWRjYXN0Rm9ybWF0IChSRVNUIEFQSSBzaGFwZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBtYXAgaW5wdXRzIHRvIHByZXZpb3VzT3V0cG9pbnQgc2hhcGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGFwaSA9IEpTT04ucGFyc2UodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChhcGkuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQub2soYXBpLmlucHV0c1swXS5wcmV2aW91c091dHBvaW50LCAnaW5wdXQgc2hvdWxkIGhhdmUgcHJldmlvdXNPdXRwb2ludCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0ucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLCBUUkFOU0FDVElPTlMuc2ltcGxlLmlucHV0c1swXS50cmFuc2FjdGlvbklkKTtcbiAgICAgIGFzc2VydC5lcXVhbChhcGkuaW5wdXRzWzBdLnByZXZpb3VzT3V0cG9pbnQuaW5kZXgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzWzBdLnRyYW5zYWN0aW9uSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgaW5jbHVkZSBhbW91bnQgb3Igc2NyaXB0UHVibGljS2V5IG9uIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgYXBpID0gSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0uYW1vdW50LCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0uc2NyaXB0UHVibGljS2V5LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXAgb3V0cHV0cyB0byBzY3JpcHRQdWJsaWNLZXkgb2JqZWN0IHNoYXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBhcGkgPSBKU09OLnBhcnNlKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgYXBpLm91dHB1dHNbMF0uc2NyaXB0UHVibGljS2V5LCAnb2JqZWN0Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLm91dHB1dHNbMF0uc2NyaXB0UHVibGljS2V5LnZlcnNpb24sIDApO1xuICAgICAgYXNzZXJ0Lm9rKHR5cGVvZiBhcGkub3V0cHV0c1swXS5zY3JpcHRQdWJsaWNLZXkuc2NyaXB0UHVibGljS2V5ID09PSAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLm91dHB1dHNbMF0uYW1vdW50LCBOdW1iZXIoVFJBTlNBQ1RJT05TLnNpbXBsZS5vdXRwdXRzWzBdLmFtb3VudCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHNpZ25hdHVyZVNjcmlwdCBhcyBlbXB0eSBzdHJpbmcgZm9yIHVuc2lnbmVkIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgYXBpID0gSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aS1pbnB1dCB0cmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBhcGkgPSBKU09OLnBhcnNlKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFwaS5pbnB1dHNbMF0ucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dC5pbnB1dHNbMF0udHJhbnNhY3Rpb25JZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXBpLmlucHV0c1sxXS5wcmV2aW91c091dHBvaW50LnRyYW5zYWN0aW9uSWQsIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0LmlucHV0c1sxXS50cmFuc2FjdGlvbklkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|