@bitgo/abstract-utxo 10.11.1 → 10.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,8 +43,9 @@ const secp256k1_1 = require("@bitgo/secp256k1");
43
43
  const unspents_1 = require("@bitgo/unspents");
44
44
  const sdk_core_1 = require("@bitgo/sdk-core");
45
45
  const sdk_api_1 = require("@bitgo/sdk-api");
46
- const signLegacyTransaction_1 = require("../transaction/fixedScript/signLegacyTransaction");
47
- const { unspentSum, scriptTypeForChain, outputScripts } = utxolib.bitgo;
46
+ const signPsbt_1 = require("../transaction/fixedScript/signPsbt");
47
+ const psbt_1 = require("./psbt");
48
+ const { unspentSum } = utxolib.bitgo;
48
49
  async function getWallet(bitgo, coin, walletId) {
49
50
  try {
50
51
  return await coin.wallets().get({ id: walletId });
@@ -274,90 +275,75 @@ async function getPrv(xprv, passphrase, wallet) {
274
275
  return getPrv((0, sdk_api_1.decrypt)(passphrase, encryptedPrv));
275
276
  }
276
277
  /**
278
+ * Create a sweep transaction for cross-chain recovery using PSBT (utxolib implementation)
277
279
  * @param network
280
+ * @param walletKeys
278
281
  * @param unspents
279
282
  * @param targetAddress
280
283
  * @param feeRateSatVB
281
- * @param signer - if set, sign transaction
282
- * @param amountType
283
- * @return transaction spending full input amount to targetAddress
284
+ * @return unsigned PSBT
284
285
  */
285
- function createSweepTransaction(network, unspents, targetAddress, feeRateSatVB, signer, amountType = 'number') {
286
- const inputValue = unspentSum(unspents, amountType);
286
+ function createSweepTransactionUtxolib(network, walletKeys, unspents, targetAddress, feeRateSatVB) {
287
+ const inputValue = unspentSum(unspents.map((u) => ({ ...u, value: BigInt(u.value) })), 'bigint');
287
288
  const vsize = unspents_1.Dimensions.fromUnspents(unspents, {
288
289
  p2tr: { scriptPathLevel: 1 },
289
290
  p2trMusig2: { scriptPathLevel: undefined },
290
291
  })
291
292
  .plus(unspents_1.Dimensions.fromOutput({ script: utxolib.address.toOutputScript(targetAddress, network) }))
292
293
  .getVSize();
293
- const fee = vsize * feeRateSatVB;
294
- const transactionBuilder = utxolib.bitgo.createTransactionBuilderForNetwork(network);
295
- transactionBuilder.addOutput(targetAddress, utxolib.bitgo.toTNumber(BigInt(inputValue) - BigInt(fee), amountType));
294
+ const fee = BigInt(Math.round(vsize * feeRateSatVB));
295
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
296
+ utxolib.bitgo.addXpubsToPsbt(psbt, walletKeys);
296
297
  unspents.forEach((unspent) => {
297
- utxolib.bitgo.addToTransactionBuilder(transactionBuilder, unspent);
298
- });
299
- let transaction = transactionBuilder.buildIncomplete();
300
- if (signer) {
301
- transaction = (0, signLegacyTransaction_1.signAndVerifyWalletTransaction)(transactionBuilder, unspents, signer, {
302
- isLastSignature: false,
303
- });
304
- }
305
- return transaction;
306
- }
307
- function getTxInfo(transaction, unspents, walletId, walletKeys, amountType = 'number') {
308
- const inputAmount = utxolib.bitgo.unspentSum(unspents, amountType);
309
- const outputAmount = utxolib.bitgo.toTNumber(transaction.outs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), amountType);
310
- const outputs = transaction.outs.map((o) => ({
311
- address: utxolib.address.fromOutputScript(o.script, transaction.network),
312
- valueString: o.value.toString(),
313
- change: false,
314
- }));
315
- const inputs = unspents.map((u) => {
316
- // NOTE:
317
- // The `redeemScript` and `walletScript` properties are required for legacy versions of BitGoJS
318
- // which might require these scripts for signing. The Wallet Recovery Wizard (WRW) can create
319
- // unsigned prebuilds that are submitted to BitGoJS instances which are not necessarily the same
320
- // version.
321
- const addressKeys = walletKeys.deriveForChainAndIndex(u.chain, u.index);
322
- const scriptType = scriptTypeForChain(u.chain);
323
- const { redeemScript, witnessScript } = outputScripts.createOutputScript2of3(addressKeys.publicKeys, scriptType);
324
- return {
325
- ...u,
326
- wallet: walletId,
327
- fromWallet: walletId,
328
- redeemScript: redeemScript?.toString('hex'),
329
- witnessScript: witnessScript?.toString('hex'),
330
- };
298
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, { ...unspent, value: BigInt(unspent.value) }, walletKeys, 'user', 'backup', { skipNonWitnessUtxo: true });
331
299
  });
332
- return {
333
- inputAmount,
334
- outputAmount,
335
- minerFee: inputAmount - outputAmount,
336
- spendAmount: outputAmount,
337
- inputs,
338
- unspents: inputs,
339
- outputs,
340
- externalOutputs: outputs,
341
- changeOutputs: [],
342
- payGoFee: 0,
343
- } /* cast to TransactionInfo to allow extra fields may be required by legacy consumers of this data */;
300
+ const recoveryOutputScript = utxolib.address.toOutputScript(targetAddress, network);
301
+ psbt.addOutput({ script: recoveryOutputScript, value: inputValue - fee });
302
+ return psbt;
344
303
  }
345
- function getFeeInfo(transaction, unspents, amountType = 'number') {
346
- const vsize = unspents_1.Dimensions.fromUnspents(unspents, {
347
- p2tr: { scriptPathLevel: 1 },
348
- p2trMusig2: { scriptPathLevel: undefined },
349
- })
350
- .plus(unspents_1.Dimensions.fromOutputs(transaction.outs))
304
+ /**
305
+ * Create a sweep transaction for cross-chain recovery using wasm-utxo
306
+ * @param network
307
+ * @param walletKeys
308
+ * @param unspents
309
+ * @param targetAddress
310
+ * @param feeRateSatVB
311
+ * @return unsigned PSBT
312
+ */
313
+ function createSweepTransactionWasm(network, walletKeys, unspents, targetAddress, feeRateSatVB) {
314
+ const inputValue = unspentSum(unspents.map((u) => ({ ...u, value: BigInt(u.value) })), 'bigint');
315
+ // Create PSBT with wasm-utxo and add wallet inputs using shared utilities
316
+ const unspentsBigint = unspents.map((u) => ({ ...u, value: BigInt(u.value) }));
317
+ const wasmPsbt = (0, psbt_1.createEmptyWasmPsbt)(network, walletKeys);
318
+ (0, psbt_1.addWalletInputsToWasmPsbt)(wasmPsbt, unspentsBigint, walletKeys);
319
+ // Convert to utxolib PSBT temporarily for dimension calculation
320
+ const tempPsbt = (0, psbt_1.wasmPsbtToUtxolibPsbt)(wasmPsbt, network);
321
+ const vsize = unspents_1.Dimensions.fromPsbt(tempPsbt)
322
+ .plus(unspents_1.Dimensions.fromOutput({ script: utxolib.address.toOutputScript(targetAddress, network) }))
351
323
  .getVSize();
352
- const inputAmount = utxolib.bitgo.unspentSum(unspents, amountType);
353
- const outputAmount = transaction.outs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0));
354
- const fee = Number(BigInt(inputAmount) - outputAmount);
355
- return {
356
- size: vsize,
357
- fee,
358
- feeRate: fee / vsize,
359
- payGoFee: 0,
360
- };
324
+ const fee = BigInt(Math.round(vsize * feeRateSatVB));
325
+ // Add output to wasm PSBT
326
+ (0, psbt_1.addOutputToWasmPsbt)(wasmPsbt, targetAddress, inputValue - fee, network);
327
+ // Convert to utxolib PSBT for signing and return
328
+ return (0, psbt_1.wasmPsbtToUtxolibPsbt)(wasmPsbt, network);
329
+ }
330
+ /**
331
+ * Create a sweep transaction for cross-chain recovery using PSBT
332
+ * @param network
333
+ * @param walletKeys
334
+ * @param unspents
335
+ * @param targetAddress
336
+ * @param feeRateSatVB
337
+ * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
338
+ * @return unsigned PSBT
339
+ */
340
+ function createSweepTransaction(network, walletKeys, unspents, targetAddress, feeRateSatVB, backend = 'wasm-utxo') {
341
+ if (backend === 'wasm-utxo') {
342
+ return createSweepTransactionWasm(network, walletKeys, unspents, targetAddress, feeRateSatVB);
343
+ }
344
+ else {
345
+ return createSweepTransactionUtxolib(network, walletKeys, unspents, targetAddress, feeRateSatVB);
346
+ }
361
347
  }
362
348
  /**
363
349
  * Recover wallet deposits that were received on the wrong blockchain
@@ -375,34 +361,30 @@ async function recoverCrossChain(bitgo, params) {
375
361
  const walletUnspents = await toWalletUnspents(params.sourceCoin, params.recoveryCoin, unspents, wallet);
376
362
  const walletKeys = await getWalletKeys(params.recoveryCoin, wallet);
377
363
  const prv = params.xprv || params.walletPassphrase ? await getPrv(params.xprv, params.walletPassphrase, wallet) : undefined;
378
- const signer = prv
379
- ? new utxolib.bitgo.WalletUnspentSigner(walletKeys, prv, walletKeys.bitgo)
380
- : undefined;
381
364
  const feeRateSatVB = await getFeeRateSatVB(params.sourceCoin);
382
- const transaction = createSweepTransaction(params.sourceCoin.network, walletUnspents, params.recoveryAddress, feeRateSatVB, signer, params.sourceCoin.amountType);
383
- const recoveryAmount = transaction.outs[0].value;
384
- const txHex = transaction.toBuffer().toString('hex');
385
- const txInfo = getTxInfo(transaction, walletUnspents, params.walletId, walletKeys, params.sourceCoin.amountType);
386
- if (prv) {
365
+ // Create PSBT for both signed and unsigned recovery
366
+ // Use wasm-utxo for testnet coins only, utxolib for mainnet
367
+ const backend = utxolib.isTestnet(params.sourceCoin.network) ? 'wasm-utxo' : 'utxolib';
368
+ const psbt = createSweepTransaction(params.sourceCoin.network, walletKeys, walletUnspents, params.recoveryAddress, feeRateSatVB, backend);
369
+ // For unsigned recovery, return unsigned PSBT hex
370
+ if (!prv) {
387
371
  return {
388
- version: wallet instanceof sdk_core_1.Wallet ? 2 : 1,
372
+ txHex: psbt.toHex(),
389
373
  walletId: params.walletId,
390
- txHex,
391
- txInfo,
392
- sourceCoin: params.sourceCoin.getChain(),
393
- recoveryCoin: params.recoveryCoin.getChain(),
394
- recoveryAmount,
395
- };
396
- }
397
- else {
398
- return {
399
- txHex,
400
- txInfo,
401
- walletId: params.walletId,
402
- feeInfo: getFeeInfo(transaction, walletUnspents, params.sourceCoin.amountType),
403
374
  address: params.recoveryAddress,
404
375
  coin: params.sourceCoin.getChain(),
405
376
  };
406
377
  }
378
+ // For signed recovery, sign the PSBT with user key and return half-signed PSBT
379
+ (0, signPsbt_1.signAndVerifyPsbt)(psbt, prv, { isLastSignature: false });
380
+ const recoveryAmount = utxolib.bitgo.toTNumber(psbt.txOutputs[0].value, params.sourceCoin.amountType);
381
+ return {
382
+ version: wallet instanceof sdk_core_1.Wallet ? 2 : 1,
383
+ walletId: params.walletId,
384
+ txHex: psbt.toHex(),
385
+ sourceCoin: params.sourceCoin.getChain(),
386
+ recoveryCoin: params.recoveryCoin.getChain(),
387
+ recoveryAmount,
388
+ };
407
389
  }
408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNEQSw4QkFvQkM7QUFPRCxzQ0FpQkM7QUFFRCwwQ0FhQztBQVdELDBFQXVCQztBQW1VRCw4Q0F5REM7QUEvZ0JELHlEQUEyQztBQUMzQyxnREFBeUQ7QUFDekQsOENBQTZDO0FBQzdDLDhDQUErRTtBQUMvRSw0Q0FBeUM7QUFHekMsNEZBQWtHO0FBRWxHLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQTZDakUsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBZ0IsRUFDaEIsSUFBc0IsRUFDdEIsUUFBZ0I7SUFFaEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLCtDQUErQztRQUMvQyxrSkFBa0o7UUFDbEosSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsUUFBUSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxF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Q0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UsIGJpcDMyIH0gZnJvbSAnQGJpdGdvL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnQGJpdGdvL3Vuc3BlbnRzJztcbmltcG9ydCB7IEJpdEdvQmFzZSwgSVdhbGxldCwgS2V5Y2hhaW4sIFRyaXBsZSwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGRlY3J5cHQgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIFRyYW5zYWN0aW9uSW5mbyB9IGZyb20gJy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvc2lnbkxlZ2FjeVRyYW5zYWN0aW9uJztcblxuY29uc3QgeyB1bnNwZW50U3VtLCBzY3JpcHRUeXBlRm9yQ2hhaW4sIG91dHB1dFNjcmlwdHMgfSA9IHV0eG9saWIuYml0Z287XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uVW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudExlZ2FjeTxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudExlZ2FjeTxUTnVtYmVyPjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFJlY292ZXJ5VHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgd2FsbGV0OiBzdHJpbmc7XG4gIGZhdWx0eVR4SWQ6IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG59XG5cbnR5cGUgRmVlSW5mbyA9IHtcbiAgc2l6ZTogbnVtYmVyO1xuICBmZWVSYXRlOiBudW1iZXI7XG4gIGZlZTogbnVtYmVyO1xuICBwYXlHb0ZlZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHR4SW5mbzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICBmZWVJbmZvOiBGZWVJbmZvO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvaW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB2ZXJzaW9uOiAxIHwgMjtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvOiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIHNvdXJjZUNvaW46IHN0cmluZztcbiAgcmVjb3ZlcnlDb2luOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzcz86IHN0cmluZztcbiAgcmVjb3ZlcnlBbW91bnQ/OiBUTnVtYmVyO1xufVxuXG50eXBlIFdhbGxldFYxID0ge1xuICBrZXljaGFpbnM6IHsgeHB1Yjogc3RyaW5nIH1bXTtcbiAgYWRkcmVzcyh7IGFkZHJlc3MgfTogeyBhZGRyZXNzOiBzdHJpbmcgfSk6IFByb21pc2U8eyBjaGFpbjogbnVtYmVyOyBpbmRleDogbnVtYmVyIH0+O1xuICBnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTogUHJvbWlzZTx7IGVuY3J5cHRlZFhwcnY6IHN0cmluZyB9Pjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXYWxsZXQoXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHdhbGxldElkOiBzdHJpbmdcbik6IFByb21pc2U8SVdhbGxldCB8IFdhbGxldFYxPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvaW4ud2FsbGV0cygpLmdldCh7IGlkOiB3YWxsZXRJZCB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IEJHLTQ2MzY0IGhhbmRsZSBlcnJvcnMgbW9yZSBncmFjZWZ1bGx5XG4gICAgLy8gVGhlIHYyIGVuZHBvaW50IGNvaW4ud2FsbGV0cygpLmdldCgpIG1heSB0aHJvdyA0MDQgb3IgNDAwIGVycm9ycywgYnV0IHRoaXMgc2hvdWxkIG5vdCBwcmV2ZW50IHVzIGZyb20gc2VhcmNoaW5nIGZvciB0aGUgd2FsbGV0SWQgaW4gdjEgd2FsbGV0cy5cbiAgICBpZiAoZS5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGJpdGdvLndhbGxldHMoKS5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBnZXQgd2FsbGV0ICR7d2FsbGV0SWR9IGZyb20gdjEgb3IgdjI6ICR7ZS50b1N0cmluZygpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHJlY292ZXJ5Q29pblxuICogQHBhcmFtIHdhbGxldFxuICogQHJldHVybiB3YWxsZXQgcHVia2V5c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0S2V5cyhcbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMVxuKTogUHJvbWlzZTxSb290V2FsbGV0S2V5cz4ge1xuICBsZXQgeHB1YnM6IFRyaXBsZTxzdHJpbmc+O1xuXG4gIGlmICh3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpIHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgcmVjb3ZlcnlDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0IH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG4gICAgaWYgKGtleWNoYWlucy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgdHJpcGxlIGdvdCAke2tleWNoYWlucy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHhwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICB9IGVsc2Uge1xuICAgIHhwdWJzID0gKHdhbGxldCBhcyBXYWxsZXRWMSkua2V5Y2hhaW5zLm1hcCgoaykgPT4gay54cHViKSBhcyBUcmlwbGU8c3RyaW5nPjtcbiAgfVxuXG4gIHJldHVybiBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyh4cHVicy5tYXAoKGspID0+IGJpcDMyLmZyb21CYXNlNTgoaykpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNXYWxsZXRBZGRyZXNzKHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLCBhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBsZXQgYWRkcmVzc0RhdGE7XG4gICAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgICAgYWRkcmVzc0RhdGEgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuYWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZHJlc3NEYXRhICE9PSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgTGl0ZWNvaW4gUDJTSCBhZGRyZXNzIGZyb20gTS4uLiBmb3JtYXQgKHNjcmlwdEhhc2ggMHgzMikgdG8gdGhlIGxlZ2FjeSAzLi4uIGZvcm1hdCAoc2NyaXB0SGFzaCAweDA1KS5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciBjcm9zcy1jaGFpbiByZWNvdmVyeSB3aGVuIExUQyB3YXMgc2VudCB0byBhIEJUQyBhZGRyZXNzLCBiZWNhdXNlIHRoZSBCVEMgd2FsbGV0XG4gKiBzdG9yZXMgYWRkcmVzc2VzIGluIHRoZSAzLi4uIGZvcm1hdCB3aGlsZSB0aGUgTFRDIGJsb2NrY2hhaW4gcmV0dXJucyBhZGRyZXNzZXMgaW4gTS4uLiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGFkZHJlc3MgLSBMVEMgYWRkcmVzcyB0byBjb252ZXJ0XG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBMaXRlY29pbiBuZXR3b3JrXG4gKiBAcmV0dXJucyBUaGUgYWRkcmVzcyBpbiBsZWdhY3kgMy4uLiBmb3JtYXQsIG9yIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGlmIGl0J3Mgbm90IGEgUDJTSCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gZGVjb2RlIGFzIGJlY2gzMiAtIHRoZXNlIGRvbid0IG5lZWQgY29udmVyc2lvblxuICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgIHJldHVybiBhZGRyZXNzO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gTm90IGJlY2gzMiwgY29udGludWUgdG8gYmFzZTU4XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSB1dHhvbGliLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKGFkZHJlc3MsIG5ldHdvcmspO1xuICAgIC8vIE9ubHkgY29udmVydCBQMlNIIGFkZHJlc3NlcyAoc2NyaXB0SGFzaCksIG5vdCBQMlBLSCAocHViS2V5SGFzaClcbiAgICBpZiAoZGVjb2RlZC52ZXJzaW9uID09PSBuZXR3b3JrLnNjcmlwdEhhc2gpIHtcbiAgICAgIC8vIENvbnZlcnQgdG8gbGVnYWN5IGZvcm1hdCB1c2luZyBCaXRjb2luJ3Mgc2NyaXB0SGFzaCAoMHgwNSlcbiAgICAgIGNvbnN0IGxlZ2FjeVNjcmlwdEhhc2ggPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4uc2NyaXB0SGFzaDtcbiAgICAgIHJldHVybiB1dHhvbGliLmFkZHJlc3MudG9CYXNlNThDaGVjayhkZWNvZGVkLmhhc2gsIGxlZ2FjeVNjcmlwdEhhc2gsIG5ldHdvcmspO1xuICAgIH1cbiAgICAvLyBQMlBLSCBvciBvdGhlciAtIHJldHVybiB1bmNoYW5nZWRcbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElmIGRlY29kaW5nIGZhaWxzLCByZXR1cm4gdGhlIG9yaWdpbmFsIGFkZHJlc3NcbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gdHhpZFxuICogQHBhcmFtIGFtb3VudFR5cGVcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEBwYXJhbSBhcGlLZXkgLSBhIGJsb2NrY2hhaXIgYXBpIGtleVxuICogQHJldHVybiBhbGwgdW5zcGVudHMgZm9yIHRyYW5zYWN0aW9uIG91dHB1dHMsIGluY2x1ZGluZyBvdXRwdXRzIGZyb20gb3RoZXIgdHJhbnNhY3Rpb25zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFJlY292ZXJ5T3V0cHV0czxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdHhpZDogc3RyaW5nLFxuICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcicsXG4gIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLFxuICBhcGlLZXk/OiBzdHJpbmdcbik6IFByb21pc2U8VW5zcGVudDxUTnVtYmVyPltdPiB7XG4gIGNvbnN0IGFwaSA9IGNvaW4uZ2V0UmVjb3ZlcnlQcm92aWRlcihhcGlLZXkpO1xuICBjb25zdCB0eCA9IGF3YWl0IGFwaS5nZXRUcmFuc2FjdGlvbklPKHR4aWQpO1xuICBjb25zdCB3YWxsZXRBZGRyZXNzZXMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eC5vdXRwdXRzLm1hcChhc3luYyAob3V0cHV0KSA9PiB7XG4gICAgICAgIC8vIEZvciBzb21lIGNvaW5zIChiY2gpIHdlIG5lZWQgdG8gY29udmVydCB0aGUgYWRkcmVzcyB0byBsZWdhY3kgZm9ybWF0IHNpbmNlIHRoZSBhcGkgcmV0dXJucyB0aGUgYWRkcmVzc1xuICAgICAgICAvLyBpbiBub24gbGVnYWN5IGZvcm1hdC4gSG93ZXZlciwgd2Ugd2FudCB0byBrZWVwIHRoZSBhZGRyZXNzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgcmVzcG9uc2Ugc2luY2Ugd2VcbiAgICAgICAgLy8gYXJlIGdvaW5nIHRvIGhpdCB0aGUgQVBJIGFnYWluIHRvIGZldGNoIGFkZHJlc3MgdW5zcGVudHMuXG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbEFkZHJlc3MgPSBjb2luLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpO1xuICAgICAgICBsZXQgaXNXYWxsZXRPd25lZCA9IGF3YWl0IGlzV2FsbGV0QWRkcmVzcyh3YWxsZXQsIGNhbm9uaWNhbEFkZHJlc3MpO1xuXG4gICAgICAgIC8vIEZvciBMVEMgY3Jvc3MtY2hhaW4gcmVjb3Zlcnk6IGlmIHRoZSBhZGRyZXNzIGlzbid0IGZvdW5kLCB0cnkgdGhlIGxlZ2FjeSBmb3JtYXQuXG4gICAgICAgIC8vIFdoZW4gTFRDIGlzIHNlbnQgdG8gYSBCVEMgYWRkcmVzcywgdGhlIExUQyBibG9ja2NoYWluIHJldHVybnMgTS4uLiBhZGRyZXNzZXNcbiAgICAgICAgLy8gYnV0IHRoZSBCVEMgd2FsbGV0IHN0b3JlcyBhZGRyZXNzZXMgaW4gMy4uLiBmb3JtYXQuXG4gICAgICAgIGlmICghaXNXYWxsZXRPd25lZCAmJiBjb2luLmdldEZhbWlseSgpID09PSAnbHRjJykge1xuICAgICAgICAgIGNvbnN0IGxlZ2FjeUFkZHJlc3MgPSBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KG91dHB1dC5hZGRyZXNzLCBjb2luLm5ldHdvcmspO1xuICAgICAgICAgIGlmIChsZWdhY3lBZGRyZXNzICE9PSBvdXRwdXQuYWRkcmVzcykge1xuICAgICAgICAgICAgaXNXYWxsZXRPd25lZCA9IGF3YWl0IGlzV2FsbGV0QWRkcmVzcyh3YWxsZXQsIGxlZ2FjeUFkZHJlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1dhbGxldE93bmVkID8gb3V0cHV0LmFkZHJlc3MgOiBudWxsO1xuICAgICAgfSlcbiAgICApXG4gICkuZmlsdGVyKChhZGRyZXNzKSA9PiBhZGRyZXNzICE9PSBudWxsKTtcblxuICBjb25zdCB1bnNwZW50cyA9IGF3YWl0IGFwaS5nZXRVbnNwZW50c0ZvckFkZHJlc3Nlcyh3YWxsZXRBZGRyZXNzZXMgYXMgc3RyaW5nW10pO1xuICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWNvdmVyeSB1bnNwZW50cyBmb3VuZC5gKTtcbiAgfVxuICAvLyB0aGUgYXBpIG1heSByZXR1cm4gY2FzaGFkZHIncyBpbnN0ZWFkIG9mIGxlZ2FjeSBmb3IgQkNIIGFuZCBCQ0hBXG4gIC8vIGRvd25zdHJlYW0gcHJvY2Vzc2VzJ3Mgb25seSBleHBlY3QgbGVnYWN5IGFkZHJlc3Nlc1xuICByZXR1cm4gdW5zcGVudHMubWFwKChyZWNvdmVyeU91dHB1dCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvdmVyeU91dHB1dCxcbiAgICAgIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhyZWNvdmVyeU91dHB1dC5hZGRyZXNzKSxcbiAgICAgIHZhbHVlOiB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihCaWdJbnQocmVjb3ZlcnlPdXRwdXQudmFsdWUpLCBhbW91bnRUeXBlKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBEYXRhIHJlcXVpcmVkIGZvciBhZGRyZXNzIGFuZCBzaWduYXR1cmUgZGVyaXZhdGlvblxuICovXG50eXBlIFNjcmlwdElkID0ge1xuICBjaGFpbjogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0U2NyaXB0SWQoY29pbjogQWJzdHJhY3RVdHhvQ29pbiwgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjEsIHNjcmlwdDogQnVmZmVyKTogUHJvbWlzZTxTY3JpcHRJZD4ge1xuICBjb25zdCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0LCBjb2luLm5ldHdvcmspO1xuICBsZXQgYWRkcmVzc0RhdGE6IHsgY2hhaW46IG51bWJlcjsgaW5kZXg6IG51bWJlciB9O1xuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgYWRkcmVzc0RhdGEgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gIH0gZWxzZSB7XG4gICAgYWRkcmVzc0RhdGEgPSBhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5hZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGFkZHJlc3NEYXRhLmNoYWluID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYWRkcmVzc0RhdGEuaW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgY2hhaW46IGFkZHJlc3NEYXRhLmNoYWluLCBpbmRleDogYWRkcmVzc0RhdGEuaW5kZXggfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhZGRyZXNzIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoYWRkcmVzc0RhdGEpfWApO1xufVxuXG4vKipcbiAqIExvb2t1cCBhZGRyZXNzIGRhdGEgZnJvbSB1bnNwZW50cyBvbiBzb3VyY2VDb2luIGluIGFkZHJlc3MgZGF0YWJhc2Ugb2YgcmVjb3ZlcnlDb2luLlxuICogUmV0dXJuIGZ1bGwgd2FsbGV0VW5zcGVudHMgaW5jbHVkaW5nIHNjcmlwdElkIGluIHNvdXJjZUNvaW4gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VDb2luXG4gKiBAcGFyYW0gcmVjb3ZlcnlDb2luXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gd2FsbGV0VW5zcGVudHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9XYWxsZXRVbnNwZW50czxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgc291cmNlQ29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB1bnNwZW50czogVW5zcGVudDxUTnVtYmVyPltdLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMVxuKTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PFROdW1iZXI+W10+IHtcbiAgY29uc3QgYWRkcmVzc2VzID0gbmV3IFNldCh1bnNwZW50cy5tYXAoKHUpID0+IHUuYWRkcmVzcykpO1xuICBjb25zdCB3YWxsZXRVbnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdID0gW107XG5cbiAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGFkZHJlc3Nlcykge1xuICAgIGxldCBzY3JpcHRJZDtcbiAgICB0cnkge1xuICAgICAgc2NyaXB0SWQgPSBhd2FpdCBnZXRTY3JpcHRJZChyZWNvdmVyeUNvaW4sIHdhbGxldCwgdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIHNvdXJjZUNvaW4ubmV0d29yaykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGVycm9yIGdldHRpbmcgc2NyaXB0SWQgZm9yICR7YWRkcmVzc306YCwgZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyZWRVbnNwZW50cyA9IHVuc3BlbnRzXG4gICAgICAuZmlsdGVyKCh1KSA9PiB1LmFkZHJlc3MgPT09IGFkZHJlc3MpXG4gICAgICAubWFwKCh1KSA9PiAoe1xuICAgICAgICAuLi51LFxuICAgICAgICAuLi5zY3JpcHRJZCxcbiAgICAgIH0pKTtcbiAgICB3YWxsZXRVbnNwZW50cy5wdXNoKC4uLmZpbHRlcmVkVW5zcGVudHMpO1xuICB9XG5cbiAgcmV0dXJuIHdhbGxldFVuc3BlbnRzO1xufVxuXG4vKipcbiAqIEBwYXJhbSBjb2luXG4gKiBAcmV0dXJuIGZlZVJhdGUgZm9yIHRyYW5zYWN0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZlZVJhdGVTYXRWQihjb2luOiBBYnN0cmFjdFV0eG9Db2luKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgLy8gVE9ETzogdXNlIGZlZVJhdGUgQVBJXG4gIGNvbnN0IGZlZVJhdGUgPSB7XG4gICAgYmNoOiAyMCxcbiAgICB0YmNoOiAyMCxcbiAgICBiY2hhOiAyMCxcbiAgICB0YmNoYTogMjAsXG4gICAgYnN2OiAyMCxcbiAgICB0YnN2OiAyMCxcbiAgICBidGM6IDgwLFxuICAgIHRidGM6IDgwLFxuICAgIHRidGNzaWc6IDgwLFxuICAgIHRidGM0OiA4MCxcbiAgICB0YnRjYmdzaWc6IDgwLFxuICAgIGx0YzogMTAwLFxuICAgIHRsdGM6IDEwMCxcbiAgICBkb2dlOiAxMDAwLFxuICAgIHRkb2dlOiAxMDAwLFxuICB9W2NvaW4uZ2V0Q2hhaW4oKV07XG5cbiAgaWYgKCFmZWVSYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBmZWVSYXRlIGZvciAke2NvaW4uZ2V0Q2hhaW4oKX1gKTtcbiAgfVxuXG4gIHJldHVybiBmZWVSYXRlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB4cHJ2XG4gKiBAcGFyYW0gcGFzc3BocmFzZVxuICogQHBhcmFtIHdhbGxldFxuICogQHJldHVybiBzaWduaW5nIGtleVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQcnYoeHBydj86IHN0cmluZywgcGFzc3BocmFzZT86IHN0cmluZywgd2FsbGV0PzogSVdhbGxldCB8IFdhbGxldFYxKTogUHJvbWlzZTxCSVAzMkludGVyZmFjZT4ge1xuICBpZiAoeHBydikge1xuICAgIGNvbnN0IGtleSA9IGJpcDMyLmZyb21CYXNlNTgoeHBydik7XG4gICAgaWYgKGtleS5pc05ldXRlcmVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGlmICghd2FsbGV0IHx8ICFwYXNzcGhyYXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyB4cHJ2IGdpdmVuOiBuZWVkIHdhbGxldCBhbmQgcGFzc3BocmFzZSB0byBjb250aW51ZWApO1xuICB9XG5cbiAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nO1xuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgZW5jcnlwdGVkUHJ2ID0gKGF3YWl0IHdhbGxldC5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKSkuZW5jcnlwdGVkUHJ2O1xuICB9IGVsc2Uge1xuICAgIGVuY3J5cHRlZFBydiA9IChhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKSkuZW5jcnlwdGVkWHBydjtcbiAgfVxuXG4gIHJldHVybiBnZXRQcnYoZGVjcnlwdChwYXNzcGhyYXNlLCBlbmNyeXB0ZWRQcnYpKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gdGFyZ2V0QWRkcmVzc1xuICogQHBhcmFtIGZlZVJhdGVTYXRWQlxuICogQHBhcmFtIHNpZ25lciAtIGlmIHNldCwgc2lnbiB0cmFuc2FjdGlvblxuICogQHBhcmFtIGFtb3VudFR5cGVcbiAqIEByZXR1cm4gdHJhbnNhY3Rpb24gc3BlbmRpbmcgZnVsbCBpbnB1dCBhbW91bnQgdG8gdGFyZ2V0QWRkcmVzc1xuICovXG5mdW5jdGlvbiBjcmVhdGVTd2VlcFRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHRhcmdldEFkZHJlc3M6IHN0cmluZyxcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXIsXG4gIHNpZ25lcj86IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4sXG4gIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJ1xuKTogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICBjb25zdCBpbnB1dFZhbHVlID0gdW5zcGVudFN1bTxUTnVtYmVyPih1bnNwZW50cywgYW1vdW50VHlwZSk7XG4gIGNvbnN0IHZzaXplID0gRGltZW5zaW9ucy5mcm9tVW5zcGVudHModW5zcGVudHMsIHtcbiAgICBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogMSB9LFxuICAgIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSxcbiAgfSlcbiAgICAucGx1cyhEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCh0YXJnZXRBZGRyZXNzLCBuZXR3b3JrKSB9KSlcbiAgICAuZ2V0VlNpemUoKTtcbiAgY29uc3QgZmVlID0gdnNpemUgKiBmZWVSYXRlU2F0VkI7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25CdWlsZGVyID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrPFROdW1iZXI+KG5ldHdvcmspO1xuICB0cmFuc2FjdGlvbkJ1aWxkZXIuYWRkT3V0cHV0KFxuICAgIHRhcmdldEFkZHJlc3MsXG4gICAgdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oQmlnSW50KGlucHV0VmFsdWUpIC0gQmlnSW50KGZlZSksIGFtb3VudFR5cGUpXG4gICk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFRvVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uQnVpbGRlciwgdW5zcGVudCk7XG4gIH0pO1xuICBsZXQgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbkJ1aWxkZXIuYnVpbGRJbmNvbXBsZXRlKCk7XG4gIGlmIChzaWduZXIpIHtcbiAgICB0cmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbjxUTnVtYmVyPih0cmFuc2FjdGlvbkJ1aWxkZXIsIHVuc3BlbnRzLCBzaWduZXIsIHtcbiAgICAgIGlzTGFzdFNpZ25hdHVyZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRUeEluZm88VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHRyYW5zYWN0aW9uOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgd2FsbGV0SWQ6IHN0cmluZyxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJ1xuKTogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+IHtcbiAgY29uc3QgaW5wdXRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW08VE51bWJlcj4odW5zcGVudHMsIGFtb3VudFR5cGUpO1xuICBjb25zdCBvdXRwdXRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICB0cmFuc2FjdGlvbi5vdXRzLnJlZHVjZSgoc3VtLCBvKSA9PiBzdW0gKyBCaWdJbnQoby52YWx1ZSksIEJpZ0ludCgwKSksXG4gICAgYW1vdW50VHlwZVxuICApO1xuICBjb25zdCBvdXRwdXRzID0gdHJhbnNhY3Rpb24ub3V0cy5tYXAoKG8pID0+ICh7XG4gICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoby5zY3JpcHQsIHRyYW5zYWN0aW9uLm5ldHdvcmspLFxuICAgIHZhbHVlU3RyaW5nOiBvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgY2hhbmdlOiBmYWxzZSxcbiAgfSkpO1xuICBjb25zdCBpbnB1dHMgPSB1bnNwZW50cy5tYXAoKHUpID0+IHtcbiAgICAvLyBOT1RFOlxuICAgIC8vIFRoZSBgcmVkZWVtU2NyaXB0YCBhbmQgYHdhbGxldFNjcmlwdGAgcHJvcGVydGllcyBhcmUgcmVxdWlyZWQgZm9yIGxlZ2FjeSB2ZXJzaW9ucyBvZiBCaXRHb0pTXG4gICAgLy8gd2hpY2ggbWlnaHQgcmVxdWlyZSB0aGVzZSBzY3JpcHRzIGZvciBzaWduaW5nLiBUaGUgV2FsbGV0IFJlY292ZXJ5IFdpemFyZCAoV1JXKSBjYW4gY3JlYXRlXG4gICAgLy8gdW5zaWduZWQgcHJlYnVpbGRzIHRoYXQgYXJlIHN1Ym1pdHRlZCB0byBCaXRHb0pTIGluc3RhbmNlcyB3aGljaCBhcmUgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lXG4gICAgLy8gdmVyc2lvbi5cbiAgICBjb25zdCBhZGRyZXNzS2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1LmNoYWluLCB1LmluZGV4KTtcbiAgICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKHUuY2hhaW4pO1xuICAgIGNvbnN0IHsgcmVkZWVtU2NyaXB0LCB3aXRuZXNzU2NyaXB0IH0gPSBvdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoYWRkcmVzc0tleXMucHVibGljS2V5cywgc2NyaXB0VHlwZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udSxcbiAgICAgIHdhbGxldDogd2FsbGV0SWQsXG4gICAgICBmcm9tV2FsbGV0OiB3YWxsZXRJZCxcbiAgICAgIHJlZGVlbVNjcmlwdDogcmVkZWVtU2NyaXB0Py50b1N0cmluZygnaGV4JyksXG4gICAgICB3aXRuZXNzU2NyaXB0OiB3aXRuZXNzU2NyaXB0Py50b1N0cmluZygnaGV4JyksXG4gICAgfSBhcyBXYWxsZXRVbnNwZW50TGVnYWN5PFROdW1iZXI+O1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dEFtb3VudCxcbiAgICBvdXRwdXRBbW91bnQsXG4gICAgbWluZXJGZWU6IGlucHV0QW1vdW50IC0gb3V0cHV0QW1vdW50LFxuICAgIHNwZW5kQW1vdW50OiBvdXRwdXRBbW91bnQsXG4gICAgaW5wdXRzLFxuICAgIHVuc3BlbnRzOiBpbnB1dHMsXG4gICAgb3V0cHV0cyxcbiAgICBleHRlcm5hbE91dHB1dHM6IG91dHB1dHMsXG4gICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgcGF5R29GZWU6IDAsXG4gIH0gLyogY2FzdCB0byBUcmFuc2FjdGlvbkluZm8gdG8gYWxsb3cgZXh0cmEgZmllbGRzIG1heSBiZSByZXF1aXJlZCBieSBsZWdhY3kgY29uc3VtZXJzIG9mIHRoaXMgZGF0YSAqLyBhcyBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG59XG5cbmZ1bmN0aW9uIGdldEZlZUluZm88VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHRyYW5zYWN0aW9uOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInXG4pOiBGZWVJbmZvIHtcbiAgY29uc3QgdnNpemUgPSBEaW1lbnNpb25zLmZyb21VbnNwZW50cyh1bnNwZW50cywge1xuICAgIHAydHI6IHsgc2NyaXB0UGF0aExldmVsOiAxIH0sXG4gICAgcDJ0ck11c2lnMjogeyBzY3JpcHRQYXRoTGV2ZWw6IHVuZGVmaW5lZCB9LFxuICB9KVxuICAgIC5wbHVzKERpbWVuc2lvbnMuZnJvbU91dHB1dHModHJhbnNhY3Rpb24ub3V0cykpXG4gICAgLmdldFZTaXplKCk7XG4gIGNvbnN0IGlucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtPFROdW1iZXI+KHVuc3BlbnRzLCBhbW91bnRUeXBlKTtcbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHJhbnNhY3Rpb24ub3V0cy5yZWR1Y2UoKHN1bSwgbykgPT4gc3VtICsgQmlnSW50KG8udmFsdWUpLCBCaWdJbnQoMCkpO1xuICBjb25zdCBmZWUgPSBOdW1iZXIoQmlnSW50KGlucHV0QW1vdW50KSAtIG91dHB1dEFtb3VudCk7XG4gIHJldHVybiB7XG4gICAgc2l6ZTogdnNpemUsXG4gICAgZmVlLFxuICAgIGZlZVJhdGU6IGZlZSAvIHZzaXplLFxuICAgIHBheUdvRmVlOiAwLFxuICB9O1xufVxuXG50eXBlIFJlY292ZXJQYXJhbXMgPSB7XG4gIC8qKiBXYWxsZXQgSUQgKGNhbiBiZSB2MSB3YWxsZXQgb3IgdjIgd2FsbGV0KSAqL1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICAvKiogQ29pbiB0byBjcmVhdGUgdGhlIHRyYW5zYWN0aW9uIGZvciAqL1xuICBzb3VyY2VDb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICAvKiogQ29pbiB0aGF0IHdhbGxldCBrZXlzIHdlcmUgc2V0IHVwIGZvciAqL1xuICByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIC8qKiBTb3VyY2UgY29pbiB0cmFuc2FjdGlvbiB0byByZWNvdmVyIG91dHB1dHMgZnJvbSAoc291cmNlQ29pbikgKi9cbiAgdHhpZDogc3RyaW5nO1xuICAvKiogU291cmNlIGNvaW4gYWRkcmVzcyB0byBzZW5kIHRoZSBmdW5kcyB0byAqL1xuICByZWNvdmVyeUFkZHJlc3M6IHN0cmluZztcbiAgLyoqIElmIHNldCwgZGVjcnlwdHMgcHJpdmF0ZSBrZXkgYW5kIHNpZ25zIHRyYW5zYWN0aW9uICovXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIC8qKiBJZiBzZXQsIHNpZ25zIHRyYW5zYWN0aW9uICovXG4gIHhwcnY/OiBzdHJpbmc7XG4gIC8qKiBmb3IgdXR4byBjb2lucyBvdGhlciB0aGFuIFtCVEMsVEJUQ10gdGhpcyBpcyBhIEJsb2NrIENoYWlyIGFwaSBrZXkgKiovXG4gIGFwaUtleT86IHN0cmluZztcbn07XG5cbi8qKlxuICogUmVjb3ZlciB3YWxsZXQgZGVwb3NpdHMgdGhhdCB3ZXJlIHJlY2VpdmVkIG9uIHRoZSB3cm9uZyBibG9ja2NoYWluXG4gKiAoZm9yIGluc3RhbmNlIGJpdGNvaW4gZGVwb3NpdHMgdGhhdCB3ZXJlIHJlY2VpdmVkIGZvciBhIGxpdGVjb2luIHdhbGxldCkuXG4gKlxuICogRmV0Y2hlcyB0aGUgdW5zcGVudCBkYXRhIGZyb20gQml0R28ncyBwdWJsaWMgYmxvY2tjaGFpbiBBUEkgYW5kIHRoZSBzY3JpcHQgZGF0YSBmcm9tIHRoZSB1c2VyJ3NcbiAqIHdhbGxldC5cbiAqXG4gKiBAcGFyYW0ge0JpdEdvQmFzZX0gYml0Z29cbiAqIEBwYXJhbSB7UmVjb3ZlclBhcmFtc30gcGFyYW1zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyQ3Jvc3NDaGFpbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBSZWNvdmVyUGFyYW1zXG4pOiBQcm9taXNlPENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPiB8IENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXI+PiB7XG4gIGNvbnN0IHdhbGxldCA9IGF3YWl0IGdldFdhbGxldChiaXRnbywgcGFyYW1zLnJlY292ZXJ5Q29pbiwgcGFyYW1zLndhbGxldElkKTtcbiAgY29uc3QgdW5zcGVudHMgPSBhd2FpdCBnZXRBbGxSZWNvdmVyeU91dHB1dHM8VE51bWJlcj4oXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4sXG4gICAgcGFyYW1zLnR4aWQsXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4uYW1vdW50VHlwZSxcbiAgICB3YWxsZXQsXG4gICAgcGFyYW1zLmFwaUtleVxuICApO1xuICBjb25zdCB3YWxsZXRVbnNwZW50cyA9IGF3YWl0IHRvV2FsbGV0VW5zcGVudHM8VE51bWJlcj4ocGFyYW1zLnNvdXJjZUNvaW4sIHBhcmFtcy5yZWNvdmVyeUNvaW4sIHVuc3BlbnRzLCB3YWxsZXQpO1xuICBjb25zdCB3YWxsZXRLZXlzID0gYXdhaXQgZ2V0V2FsbGV0S2V5cyhwYXJhbXMucmVjb3ZlcnlDb2luLCB3YWxsZXQpO1xuICBjb25zdCBwcnYgPVxuICAgIHBhcmFtcy54cHJ2IHx8IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlID8gYXdhaXQgZ2V0UHJ2KHBhcmFtcy54cHJ2LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgd2FsbGV0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2lnbmVyID0gcHJ2XG4gICAgPyBuZXcgdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50U2lnbmVyPFJvb3RXYWxsZXRLZXlzPih3YWxsZXRLZXlzLCBwcnYsIHdhbGxldEtleXMuYml0Z28pXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZlZVJhdGVTYXRWQiA9IGF3YWl0IGdldEZlZVJhdGVTYXRWQihwYXJhbXMuc291cmNlQ29pbik7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gY3JlYXRlU3dlZXBUcmFuc2FjdGlvbjxUTnVtYmVyPihcbiAgICBwYXJhbXMuc291cmNlQ29pbi5uZXR3b3JrLFxuICAgIHdhbGxldFVuc3BlbnRzLFxuICAgIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MsXG4gICAgZmVlUmF0ZVNhdFZCLFxuICAgIHNpZ25lcixcbiAgICBwYXJhbXMuc291cmNlQ29pbi5hbW91bnRUeXBlXG4gICk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdHJhbnNhY3Rpb24ub3V0c1swXS52YWx1ZTtcbiAgY29uc3QgdHhIZXggPSB0cmFuc2FjdGlvbi50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgdHhJbmZvID0gZ2V0VHhJbmZvPFROdW1iZXI+KFxuICAgIHRyYW5zYWN0aW9uLFxuICAgIHdhbGxldFVuc3BlbnRzLFxuICAgIHBhcmFtcy53YWxsZXRJZCxcbiAgICB3YWxsZXRLZXlzLFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLmFtb3VudFR5cGVcbiAgKTtcbiAgaWYgKHBydikge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiB3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQgPyAyIDogMSxcbiAgICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0SWQsXG4gICAgICB0eEhleCxcbiAgICAgIHR4SW5mbyxcbiAgICAgIHNvdXJjZUNvaW46IHBhcmFtcy5zb3VyY2VDb2luLmdldENoYWluKCksXG4gICAgICByZWNvdmVyeUNvaW46IHBhcmFtcy5yZWNvdmVyeUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4LFxuICAgICAgdHhJbmZvLFxuICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICAgIGZlZUluZm86IGdldEZlZUluZm8odHJhbnNhY3Rpb24sIHdhbGxldFVuc3BlbnRzLCBwYXJhbXMuc291cmNlQ29pbi5hbW91bnRUeXBlKSxcbiAgICAgIGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MsXG4gICAgICBjb2luOiBwYXJhbXMuc291cmNlQ29pbi5nZXRDaGFpbigpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZEQSw4QkFvQkM7QUFPRCxzQ0FpQkM7QUFFRCwwQ0FhQztBQVdELDBFQXVCQztBQWtVRCw4Q0FvREM7QUFoaEJELHlEQUEyQztBQUMzQyxnREFBeUQ7QUFDekQsOENBQTZDO0FBQzdDLDhDQUErRTtBQUMvRSw0Q0FBeUM7QUFHekMsa0VBQXdFO0FBRXhFLGlDQU1nQjtBQUVoQixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQTRDOUIsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBZ0IsRUFDaEIsSUFBc0IsRUFDdEIsUUFBZ0I7SUFFaEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLCtDQUErQztRQUMvQyxrSkFBa0o7UUFDbEosSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsUUFBUSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMs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QUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFL0csT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNLFlBQVksaUJBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNuQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDeEMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO1FBQzVDLGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXAzMiB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UsIElXYWxsZXQsIEtleWNoYWluLCBUcmlwbGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBkZWNyeXB0IH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBUcmFuc2FjdGlvbkluZm8gfSBmcm9tICcuLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlQc2J0IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvc2lnblBzYnQnO1xuXG5pbXBvcnQge1xuICBQc2J0QmFja2VuZCxcbiAgY3JlYXRlRW1wdHlXYXNtUHNidCxcbiAgYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidCxcbiAgYWRkT3V0cHV0VG9XYXNtUHNidCxcbiAgd2FzbVBzYnRUb1V0eG9saWJQc2J0LFxufSBmcm9tICcuL3BzYnQnO1xuXG5jb25zdCB7IHVuc3BlbnRTdW0gfSA9IHV0eG9saWIuYml0Z287XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uVW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFJlY292ZXJ5VHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgd2FsbGV0OiBzdHJpbmc7XG4gIGZhdWx0eVR4SWQ6IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG59XG5cbnR5cGUgRmVlSW5mbyA9IHtcbiAgc2l6ZTogbnVtYmVyO1xuICBmZWVSYXRlOiBudW1iZXI7XG4gIGZlZTogbnVtYmVyO1xuICBwYXlHb0ZlZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgZmVlSW5mbz86IEZlZUluZm87XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIHZlcnNpb246IDEgfCAyO1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIHNvdXJjZUNvaW46IHN0cmluZztcbiAgcmVjb3ZlcnlDb2luOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzcz86IHN0cmluZztcbiAgcmVjb3ZlcnlBbW91bnQ/OiBUTnVtYmVyO1xufVxuXG50eXBlIFdhbGxldFYxID0ge1xuICBrZXljaGFpbnM6IHsgeHB1Yjogc3RyaW5nIH1bXTtcbiAgYWRkcmVzcyh7IGFkZHJlc3MgfTogeyBhZGRyZXNzOiBzdHJpbmcgfSk6IFByb21pc2U8eyBjaGFpbjogbnVtYmVyOyBpbmRleDogbnVtYmVyIH0+O1xuICBnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTogUHJvbWlzZTx7IGVuY3J5cHRlZFhwcnY6IHN0cmluZyB9Pjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXYWxsZXQoXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHdhbGxldElkOiBzdHJpbmdcbik6IFByb21pc2U8SVdhbGxldCB8IFdhbGxldFYxPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvaW4ud2FsbGV0cygpLmdldCh7IGlkOiB3YWxsZXRJZCB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IEJHLTQ2MzY0IGhhbmRsZSBlcnJvcnMgbW9yZSBncmFjZWZ1bGx5XG4gICAgLy8gVGhlIHYyIGVuZHBvaW50IGNvaW4ud2FsbGV0cygpLmdldCgpIG1heSB0aHJvdyA0MDQgb3IgNDAwIGVycm9ycywgYnV0IHRoaXMgc2hvdWxkIG5vdCBwcmV2ZW50IHVzIGZyb20gc2VhcmNoaW5nIGZvciB0aGUgd2FsbGV0SWQgaW4gdjEgd2FsbGV0cy5cbiAgICBpZiAoZS5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGJpdGdvLndhbGxldHMoKS5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBnZXQgd2FsbGV0ICR7d2FsbGV0SWR9IGZyb20gdjEgb3IgdjI6ICR7ZS50b1N0cmluZygpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHJlY292ZXJ5Q29pblxuICogQHBhcmFtIHdhbGxldFxuICogQHJldHVybiB3YWxsZXQgcHVia2V5c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0S2V5cyhcbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMVxuKTogUHJvbWlzZTxSb290V2FsbGV0S2V5cz4ge1xuICBsZXQgeHB1YnM6IFRyaXBsZTxzdHJpbmc+O1xuXG4gIGlmICh3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpIHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgcmVjb3ZlcnlDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0IH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG4gICAgaWYgKGtleWNoYWlucy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgdHJpcGxlIGdvdCAke2tleWNoYWlucy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHhwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICB9IGVsc2Uge1xuICAgIHhwdWJzID0gKHdhbGxldCBhcyBXYWxsZXRWMSkua2V5Y2hhaW5zLm1hcCgoaykgPT4gay54cHViKSBhcyBUcmlwbGU8c3RyaW5nPjtcbiAgfVxuXG4gIHJldHVybiBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyh4cHVicy5tYXAoKGspID0+IGJpcDMyLmZyb21CYXNlNTgoaykpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNXYWxsZXRBZGRyZXNzKHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLCBhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBsZXQgYWRkcmVzc0RhdGE7XG4gICAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgICAgYWRkcmVzc0RhdGEgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuYWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZHJlc3NEYXRhICE9PSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgTGl0ZWNvaW4gUDJTSCBhZGRyZXNzIGZyb20gTS4uLiBmb3JtYXQgKHNjcmlwdEhhc2ggMHgzMikgdG8gdGhlIGxlZ2FjeSAzLi4uIGZvcm1hdCAoc2NyaXB0SGFzaCAweDA1KS5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciBjcm9zcy1jaGFpbiByZWNvdmVyeSB3aGVuIExUQyB3YXMgc2VudCB0byBhIEJUQyBhZGRyZXNzLCBiZWNhdXNlIHRoZSBCVEMgd2FsbGV0XG4gKiBzdG9yZXMgYWRkcmVzc2VzIGluIHRoZSAzLi4uIGZvcm1hdCB3aGlsZSB0aGUgTFRDIGJsb2NrY2hhaW4gcmV0dXJucyBhZGRyZXNzZXMgaW4gTS4uLiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGFkZHJlc3MgLSBMVEMgYWRkcmVzcyB0byBjb252ZXJ0XG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBMaXRlY29pbiBuZXR3b3JrXG4gKiBAcmV0dXJucyBUaGUgYWRkcmVzcyBpbiBsZWdhY3kgMy4uLiBmb3JtYXQsIG9yIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGlmIGl0J3Mgbm90IGEgUDJTSCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gZGVjb2RlIGFzIGJlY2gzMiAtIHRoZXNlIGRvbid0IG5lZWQgY29udmVyc2lvblxuICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgIHJldHVybiBhZGRyZXNzO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gTm90IGJlY2gzMiwgY29udGludWUgdG8gYmFzZTU4XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSB1dHhvbGliLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKGFkZHJlc3MsIG5ldHdvcmspO1xuICAgIC8vIE9ubHkgY29udmVydCBQMlNIIGFkZHJlc3NlcyAoc2NyaXB0SGFzaCksIG5vdCBQMlBLSCAocHViS2V5SGFzaClcbiAgICBpZiAoZGVjb2RlZC52ZXJzaW9uID09PSBuZXR3b3JrLnNjcmlwdEhhc2gpIHtcbiAgICAgIC8vIENvbnZlcnQgdG8gbGVnYWN5IGZvcm1hdCB1c2luZyBCaXRjb2luJ3Mgc2NyaXB0SGFzaCAoMHgwNSlcbiAgICAgIGNvbnN0IGxlZ2FjeVNjcmlwdEhhc2ggPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4uc2NyaXB0SGFzaDtcbiAgICAgIHJldHVybiB1dHhvbGliLmFkZHJlc3MudG9CYXNlNThDaGVjayhkZWNvZGVkLmhhc2gsIGxlZ2FjeVNjcmlwdEhhc2gsIG5ldHdvcmspO1xuICAgIH1cbiAgICAvLyBQMlBLSCBvciBvdGhlciAtIHJldHVybiB1bmNoYW5nZWRcbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElmIGRlY29kaW5nIGZhaWxzLCByZXR1cm4gdGhlIG9yaWdpbmFsIGFkZHJlc3NcbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gdHhpZFxuICogQHBhcmFtIGFtb3VudFR5cGVcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEBwYXJhbSBhcGlLZXkgLSBhIGJsb2NrY2hhaXIgYXBpIGtleVxuICogQHJldHVybiBhbGwgdW5zcGVudHMgZm9yIHRyYW5zYWN0aW9uIG91dHB1dHMsIGluY2x1ZGluZyBvdXRwdXRzIGZyb20gb3RoZXIgdHJhbnNhY3Rpb25zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFJlY292ZXJ5T3V0cHV0czxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdHhpZDogc3RyaW5nLFxuICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcicsXG4gIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLFxuICBhcGlLZXk/OiBzdHJpbmdcbik6IFByb21pc2U8VW5zcGVudDxUTnVtYmVyPltdPiB7XG4gIGNvbnN0IGFwaSA9IGNvaW4uZ2V0UmVjb3ZlcnlQcm92aWRlcihhcGlLZXkpO1xuICBjb25zdCB0eCA9IGF3YWl0IGFwaS5nZXRUcmFuc2FjdGlvbklPKHR4aWQpO1xuICBjb25zdCB3YWxsZXRBZGRyZXNzZXMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eC5vdXRwdXRzLm1hcChhc3luYyAob3V0cHV0KSA9PiB7XG4gICAgICAgIC8vIEZvciBzb21lIGNvaW5zIChiY2gpIHdlIG5lZWQgdG8gY29udmVydCB0aGUgYWRkcmVzcyB0byBsZWdhY3kgZm9ybWF0IHNpbmNlIHRoZSBhcGkgcmV0dXJucyB0aGUgYWRkcmVzc1xuICAgICAgICAvLyBpbiBub24gbGVnYWN5IGZvcm1hdC4gSG93ZXZlciwgd2Ugd2FudCB0byBrZWVwIHRoZSBhZGRyZXNzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgcmVzcG9uc2Ugc2luY2Ugd2VcbiAgICAgICAgLy8gYXJlIGdvaW5nIHRvIGhpdCB0aGUgQVBJIGFnYWluIHRvIGZldGNoIGFkZHJlc3MgdW5zcGVudHMuXG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbEFkZHJlc3MgPSBjb2luLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpO1xuICAgICAgICBsZXQgaXNXYWxsZXRPd25lZCA9IGF3YWl0IGlzV2FsbGV0QWRkcmVzcyh3YWxsZXQsIGNhbm9uaWNhbEFkZHJlc3MpO1xuXG4gICAgICAgIC8vIEZvciBMVEMgY3Jvc3MtY2hhaW4gcmVjb3Zlcnk6IGlmIHRoZSBhZGRyZXNzIGlzbid0IGZvdW5kLCB0cnkgdGhlIGxlZ2FjeSBmb3JtYXQuXG4gICAgICAgIC8vIFdoZW4gTFRDIGlzIHNlbnQgdG8gYSBCVEMgYWRkcmVzcywgdGhlIExUQyBibG9ja2NoYWluIHJldHVybnMgTS4uLiBhZGRyZXNzZXNcbiAgICAgICAgLy8gYnV0IHRoZSBCVEMgd2FsbGV0IHN0b3JlcyBhZGRyZXNzZXMgaW4gMy4uLiBmb3JtYXQuXG4gICAgICAgIGlmICghaXNXYWxsZXRPd25lZCAmJiBjb2luLmdldEZhbWlseSgpID09PSAnbHRjJykge1xuICAgICAgICAgIGNvbnN0IGxlZ2FjeUFkZHJlc3MgPSBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KG91dHB1dC5hZGRyZXNzLCBjb2luLm5ldHdvcmspO1xuICAgICAgICAgIGlmIChsZWdhY3lBZGRyZXNzICE9PSBvdXRwdXQuYWRkcmVzcykge1xuICAgICAgICAgICAgaXNXYWxsZXRPd25lZCA9IGF3YWl0IGlzV2FsbGV0QWRkcmVzcyh3YWxsZXQsIGxlZ2FjeUFkZHJlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1dhbGxldE93bmVkID8gb3V0cHV0LmFkZHJlc3MgOiBudWxsO1xuICAgICAgfSlcbiAgICApXG4gICkuZmlsdGVyKChhZGRyZXNzKSA9PiBhZGRyZXNzICE9PSBudWxsKTtcblxuICBjb25zdCB1bnNwZW50cyA9IGF3YWl0IGFwaS5nZXRVbnNwZW50c0ZvckFkZHJlc3Nlcyh3YWxsZXRBZGRyZXNzZXMgYXMgc3RyaW5nW10pO1xuICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWNvdmVyeSB1bnNwZW50cyBmb3VuZC5gKTtcbiAgfVxuICAvLyB0aGUgYXBpIG1heSByZXR1cm4gY2FzaGFkZHIncyBpbnN0ZWFkIG9mIGxlZ2FjeSBmb3IgQkNIIGFuZCBCQ0hBXG4gIC8vIGRvd25zdHJlYW0gcHJvY2Vzc2VzJ3Mgb25seSBleHBlY3QgbGVnYWN5IGFkZHJlc3Nlc1xuICByZXR1cm4gdW5zcGVudHMubWFwKChyZWNvdmVyeU91dHB1dCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvdmVyeU91dHB1dCxcbiAgICAgIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhyZWNvdmVyeU91dHB1dC5hZGRyZXNzKSxcbiAgICAgIHZhbHVlOiB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihCaWdJbnQocmVjb3ZlcnlPdXRwdXQudmFsdWUpLCBhbW91bnRUeXBlKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBEYXRhIHJlcXVpcmVkIGZvciBhZGRyZXNzIGFuZCBzaWduYXR1cmUgZGVyaXZhdGlvblxuICovXG50eXBlIFNjcmlwdElkID0ge1xuICBjaGFpbjogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0U2NyaXB0SWQoY29pbjogQWJzdHJhY3RVdHhvQ29pbiwgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjEsIHNjcmlwdDogQnVmZmVyKTogUHJvbWlzZTxTY3JpcHRJZD4ge1xuICBjb25zdCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0LCBjb2luLm5ldHdvcmspO1xuICBsZXQgYWRkcmVzc0RhdGE6IHsgY2hhaW46IG51bWJlcjsgaW5kZXg6IG51bWJlciB9O1xuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgYWRkcmVzc0RhdGEgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gIH0gZWxzZSB7XG4gICAgYWRkcmVzc0RhdGEgPSBhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5hZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGFkZHJlc3NEYXRhLmNoYWluID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYWRkcmVzc0RhdGEuaW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgY2hhaW46IGFkZHJlc3NEYXRhLmNoYWluLCBpbmRleDogYWRkcmVzc0RhdGEuaW5kZXggfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhZGRyZXNzIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoYWRkcmVzc0RhdGEpfWApO1xufVxuXG4vKipcbiAqIExvb2t1cCBhZGRyZXNzIGRhdGEgZnJvbSB1bnNwZW50cyBvbiBzb3VyY2VDb2luIGluIGFkZHJlc3MgZGF0YWJhc2Ugb2YgcmVjb3ZlcnlDb2luLlxuICogUmV0dXJuIGZ1bGwgd2FsbGV0VW5zcGVudHMgaW5jbHVkaW5nIHNjcmlwdElkIGluIHNvdXJjZUNvaW4gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VDb2luXG4gKiBAcGFyYW0gcmVjb3ZlcnlDb2luXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gd2FsbGV0VW5zcGVudHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9XYWxsZXRVbnNwZW50czxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgc291cmNlQ29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB1bnNwZW50czogVW5zcGVudDxUTnVtYmVyPltdLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMVxuKTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PFROdW1iZXI+W10+IHtcbiAgY29uc3QgYWRkcmVzc2VzID0gbmV3IFNldCh1bnNwZW50cy5tYXAoKHUpID0+IHUuYWRkcmVzcykpO1xuICBjb25zdCB3YWxsZXRVbnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdID0gW107XG5cbiAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGFkZHJlc3Nlcykge1xuICAgIGxldCBzY3JpcHRJZDtcbiAgICB0cnkge1xuICAgICAgc2NyaXB0SWQgPSBhd2FpdCBnZXRTY3JpcHRJZChyZWNvdmVyeUNvaW4sIHdhbGxldCwgdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIHNvdXJjZUNvaW4ubmV0d29yaykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGVycm9yIGdldHRpbmcgc2NyaXB0SWQgZm9yICR7YWRkcmVzc306YCwgZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyZWRVbnNwZW50cyA9IHVuc3BlbnRzXG4gICAgICAuZmlsdGVyKCh1KSA9PiB1LmFkZHJlc3MgPT09IGFkZHJlc3MpXG4gICAgICAubWFwKCh1KSA9PiAoe1xuICAgICAgICAuLi51LFxuICAgICAgICAuLi5zY3JpcHRJZCxcbiAgICAgIH0pKTtcbiAgICB3YWxsZXRVbnNwZW50cy5wdXNoKC4uLmZpbHRlcmVkVW5zcGVudHMpO1xuICB9XG5cbiAgcmV0dXJuIHdhbGxldFVuc3BlbnRzO1xufVxuXG4vKipcbiAqIEBwYXJhbSBjb2luXG4gKiBAcmV0dXJuIGZlZVJhdGUgZm9yIHRyYW5zYWN0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZlZVJhdGVTYXRWQihjb2luOiBBYnN0cmFjdFV0eG9Db2luKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgLy8gVE9ETzogdXNlIGZlZVJhdGUgQVBJXG4gIGNvbnN0IGZlZVJhdGUgPSB7XG4gICAgYmNoOiAyMCxcbiAgICB0YmNoOiAyMCxcbiAgICBiY2hhOiAyMCxcbiAgICB0YmNoYTogMjAsXG4gICAgYnN2OiAyMCxcbiAgICB0YnN2OiAyMCxcbiAgICBidGM6IDgwLFxuICAgIHRidGM6IDgwLFxuICAgIHRidGNzaWc6IDgwLFxuICAgIHRidGM0OiA4MCxcbiAgICB0YnRjYmdzaWc6IDgwLFxuICAgIGx0YzogMTAwLFxuICAgIHRsdGM6IDEwMCxcbiAgICBkb2dlOiAxMDAwLFxuICAgIHRkb2dlOiAxMDAwLFxuICB9W2NvaW4uZ2V0Q2hhaW4oKV07XG5cbiAgaWYgKCFmZWVSYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBmZWVSYXRlIGZvciAke2NvaW4uZ2V0Q2hhaW4oKX1gKTtcbiAgfVxuXG4gIHJldHVybiBmZWVSYXRlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB4cHJ2XG4gKiBAcGFyYW0gcGFzc3BocmFzZVxuICogQHBhcmFtIHdhbGxldFxuICogQHJldHVybiBzaWduaW5nIGtleVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQcnYoeHBydj86IHN0cmluZywgcGFzc3BocmFzZT86IHN0cmluZywgd2FsbGV0PzogSVdhbGxldCB8IFdhbGxldFYxKTogUHJvbWlzZTxCSVAzMkludGVyZmFjZT4ge1xuICBpZiAoeHBydikge1xuICAgIGNvbnN0IGtleSA9IGJpcDMyLmZyb21CYXNlNTgoeHBydik7XG4gICAgaWYgKGtleS5pc05ldXRlcmVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGlmICghd2FsbGV0IHx8ICFwYXNzcGhyYXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyB4cHJ2IGdpdmVuOiBuZWVkIHdhbGxldCBhbmQgcGFzc3BocmFzZSB0byBjb250aW51ZWApO1xuICB9XG5cbiAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nO1xuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgZW5jcnlwdGVkUHJ2ID0gKGF3YWl0IHdhbGxldC5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKSkuZW5jcnlwdGVkUHJ2O1xuICB9IGVsc2Uge1xuICAgIGVuY3J5cHRlZFBydiA9IChhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKSkuZW5jcnlwdGVkWHBydjtcbiAgfVxuXG4gIHJldHVybiBnZXRQcnYoZGVjcnlwdChwYXNzcGhyYXNlLCBlbmNyeXB0ZWRQcnYpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzd2VlcCB0cmFuc2FjdGlvbiBmb3IgY3Jvc3MtY2hhaW4gcmVjb3ZlcnkgdXNpbmcgUFNCVCAodXR4b2xpYiBpbXBsZW1lbnRhdGlvbilcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcGFyYW0gd2FsbGV0S2V5c1xuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gdGFyZ2V0QWRkcmVzc1xuICogQHBhcmFtIGZlZVJhdGVTYXRWQlxuICogQHJldHVybiB1bnNpZ25lZCBQU0JUXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb25VdHhvbGliPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdLFxuICB0YXJnZXRBZGRyZXNzOiBzdHJpbmcsXG4gIGZlZVJhdGVTYXRWQjogbnVtYmVyXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgaW5wdXRWYWx1ZSA9IHVuc3BlbnRTdW08YmlnaW50PihcbiAgICB1bnNwZW50cy5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBCaWdJbnQodS52YWx1ZSkgfSkpLFxuICAgICdiaWdpbnQnXG4gICk7XG4gIGNvbnN0IHZzaXplID0gRGltZW5zaW9ucy5mcm9tVW5zcGVudHModW5zcGVudHMsIHtcbiAgICBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogMSB9LFxuICAgIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSxcbiAgfSlcbiAgICAucGx1cyhEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCh0YXJnZXRBZGRyZXNzLCBuZXR3b3JrKSB9KSlcbiAgICAuZ2V0VlNpemUoKTtcbiAgY29uc3QgZmVlID0gQmlnSW50KE1hdGgucm91bmQodnNpemUgKiBmZWVSYXRlU2F0VkIpKTtcblxuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcmsgfSk7XG4gIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgd2FsbGV0S2V5cyk7XG5cbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIHV0eG9saWIuYml0Z28uYWRkV2FsbGV0VW5zcGVudFRvUHNidChcbiAgICAgIHBzYnQsXG4gICAgICB7IC4uLnVuc3BlbnQsIHZhbHVlOiBCaWdJbnQodW5zcGVudC52YWx1ZSkgfSxcbiAgICAgIHdhbGxldEtleXMsXG4gICAgICAndXNlcicsXG4gICAgICAnYmFja3VwJyxcbiAgICAgIHsgc2tpcE5vbldpdG5lc3NVdHhvOiB0cnVlIH1cbiAgICApO1xuICB9KTtcblxuICBjb25zdCByZWNvdmVyeU91dHB1dFNjcmlwdCA9IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCh0YXJnZXRBZGRyZXNzLCBuZXR3b3JrKTtcbiAgcHNidC5hZGRPdXRwdXQoeyBzY3JpcHQ6IHJlY292ZXJ5T3V0cHV0U2NyaXB0LCB2YWx1ZTogaW5wdXRWYWx1ZSAtIGZlZSB9KTtcblxuICByZXR1cm4gcHNidDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzd2VlcCB0cmFuc2FjdGlvbiBmb3IgY3Jvc3MtY2hhaW4gcmVjb3ZlcnkgdXNpbmcgd2FzbS11dHhvXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHBhcmFtIHdhbGxldEtleXNcbiAqIEBwYXJhbSB1bnNwZW50c1xuICogQHBhcmFtIHRhcmdldEFkZHJlc3NcbiAqIEBwYXJhbSBmZWVSYXRlU2F0VkJcbiAqIEByZXR1cm4gdW5zaWduZWQgUFNCVFxuICovXG5mdW5jdGlvbiBjcmVhdGVTd2VlcFRyYW5zYWN0aW9uV2FzbTxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICB3YWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgdGFyZ2V0QWRkcmVzczogc3RyaW5nLFxuICBmZWVSYXRlU2F0VkI6IG51bWJlclxuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IGlucHV0VmFsdWUgPSB1bnNwZW50U3VtPGJpZ2ludD4oXG4gICAgdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogQmlnSW50KHUudmFsdWUpIH0pKSxcbiAgICAnYmlnaW50J1xuICApO1xuXG4gIC8vIENyZWF0ZSBQU0JUIHdpdGggd2FzbS11dHhvIGFuZCBhZGQgd2FsbGV0IGlucHV0cyB1c2luZyBzaGFyZWQgdXRpbGl0aWVzXG4gIGNvbnN0IHVuc3BlbnRzQmlnaW50ID0gdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogQmlnSW50KHUudmFsdWUpIH0pKTtcbiAgY29uc3Qgd2FzbVBzYnQgPSBjcmVhdGVFbXB0eVdhc21Qc2J0KG5ldHdvcmssIHdhbGxldEtleXMpO1xuICBhZGRXYWxsZXRJbnB1dHNUb1dhc21Qc2J0KHdhc21Qc2J0LCB1bnNwZW50c0JpZ2ludCwgd2FsbGV0S2V5cyk7XG5cbiAgLy8gQ29udmVydCB0byB1dHhvbGliIFBTQlQgdGVtcG9yYXJpbHkgZm9yIGRpbWVuc2lvbiBjYWxjdWxhdGlvblxuICBjb25zdCB0ZW1wUHNidCA9IHdhc21Qc2J0VG9VdHhvbGliUHNidCh3YXNtUHNidCwgbmV0d29yayk7XG4gIGNvbnN0IHZzaXplID0gRGltZW5zaW9ucy5mcm9tUHNidCh0ZW1wUHNidClcbiAgICAucGx1cyhEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCh0YXJnZXRBZGRyZXNzLCBuZXR3b3JrKSB9KSlcbiAgICAuZ2V0VlNpemUoKTtcbiAgY29uc3QgZmVlID0gQmlnSW50KE1hdGgucm91bmQodnNpemUgKiBmZWVSYXRlU2F0VkIpKTtcblxuICAvLyBBZGQgb3V0cHV0IHRvIHdhc20gUFNCVFxuICBhZGRPdXRwdXRUb1dhc21Qc2J0KHdhc21Qc2J0LCB0YXJnZXRBZGRyZXNzLCBpbnB1dFZhbHVlIC0gZmVlLCBuZXR3b3JrKTtcblxuICAvLyBDb252ZXJ0IHRvIHV0eG9saWIgUFNCVCBmb3Igc2lnbmluZyBhbmQgcmV0dXJuXG4gIHJldHVybiB3YXNtUHNidFRvVXR4b2xpYlBzYnQod2FzbVBzYnQsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN3ZWVwIHRyYW5zYWN0aW9uIGZvciBjcm9zcy1jaGFpbiByZWNvdmVyeSB1c2luZyBQU0JUXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHBhcmFtIHdhbGxldEtleXNcbiAqIEBwYXJhbSB1bnNwZW50c1xuICogQHBhcmFtIHRhcmdldEFkZHJlc3NcbiAqIEBwYXJhbSBmZWVSYXRlU2F0VkJcbiAqIEBwYXJhbSBiYWNrZW5kIC0gV2hpY2ggYmFja2VuZCB0byB1c2UgZm9yIFBTQlQgY3JlYXRpb24gKGRlZmF1bHQ6ICd3YXNtLXV0eG8nKVxuICogQHJldHVybiB1bnNpZ25lZCBQU0JUXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHRhcmdldEFkZHJlc3M6IHN0cmluZyxcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXIsXG4gIGJhY2tlbmQ6IFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bydcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBpZiAoYmFja2VuZCA9PT0gJ3dhc20tdXR4bycpIHtcbiAgICByZXR1cm4gY3JlYXRlU3dlZXBUcmFuc2FjdGlvbldhc20obmV0d29yaywgd2FsbGV0S2V5cywgdW5zcGVudHMsIHRhcmdldEFkZHJlc3MsIGZlZVJhdGVTYXRWQik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb25VdHhvbGliKG5ldHdvcmssIHdhbGxldEtleXMsIHVuc3BlbnRzLCB0YXJnZXRBZGRyZXNzLCBmZWVSYXRlU2F0VkIpO1xuICB9XG59XG5cbnR5cGUgUmVjb3ZlclBhcmFtcyA9IHtcbiAgLyoqIFdhbGxldCBJRCAoY2FuIGJlIHYxIHdhbGxldCBvciB2MiB3YWxsZXQpICovXG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIC8qKiBDb2luIHRvIGNyZWF0ZSB0aGUgdHJhbnNhY3Rpb24gZm9yICovXG4gIHNvdXJjZUNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIC8qKiBDb2luIHRoYXQgd2FsbGV0IGtleXMgd2VyZSBzZXQgdXAgZm9yICovXG4gIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbjtcbiAgLyoqIFNvdXJjZSBjb2luIHRyYW5zYWN0aW9uIHRvIHJlY292ZXIgb3V0cHV0cyBmcm9tIChzb3VyY2VDb2luKSAqL1xuICB0eGlkOiBzdHJpbmc7XG4gIC8qKiBTb3VyY2UgY29pbiBhZGRyZXNzIHRvIHNlbmQgdGhlIGZ1bmRzIHRvICovXG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xuICAvKiogSWYgc2V0LCBkZWNyeXB0cyBwcml2YXRlIGtleSBhbmQgc2lnbnMgdHJhbnNhY3Rpb24gKi9cbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgLyoqIElmIHNldCwgc2lnbnMgdHJhbnNhY3Rpb24gKi9cbiAgeHBydj86IHN0cmluZztcbiAgLyoqIGZvciB1dHhvIGNvaW5zIG90aGVyIHRoYW4gW0JUQyxUQlRDXSB0aGlzIGlzIGEgQmxvY2sgQ2hhaXIgYXBpIGtleSAqKi9cbiAgYXBpS2V5Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBSZWNvdmVyIHdhbGxldCBkZXBvc2l0cyB0aGF0IHdlcmUgcmVjZWl2ZWQgb24gdGhlIHdyb25nIGJsb2NrY2hhaW5cbiAqIChmb3IgaW5zdGFuY2UgYml0Y29pbiBkZXBvc2l0cyB0aGF0IHdlcmUgcmVjZWl2ZWQgZm9yIGEgbGl0ZWNvaW4gd2FsbGV0KS5cbiAqXG4gKiBGZXRjaGVzIHRoZSB1bnNwZW50IGRhdGEgZnJvbSBCaXRHbydzIHB1YmxpYyBibG9ja2NoYWluIEFQSSBhbmQgdGhlIHNjcmlwdCBkYXRhIGZyb20gdGhlIHVzZXInc1xuICogd2FsbGV0LlxuICpcbiAqIEBwYXJhbSB7Qml0R29CYXNlfSBiaXRnb1xuICogQHBhcmFtIHtSZWNvdmVyUGFyYW1zfSBwYXJhbXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJDcm9zc0NoYWluPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBiaXRnbzogQml0R29CYXNlLFxuICBwYXJhbXM6IFJlY292ZXJQYXJhbXNcbik6IFByb21pc2U8Q3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXI+IHwgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlcj4+IHtcbiAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgZ2V0V2FsbGV0KGJpdGdvLCBwYXJhbXMucmVjb3ZlcnlDb2luLCBwYXJhbXMud2FsbGV0SWQpO1xuICBjb25zdCB1bnNwZW50cyA9IGF3YWl0IGdldEFsbFJlY292ZXJ5T3V0cHV0czxUTnVtYmVyPihcbiAgICBwYXJhbXMuc291cmNlQ29pbixcbiAgICBwYXJhbXMudHhpZCxcbiAgICBwYXJhbXMuc291cmNlQ29pbi5hbW91bnRUeXBlLFxuICAgIHdhbGxldCxcbiAgICBwYXJhbXMuYXBpS2V5XG4gICk7XG4gIGNvbnN0IHdhbGxldFVuc3BlbnRzID0gYXdhaXQgdG9XYWxsZXRVbnNwZW50czxUTnVtYmVyPihwYXJhbXMuc291cmNlQ29pbiwgcGFyYW1zLnJlY292ZXJ5Q29pbiwgdW5zcGVudHMsIHdhbGxldCk7XG4gIGNvbnN0IHdhbGxldEtleXMgPSBhd2FpdCBnZXRXYWxsZXRLZXlzKHBhcmFtcy5yZWNvdmVyeUNvaW4sIHdhbGxldCk7XG4gIGNvbnN0IHBydiA9XG4gICAgcGFyYW1zLnhwcnYgfHwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgPyBhd2FpdCBnZXRQcnYocGFyYW1zLnhwcnYsIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCB3YWxsZXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBmZWVSYXRlU2F0VkIgPSBhd2FpdCBnZXRGZWVSYXRlU2F0VkIocGFyYW1zLnNvdXJjZUNvaW4pO1xuXG4gIC8vIENyZWF0ZSBQU0JUIGZvciBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgcmVjb3ZlcnlcbiAgLy8gVXNlIHdhc20tdXR4byBmb3IgdGVzdG5ldCBjb2lucyBvbmx5LCB1dHhvbGliIGZvciBtYWlubmV0XG4gIGNvbnN0IGJhY2tlbmQ6IFBzYnRCYWNrZW5kID0gdXR4b2xpYi5pc1Rlc3RuZXQocGFyYW1zLnNvdXJjZUNvaW4ubmV0d29yaykgPyAnd2FzbS11dHhvJyA6ICd1dHhvbGliJztcbiAgY29uc3QgcHNidCA9IGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb248VE51bWJlcj4oXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4ubmV0d29yayxcbiAgICB3YWxsZXRLZXlzLFxuICAgIHdhbGxldFVuc3BlbnRzLFxuICAgIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MsXG4gICAgZmVlUmF0ZVNhdFZCLFxuICAgIGJhY2tlbmRcbiAgKTtcblxuICAvLyBGb3IgdW5zaWduZWQgcmVjb3ZlcnksIHJldHVybiB1bnNpZ25lZCBQU0JUIGhleFxuICBpZiAoIXBydikge1xuICAgIHJldHVybiB7XG4gICAgICB0eEhleDogcHNidC50b0hleCgpLFxuICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICAgIGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MsXG4gICAgICBjb2luOiBwYXJhbXMuc291cmNlQ29pbi5nZXRDaGFpbigpLFxuICAgIH07XG4gIH1cblxuICAvLyBGb3Igc2lnbmVkIHJlY292ZXJ5LCBzaWduIHRoZSBQU0JUIHdpdGggdXNlciBrZXkgYW5kIHJldHVybiBoYWxmLXNpZ25lZCBQU0JUXG4gIHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIHBydiwgeyBpc0xhc3RTaWduYXR1cmU6IGZhbHNlIH0pO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KHBzYnQudHhPdXRwdXRzWzBdLnZhbHVlLCBwYXJhbXMuc291cmNlQ29pbi5hbW91bnRUeXBlKTtcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCA/IDIgOiAxLFxuICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0SWQsXG4gICAgdHhIZXg6IHBzYnQudG9IZXgoKSxcbiAgICBzb3VyY2VDb2luOiBwYXJhbXMuc291cmNlQ29pbi5nZXRDaGFpbigpLFxuICAgIHJlY292ZXJ5Q29pbjogcGFyYW1zLnJlY292ZXJ5Q29pbi5nZXRDaGFpbigpLFxuICAgIHJlY292ZXJ5QW1vdW50LFxuICB9O1xufVxuIl19
@@ -0,0 +1,84 @@
1
+ import * as utxolib from '@bitgo/utxo-lib';
2
+ import { fixedScriptWallet, utxolibCompat } from '@bitgo/wasm-utxo';
3
+ type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
4
+ type WalletUnspent<TNumber extends number | bigint> = utxolib.bitgo.WalletUnspent<TNumber>;
5
+ type ChainCode = utxolib.bitgo.ChainCode;
6
+ /**
7
+ * Backend to use for PSBT creation.
8
+ * - 'wasm-utxo': Use wasm-utxo for PSBT creation (default)
9
+ * - 'utxolib': Use utxolib for PSBT creation (legacy)
10
+ */
11
+ export type PsbtBackend = 'wasm-utxo' | 'utxolib';
12
+ /**
13
+ * Check if a chain code is for a taproot script type
14
+ */
15
+ export declare function isTaprootChain(chain: ChainCode): boolean;
16
+ /**
17
+ * Convert utxolib Network to wasm-utxo network name
18
+ */
19
+ export declare function toNetworkName(network: utxolib.Network): utxolibCompat.UtxolibName;
20
+ interface CreateBackupKeyRecoveryPsbtOptions {
21
+ feeRateSatVB: number;
22
+ recoveryDestination: string;
23
+ keyRecoveryServiceFee: bigint;
24
+ keyRecoveryServiceFeeAddress: string | undefined;
25
+ /** Block height for Zcash networks (required to determine consensus branch ID) */
26
+ blockHeight?: number;
27
+ }
28
+ /**
29
+ * Options for creating an empty wasm-utxo PSBT
30
+ */
31
+ export interface CreateEmptyWasmPsbtOptions {
32
+ /** Block height for Zcash networks (required to determine consensus branch ID) */
33
+ blockHeight?: number;
34
+ }
35
+ /**
36
+ * Create an empty wasm-utxo BitGoPsbt for a given network.
37
+ * Handles Zcash networks specially by using ZcashBitGoPsbt.
38
+ *
39
+ * @param network - The network for the PSBT
40
+ * @param rootWalletKeys - The wallet keys
41
+ * @param options - Optional settings (e.g., blockHeight for Zcash)
42
+ * @returns A wasm-utxo BitGoPsbt instance
43
+ */
44
+ export declare function createEmptyWasmPsbt(network: utxolib.Network, rootWalletKeys: RootWalletKeys, options?: CreateEmptyWasmPsbtOptions): fixedScriptWallet.BitGoPsbt;
45
+ /**
46
+ * Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
47
+ * Handles taproot inputs by setting the appropriate signPath.
48
+ *
49
+ * @param wasmPsbt - The wasm-utxo BitGoPsbt to add inputs to
50
+ * @param unspents - The wallet unspents to add as inputs
51
+ * @param rootWalletKeys - The wallet keys
52
+ */
53
+ export declare function addWalletInputsToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, unspents: WalletUnspent<bigint>[], rootWalletKeys: RootWalletKeys): void;
54
+ /**
55
+ * Add an output to a wasm-utxo BitGoPsbt.
56
+ *
57
+ * @param wasmPsbt - The wasm-utxo BitGoPsbt to add the output to
58
+ * @param address - The destination address
59
+ * @param value - The output value in satoshis
60
+ * @param network - The network (used to convert address to script)
61
+ * @returns The output index
62
+ */
63
+ export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, address: string, value: bigint, network: utxolib.Network): number;
64
+ /**
65
+ * Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
66
+ *
67
+ * @param wasmPsbt - The wasm-utxo BitGoPsbt to convert
68
+ * @param network - The network
69
+ * @returns A utxolib UtxoPsbt
70
+ */
71
+ export declare function wasmPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
72
+ /**
73
+ * Create a backup key recovery PSBT.
74
+ *
75
+ * @param network - The network for the PSBT
76
+ * @param rootWalletKeys - The wallet keys
77
+ * @param unspents - The unspents to include in the PSBT
78
+ * @param options - Options for creating the PSBT
79
+ * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
80
+ */
81
+ export declare function createBackupKeyRecoveryPsbt(network: utxolib.Network, rootWalletKeys: RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions, backend?: PsbtBackend): utxolib.bitgo.UtxoPsbt;
82
+ export declare function getRecoveryAmount(psbt: utxolib.bitgo.UtxoPsbt, address: string): bigint;
83
+ export {};
84
+ //# sourceMappingURL=psbt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEpE,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AACnD,KAAK,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAI3F,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAElD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,WAAW,CAMjF;AAmBD,UAAU,kCAAkC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,0BAA0B,GACnC,iBAAiB,CAAC,SAAS,CAY7B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,cAAc,EAAE,cAAc,GAC7B,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAExB;AAkDD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,OAAO,EAAE,kCAAkC,EAC3C,OAAO,GAAE,WAAyB,GACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAUxB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOvF"}