@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.
Files changed (49) hide show
  1. package/README.md +224 -33
  2. package/dist/src/kaspa.d.ts +86 -18
  3. package/dist/src/kaspa.d.ts.map +1 -1
  4. package/dist/src/kaspa.js +119 -31
  5. package/dist/src/lib/constants.d.ts +38 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +56 -5
  8. package/dist/src/lib/iface.d.ts +28 -17
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +2 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/keyPair.d.ts +6 -2
  15. package/dist/src/lib/keyPair.d.ts.map +1 -1
  16. package/dist/src/lib/keyPair.js +7 -4
  17. package/dist/src/lib/pskt.d.ts +257 -0
  18. package/dist/src/lib/pskt.d.ts.map +1 -0
  19. package/dist/src/lib/pskt.js +439 -0
  20. package/dist/src/lib/sighash.d.ts +34 -13
  21. package/dist/src/lib/sighash.d.ts.map +1 -1
  22. package/dist/src/lib/sighash.js +115 -56
  23. package/dist/src/lib/transaction.d.ts +94 -6
  24. package/dist/src/lib/transaction.d.ts.map +1 -1
  25. package/dist/src/lib/transaction.js +199 -21
  26. package/dist/src/lib/transactionBuilder.d.ts +22 -0
  27. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/transactionBuilder.js +53 -5
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +8 -3
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  31. package/dist/src/lib/transactionBuilderFactory.js +14 -4
  32. package/dist/src/lib/utils.d.ts +17 -3
  33. package/dist/src/lib/utils.d.ts.map +1 -1
  34. package/dist/src/lib/utils.js +45 -11
  35. package/dist/src/register.js +2 -2
  36. package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
  37. package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
  38. package/dist/test/fixtures/kaspa.fixtures.js +76 -11
  39. package/dist/test/unit/coin.test.js +129 -9
  40. package/dist/test/unit/keyPair.test.js +35 -1
  41. package/dist/test/unit/pskt.test.d.ts +15 -0
  42. package/dist/test/unit/pskt.test.d.ts.map +1 -0
  43. package/dist/test/unit/pskt.test.js +383 -0
  44. package/dist/test/unit/transaction.test.js +291 -11
  45. package/dist/test/unit/transactionBuilder.test.js +16 -3
  46. package/dist/test/unit/transactionFlow.test.js +67 -2
  47. package/dist/test/unit/utils.test.js +63 -4
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. 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 sighash_1 = require("../../src/lib/sighash");
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
- // 65 bytes = 130 hex chars
91
- assert_1.default.equal(sigHex.length, 130);
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, sighash_1.SIGHASH_ALL);
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('toHex should return hex-encoded JSON', function () {
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
- const parsed = JSON.parse(decoded);
176
- assert_1.default.equal(parsed.version, 0);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJEQUF3RDtBQUN4RCxtREFBdUQ7QUFDdkQsbURBQW9EO0FBQ3BELCtEQUFnRTtBQUVoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7QUFFckIsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0s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TyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVoRCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgU0lHSEFTSF9BTEwgfSBmcm9tICcuLi8uLi9zcmMvbGliL3NpZ2hhc2gnO1xuaW1wb3J0IHsgS0VZUywgVFJBTlNBQ1RJT05TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBDT0lOID0gJ2thc3BhJztcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC5vayh0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnR4RGF0YS5pbnB1dHMsIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodHgudHhEYXRhLm91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGEgdHJhbnNhY3Rpb24gZnJvbSB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaWQgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGVuIG5vIGlkIGlzIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaWQgaWYgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlLCBpZDogJ2RlYWRiZWVmJyArICcwMCcucmVwZWF0KDMwKSB9O1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgdHhEYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgdHhEYXRhLmlkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hdHVyZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgc2lnbmF0dXJlcyBmb3IgdW5zaWduZWQgdHgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBhc3NlcnQub2soc2lncy5ldmVyeSgocykgPT4gcyA9PT0gJycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHNpZ25hdHVyZSBzY3JpcHRzIGFmdGVyIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQub2sodHguY2FuU2lnbih7IGtleTogS0VZUy5wcnYgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIG5vbi0zMi1ieXRlIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+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==