@bitgo/sdk-coin-iota 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/iota.js CHANGED
@@ -231,11 +231,13 @@ class Iota extends sdk_core_1.BaseCoin {
231
231
  *
232
232
  * @param {IotaRecoveryOptions} params parameters needed to construct and
233
233
  * (maybe) sign the transaction
234
+ * @param {EddsaSigningMaterial} [precomputedMaterial] signing material detected once by the
235
+ * caller (e.g. recoverConsolidations) to avoid re-decrypting the keycard on every loop iteration
234
236
  *
235
237
  * @returns {MPCTx | MPCSweepTxs} array of the serialized transaction hex strings and indices
236
238
  * of the addresses being swept
237
239
  */
238
- async recover(params) {
240
+ async recover(params, precomputedMaterial) {
239
241
  if (!params.bitgoKey) {
240
242
  throw new Error('Missing bitgoKey');
241
243
  }
@@ -247,8 +249,6 @@ class Iota extends sdk_core_1.BaseCoin {
247
249
  const endIdx = startIdx + numIterations;
248
250
  const bitgoKey = params.bitgoKey.replace(/\s/g, '');
249
251
  const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
250
- // Detect MPCv2 keycard format once up front, to avoid decrypting on every scan iteration.
251
- const isMpcV2 = await this.isMpcv2SigningMaterial(params.userKey, params.backupKey, params.walletPassphrase);
252
252
  for (let idx = startIdx; idx < endIdx; idx++) {
253
253
  const derivationPath = (params.seed ? (0, sdk_lib_mpc_1.getDerivationPath)(params.seed) : 'm') + `/${idx}`;
254
254
  const derivedPublicKey = MPC.deriveUnhardened(bitgoKey, derivationPath).slice(0, 64);
@@ -269,7 +269,7 @@ class Iota extends sdk_core_1.BaseCoin {
269
269
  continue;
270
270
  }
271
271
  try {
272
- return await this.recoverIotaToken(params, tokenObjects, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, isMpcV2);
272
+ return await this.recoverIotaToken(params, tokenObjects, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, precomputedMaterial);
273
273
  }
274
274
  catch (e) {
275
275
  continue;
@@ -311,7 +311,7 @@ class Iota extends sdk_core_1.BaseCoin {
311
311
  // Build transaction for signing
312
312
  const unsignedTx = (await txBuilder.build());
313
313
  // Sign the transaction with decrypted keys
314
- const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, isMpcV2, bitgoKey);
314
+ const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, precomputedMaterial);
315
315
  // Build and return signed transaction
316
316
  const finalTx = (await txBuilder.build());
317
317
  const serializedTx = await finalTx.toBroadcastFormat();
@@ -365,6 +365,11 @@ class Iota extends sdk_core_1.BaseCoin {
365
365
  throw new Error(`Invalid starting or ending index to scan for addresses. startingScanIndex: ${startIdx}, endingScanIndex: ${endIdx}.`);
366
366
  }
367
367
  const bitgoKey = params.bitgoKey.replace(/\s/g, '');
368
+ const userKey = params.userKey?.replace(/\s/g, '');
369
+ // Detect signing material once to avoid re-decrypting the keycard on every loop iteration.
370
+ const signingMaterial = userKey && params.walletPassphrase
371
+ ? await this.getEddsaSigningMaterial(userKey, params.walletPassphrase)
372
+ : undefined;
368
373
  const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
369
374
  const basePath = (params.seed ? (0, sdk_lib_mpc_1.getDerivationPath)(params.seed) : 'm') + '/0';
370
375
  const derivedBasePublicKey = MPC.deriveUnhardened(bitgoKey, basePath).slice(0, 64);
@@ -385,7 +390,7 @@ class Iota extends sdk_core_1.BaseCoin {
385
390
  };
386
391
  let recoveryTransaction;
387
392
  try {
388
- recoveryTransaction = await this.recover(recoverParams);
393
+ recoveryTransaction = await this.recover(recoverParams, signingMaterial);
389
394
  }
390
395
  catch (e) {
391
396
  if (e.message.startsWith('Did not find an address with sufficient funds to recover.')) {
@@ -550,7 +555,7 @@ class Iota extends sdk_core_1.BaseCoin {
550
555
  const gasBudget = Math.min(constants_1.MAX_GAS_BUDGET, Math.trunc(estimatedGas * constants_1.DEFAULT_GAS_OVERHEAD));
551
556
  return { gasBudget, gasPrice, gasObjects, totalBalance };
552
557
  }
553
- async recoverIotaToken(params, tokenObjectsWithBalance, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, isMpcV2) {
558
+ async recoverIotaToken(params, tokenObjectsWithBalance, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, precomputedMaterial) {
554
559
  tokenObjectsWithBalance = tokenObjectsWithBalance.sort((a, b) => (BigInt(b.balance) > BigInt(a.balance) ? 1 : -1));
555
560
  if (tokenObjectsWithBalance.length > constants_1.MAX_OBJECT_LIMIT) {
556
561
  tokenObjectsWithBalance = tokenObjectsWithBalance.slice(0, constants_1.MAX_OBJECT_LIMIT);
@@ -597,7 +602,7 @@ class Iota extends sdk_core_1.BaseCoin {
597
602
  return this.buildUnsignedSweepTransaction(txBuilder, senderAddress, bitgoKey, idx, derivationPath, params.tokenContractAddress);
598
603
  }
599
604
  const unsignedTx = (await txBuilder.build());
600
- const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, isMpcV2, bitgoKey);
605
+ const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, precomputedMaterial);
601
606
  const finalTx = (await txBuilder.build());
602
607
  const serializedTx = await finalTx.toBroadcastFormat();
603
608
  return {
@@ -613,17 +618,21 @@ class Iota extends sdk_core_1.BaseCoin {
613
618
  lastScanIndex: idx,
614
619
  };
615
620
  }
616
- async isMpcv2SigningMaterial(userKey, backupKey, walletPassphrase) {
617
- if (!walletPassphrase)
618
- return false;
619
- if (!userKey)
620
- throw new Error('missing userKey');
621
- if (!backupKey)
622
- throw new Error('missing backupKey');
623
- const material = await (0, sdk_core_1.getEddsaSigningMaterial)(userKey.replace(/\s/g, ''), walletPassphrase, this.bitgo);
624
- return material.version === 'v2';
621
+ /**
622
+ * Detects MPCv1 vs MPCv2 keycard format and returns typed signing material.
623
+ * Wrapped as a protected method so sinon can stub it in tests (matching DOT/SUI).
624
+ */
625
+ async getEddsaSigningMaterial(userKey, walletPassphrase) {
626
+ return (0, sdk_core_1.getEddsaSigningMaterial)(userKey, walletPassphrase, this.bitgo);
627
+ }
628
+ /**
629
+ * Runs the MPCv2 (MPS) recovery signing flow and returns the raw 64-byte Ed25519 signature.
630
+ * Wrapped as a protected method so sinon can stub it in tests (matching DOT/SUI).
631
+ */
632
+ async signIotaMpcV2Recovery(params) {
633
+ return (0, sdk_core_1.signEddsaMpcV2RecoveryTx)(params);
625
634
  }
626
- async signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, isMpcV2, bitgoKey) {
635
+ async signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, precomputedMaterial) {
627
636
  if (!params.userKey) {
628
637
  throw new Error('missing userKey');
629
638
  }
@@ -635,17 +644,22 @@ class Iota extends sdk_core_1.BaseCoin {
635
644
  }
636
645
  const userKey = params.userKey.replace(/\s/g, '');
637
646
  const backupKey = params.backupKey.replace(/\s/g, '');
647
+ const bitgoKey = params.bitgoKey.replace(/\s/g, '');
648
+ const signingMaterial = precomputedMaterial ?? (await this.getEddsaSigningMaterial(userKey, params.walletPassphrase));
638
649
  let signatureBuffer;
639
- if (!isMpcV2) {
640
- // Decrypt private keys from KeyCard values
641
- let userPrv;
642
- try {
643
- userPrv = await this.bitgo.decrypt({ input: userKey, password: params.walletPassphrase });
644
- }
645
- catch (e) {
646
- throw new Error(`Error decrypting user keychain: ${e.message}`);
647
- }
648
- const userSigningMaterial = JSON.parse(userPrv);
650
+ if (signingMaterial.version === 'v2') {
651
+ signatureBuffer = await this.signIotaMpcV2Recovery({
652
+ message: unsignedTx.signablePayload,
653
+ userKey: signingMaterial.encryptedUserKey,
654
+ backupKey,
655
+ walletPassphrase: params.walletPassphrase,
656
+ bitgoKey,
657
+ derivationPath,
658
+ bitgo: this.bitgo,
659
+ });
660
+ }
661
+ else {
662
+ const userSigningMaterial = JSON.parse(signingMaterial.userPrv);
649
663
  let backupPrv;
650
664
  try {
651
665
  backupPrv = await this.bitgo.decrypt({ input: backupKey, password: params.walletPassphrase });
@@ -657,17 +671,6 @@ class Iota extends sdk_core_1.BaseCoin {
657
671
  // Generate TSS signature
658
672
  signatureBuffer = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, derivationPath, unsignedTx);
659
673
  }
660
- else {
661
- signatureBuffer = await (0, sdk_core_1.signEddsaMpcV2RecoveryTx)({
662
- message: unsignedTx.signablePayload,
663
- userKey,
664
- backupKey,
665
- walletPassphrase: params.walletPassphrase,
666
- bitgoKey,
667
- derivationPath,
668
- bitgo: this.bitgo,
669
- });
670
- }
671
674
  // Build full signature: scheme_flag (1 byte) + signature (64 bytes) + public_key (32 bytes)
672
675
  const schemeFlag = Buffer.alloc(1, 0x00); // Ed25519 scheme
673
676
  const publicKeyBytes = Buffer.from(derivedPublicKey, 'hex');
@@ -894,4 +897,4 @@ class Iota extends sdk_core_1.BaseCoin {
894
897
  }
895
898
  }
896
899
  exports.Iota = Iota;
897
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQStCeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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QixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZrQ0Qsb0JBdWtDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBFRERTQU1ldGhvZHMsXG4gIEVERFNBTWV0aG9kVHlwZXMsXG4gIEVudmlyb25tZW50cyxcbiAgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyxcbiAgTVBDUmVjb3ZlcnlPcHRpb25zLFxuICBNUENTd2VlcFR4cyxcbiAgTVBDVHgsXG4gIE1QQ1R4cyxcbiAgTVBDVHlwZSxcbiAgTVBDVW5zaWduZWRUeCxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUG9wdWxhdGVkSW50ZW50LFxuICBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMsXG4gIFJlY292ZXJ5VHhSZXF1ZXN0LFxuICBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbiAgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9HQVNfT1ZFUkhFQUQsXG4gIERFRkFVTFRfU0NBTl9GQUNUT1IsXG4gIE1BWF9HQVNfQlVER0VULFxuICBNQVhfR0FTX09CSkVDVFMsXG4gIE1BWF9PQkpFQ1RfTElNSVQsXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtNUENUeCB8IE1QQ1N3ZWVwVHhzfSBhcnJheSBvZiB0aGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXggc3RyaW5ncyBhbmQgaW5kaWNlc1xuICAgKiBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nIHN3ZXB0XG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBpZiAoIXBhcmFtcy5iaXRnb0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJpdGdvS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKDAsICdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsIHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCk7XG4gICAgY29uc3QgbnVtSXRlcmF0aW9ucyA9IHV0aWxzLmdldFNhZmVOdW1iZXIoREVGQVVMVF9TQ0FOX0ZBQ1RPUiwgJ0ludmFsaWQgc2Nhbm5pbmcgZmFjdG9yJywgcGFyYW1zLnNjYW4pO1xuICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgbnVtSXRlcmF0aW9ucztcbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICAvLyBEZXRlY3QgTVBDdjIga2V5Y2FyZCBmb3JtYXQgb25jZSB1cCBmcm9udCwgdG8gYXZvaWQgZGVjcnlwdGluZyBvbiBldmVyeSBzY2FuIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBpc01wY1YyID0gYXdhaXQgdGhpcy5pc01wY3YyU2lnbmluZ01hdGVyaWFsKHBhcmFtcy51c2VyS2V5LCBwYXJhbXMuYmFja3VwS2V5LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAocGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgOiAnbScpICsgYC8ke2lkeH1gO1xuICAgICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBkZXJpdmF0aW9uUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGRlcml2ZWRQdWJsaWNLZXkpO1xuXG4gICAgICAvLyBUb2tlbiByZWNvdmVyeSBwYXRoOiByZWNvdmVyIHRoZSB0b2tlbiBwcm92aWRlZCBieSB1c2VyXG4gICAgICBpZiAocGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3MsIHBhcmFtcykpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG9rZW5PYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b2tlbk9iamVjdHMgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIHBhcmFtcy5mdWxsbm9kZVJwY1VybCxcbiAgICAgICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbk9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY292ZXJJb3RhVG9rZW4oXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB0b2tlbk9iamVjdHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgYml0Z29LZXksXG4gICAgICAgICAgICBpc01wY1YyXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBvd25lZE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENhcCBvYmplY3RzIHRvIHByZXZlbnQgb3ZlcnNpemVkIHRyYW5zYWN0aW9ucyAoSU9UQSBtYXggdHggc2l6ZSA9IDEyOCBLaUIpXG4gICAgICBpZiAob3duZWRPYmplY3RzLmxlbmd0aCA+IE1BWF9HQVNfT0JKRUNUUykge1xuICAgICAgICBvd25lZE9iamVjdHMgPSBvd25lZE9iamVjdHNcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKVxuICAgICAgICAgIC5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgICAgb3duZWRPYmplY3RzLFxuICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBwYXJhbXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ldEJhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcblxuICAgICAgaWYgKG5ldEJhbGFuY2UgPD0gMG4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNvdmVyeUFtb3VudCA9IG5ldEJhbGFuY2UudG9TdHJpbmcoKTtcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogcmVjb3ZlcnlBbW91bnQgfV0pXG4gICAgICAgIC5nYXNEYXRhKHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzUGF5bWVudE9iamVjdHM6IGdhc09iamVjdHMgfSk7XG5cbiAgICAgIC8vIFJldHVybiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBmb3IgY29sZC9jdXN0b2R5IHdhbGxldHNcbiAgICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24odHhCdWlsZGVyLCBzZW5kZXJBZGRyZXNzLCBiaXRnb0tleSwgaWR4LCBkZXJpdmF0aW9uUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHRyYW5zYWN0aW9uIGZvciBzaWduaW5nXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBTaWduIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCBrZXlzXG4gICAgICBjb25zdCBmdWxsU2lnbmF0dXJlQmFzZTY0ID0gYXdhaXQgdGhpcy5zaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICAgICAgdHhCdWlsZGVyLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgICB1bnNpZ25lZFR4LFxuICAgICAgICBpc01wY1YyLFxuICAgICAgICBiaXRnb0tleVxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIGAgK1xuICAgICAgICBgU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAke3N0YXJ0SWR4fSB0byAke2VuZElkeCAtIDF9LiBgICtcbiAgICAgICAgYFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtlbmRJZHh9LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhvbGRzIGEgcG9zaXRpdmUgYmFsYW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzczogc3RyaW5nLCBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuZ2V0QmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwsIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICByZXR1cm4gYmFsYW5jZSA+IDBuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKGUgYXMgRXJyb3IpLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuJykpIHtcbiAgICAgICAgICBsYXN0U2NhbkluZGV4ID0gaWR4O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1N3ZWVwVHhzKS50eFJlcXVlc3RzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCgocmVjb3ZlcnlUcmFuc2FjdGlvbiBhcyBNUENUeHMpLnRyYW5zYWN0aW9uc1swXSk7XG4gICAgICB9XG4gICAgICBsYXN0U2NhbkluZGV4ID0gaWR4O1xuICAgIH1cblxuICAgIGlmIChjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtcbiAgICAgICAgICBsYXN0U2NhbkluZGV4ICsgMVxuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9uc1tcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggLSAxXG4gICAgICBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpYy5sYXN0U2NhbkluZGV4ID0gbGFzdFNjYW5JbmRleDtcbiAgICAgIHJldHVybiB7IHR4UmVxdWVzdHM6IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0cmFuc2FjdGlvbnM6IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMsIGxhc3RTY2FuSW5kZXggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0b3RhbCBjb2luIGJhbGFuY2UgZm9yIGFuIGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gSU9UQSBhZGRyZXNzIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEBwYXJhbSBjb2luVHlwZSAtIE9wdGlvbmFsIGNvaW4gdHlwZSAoZGVmYXVsdHMgdG8gbmF0aXZlIElPVEEpXG4gICAqIEByZXR1cm5zIFRvdGFsIGJhbGFuY2UgYXMgYSBiaWdpbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QmFsYW5jZShhZGRyZXNzOiBzdHJpbmcsIHJwY1VybD86IHN0cmluZywgY29pblR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCBub3JtYWxpemVkQ29pblR5cGUgPSBjb2luVHlwZSB8fCB0aGlzLmdldE5hdGl2ZUNvaW5UeXBlKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldEJhbGFuY2UnLCBbYWRkcmVzcywgbm9ybWFsaXplZENvaW5UeXBlXSk7XG4gICAgcmV0dXJuIEJpZ0ludChyZXNwb25zZS50b3RhbEJhbGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgb3duZWQgb2JqZWN0cyBmb3IgYW4gYWRkcmVzcyB2aWEgZnVsbG5vZGUgUlBDLlxuICAgKiBIYW5kbGVzIHBhZ2luYXRpb24gdG8gcmV0cmlldmUgYWxsIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gSU9UQSBhZGRyZXNzIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEBwYXJhbSBjb2luVHlwZSAtIE9wdGlvbmFsIGNvaW4gdHlwZSB0byBmaWx0ZXIgb2JqZWN0cyAoZGVmYXVsdHMgdG8gbmF0aXZlIElPVEEpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIG93bmVkIG9iamVjdHMgd2l0aCBiYWxhbmNlIGluZm9ybWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoT3duZWRPYmplY3RzKFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBycGNVcmw/OiBzdHJpbmcsXG4gICAgY29pblR5cGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCBhbGxPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSA9IFtdO1xuICAgIGNvbnN0IGlubmVyQ29pblR5cGUgPSBjb2luVHlwZSB8fCB0aGlzLmdldE5hdGl2ZUNvaW5UeXBlKCk7XG4gICAgY29uc3Qgc3RydWN0VHlwZSA9IGAweDI6OmNvaW46OkNvaW48JHtpbm5lckNvaW5UeXBlfT5gO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNOZXh0UGFnZSA9IHRydWU7XG4gICAgY29uc3QgTUFYX1BBR0VTID0gNTAwO1xuICAgIGxldCBwYWdlQ291bnQgPSAwO1xuICAgIHdoaWxlIChoYXNOZXh0UGFnZSAmJiBwYWdlQ291bnQgPCBNQVhfUEFHRVMpIHtcbiAgICAgIHBhZ2VDb3VudCsrO1xuICAgICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICAgIGZpbHRlcjogeyBTdHJ1Y3RUeXBlOiBzdHJ1Y3RUeXBlIH0sXG4gICAgICAgIG9wdGlvbnM6IHsgc2hvd0NvbnRlbnQ6IHRydWUsIHNob3dUeXBlOiB0cnVlIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0T3duZWRPYmplY3RzJywgW2FkZHJlc3MsIHF1ZXJ5LCBjdXJzb3IsIDUwXSk7XG4gICAgICBjb25zdCB7IGRhdGEsIG5leHRDdXJzb3IsIGhhc05leHRQYWdlOiBtb3JlIH0gPSByZXNwb25zZTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEgfHwgW10pIHtcbiAgICAgICAgY29uc3QgeyBvYmplY3RJZCwgdmVyc2lvbiwgZGlnZXN0IH0gPSBpdGVtLmRhdGE7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSBpdGVtLmRhdGEuY29udGVudD8uZmllbGRzPy5iYWxhbmNlIHx8ICcwJztcbiAgICAgICAgaWYgKEJpZ0ludChiYWxhbmNlKSA+IDBuKSB7XG4gICAgICAgICAgYWxsT2JqZWN0cy5wdXNoKHsgb2JqZWN0SWQsIHZlcnNpb246IHZlcnNpb24udG9TdHJpbmcoKSwgZGlnZXN0LCBiYWxhbmNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0Q3Vyc29yID09PSBjdXJzb3IpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBoYXNOZXh0UGFnZSA9IG1vcmU7XG4gICAgICBjdXJzb3IgPSBuZXh0Q3Vyc29yO1xuICAgIH1cblxuICAgIGlmIChwYWdlQ291bnQgPj0gTUFYX1BBR0VTKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGZldGNoT3duZWRPYmplY3RzOiBIaXQgbWF4IHBhZ2UgbGltaXQgKCR7TUFYX1BBR0VTfSkgZm9yICR7YWRkcmVzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbE9iamVjdHM7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgSlNPTi1SUEMgY2FsbCB0byBJT1RBIGZ1bGxub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gRnVsbG5vZGUgUlBDIFVSTFxuICAgKiBAcGFyYW0gbWV0aG9kIC0gUlBDIG1ldGhvZCBuYW1lXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBSUEMgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBSUEMgcmVzdWx0XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgUlBDIGNhbGwgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJwY0NhbGwodXJsOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAxLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSUEMgY2FsbCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChqc29uLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQQyBlcnJvcjogJHtqc29uLmVycm9yLm1lc3NhZ2UgfHwgSlNPTi5zdHJpbmdpZnkoanNvbi5lcnJvcil9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb24ucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHB1YmxpYyBub2RlIFJQQyBVUkwgZnJvbSB0aGUgY2VudHJhbGl6ZWQgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgUlBDIFVSTCBmb3IgdGhlIGN1cnJlbnQgQml0R28gZW52aXJvbm1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRQdWJsaWNOb2RlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5pb3RhTm9kZVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYXRpdmUgY29pbiB0eXBlIGlkZW50aWZpZXIgZm9yIGZpbHRlcmluZyBvd25lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyBOYXRpdmUgY29pbiB0eXBlIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXROYXRpdmVDb2luVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnMHgyOjppb3RhOjpJT1RBJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBnYXMgY29uZmlndXJhdGlvbiBmb3IgYSByZWNvdmVyeSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogR2FzIGVzdGltYXRpb24gaXMgZG9uZSB2aWEgYSBkcnktcnVuIG9mIGEgdGVtcG9yYXJ5IHRyYW5zYWN0aW9uLCB0aGVuXG4gICAqIG11bHRpcGxpZWQgYnkgREVGQVVMVF9HQVNfT1ZFUkhFQUQgKDEuMXgpIGFzIGEgc2FmZXR5IGJ1ZmZlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVkT2JqZWN0cyAtIE5hdGl2ZSBJT1RBIGNvaW4gb2JqZWN0cyB0byB1c2UgYXMgZ2FzIHBheW1lbnRcbiAgICogQHBhcmFtIHNlbmRlckFkZHJlc3MgLSBTZW5kZXIgYWRkcmVzcyBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBSZWNvdmVyeSBwYXJhbWV0ZXJzIChpbmNsdWRlcyByZWNvdmVyeURlc3RpbmF0aW9uLCBycGNVcmwpXG4gICAqIEBwYXJhbSBwYXltZW50T2JqZWN0cyAtIE9wdGlvbmFsIHRva2VuIG9iamVjdHMgZm9yIHRva2VuIHJlY292ZXJ5XG4gICAqIEByZXR1cm5zIEdhcyBidWRnZXQsIGdhcyBwcmljZSwgZ2FzIG9iamVjdHMgYXJyYXksIGFuZCB0b3RhbCBuYXRpdmUgYmFsYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICBvd25lZE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgcGF5bWVudE9iamVjdHM/OiBUcmFuc2FjdGlvbk9iamVjdElucHV0W11cbiAgKTogUHJvbWlzZTx7XG4gICAgZ2FzQnVkZ2V0OiBudW1iZXI7XG4gICAgZ2FzUHJpY2U6IG51bWJlcjtcbiAgICBnYXNPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W107XG4gICAgdG90YWxCYWxhbmNlOiBiaWdpbnQ7XG4gIH0+IHtcbiAgICBjb25zdCBnYXNPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBvd25lZE9iamVjdHMubWFwKChvYmopID0+ICh7XG4gICAgICBvYmplY3RJZDogb2JqLm9iamVjdElkLFxuICAgICAgdmVyc2lvbjogb2JqLnZlcnNpb24sXG4gICAgICBkaWdlc3Q6IG9iai5kaWdlc3QsXG4gICAgfSkpO1xuICAgIGNvbnN0IHRvdGFsQmFsYW5jZSA9IG93bmVkT2JqZWN0cy5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG5cbiAgICBjb25zdCBnYXNQcmljZSA9IGF3YWl0IHRoaXMuZmV0Y2hHYXNQcmljZShwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuXG4gICAgLy8gQnVpbGQgdGVtcCB0cmFuc2FjdGlvbiBmb3IgZXN0aW1hdGlvblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0ZW1wQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgY29uc3QgZXN0aW1hdGlvbkFtb3VudCA9IHRvdGFsQmFsYW5jZSA+IDBuID8gJzEnIDogJzAnO1xuXG4gICAgdGVtcEJ1aWxkZXIuc2VuZGVyKHNlbmRlckFkZHJlc3MpLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogZXN0aW1hdGlvbkFtb3VudCB9XSk7XG5cbiAgICBpZiAocGF5bWVudE9iamVjdHMgJiYgcGF5bWVudE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGVtcEJ1aWxkZXIucGF5bWVudE9iamVjdHMocGF5bWVudE9iamVjdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wQnVpbGRlci5wYXltZW50T2JqZWN0cyhnYXNPYmplY3RzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wVHggPSBhd2FpdCB0ZW1wQnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGVzdGltYXRlZEdhcyA9IGF3YWl0IHRoaXMuZXN0aW1hdGVHYXMoYXdhaXQgdGVtcFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG4gICAgY29uc3QgZ2FzQnVkZ2V0ID0gTWF0aC5taW4oTUFYX0dBU19CVURHRVQsIE1hdGgudHJ1bmMoZXN0aW1hdGVkR2FzICogREVGQVVMVF9HQVNfT1ZFUkhFQUQpKTtcblxuICAgIHJldHVybiB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvdmVySW90YVRva2VuKFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZTogSW90YU9iamVjdFdpdGhCYWxhbmNlW10sXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgZGVyaXZlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIGlkeDogbnVtYmVyLFxuICAgIGJpdGdvS2V5OiBzdHJpbmcsXG4gICAgaXNNcGNWMjogYm9vbGVhblxuICApOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zb3J0KChhLCBiKSA9PiAoQmlnSW50KGIuYmFsYW5jZSkgPiBCaWdJbnQoYS5iYWxhbmNlKSA/IDEgOiAtMSkpO1xuICAgIGlmICh0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5sZW5ndGggPiBNQVhfT0JKRUNUX0xJTUlUKSB7XG4gICAgICB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLnNsaWNlKDAsIE1BWF9PQkpFQ1RfTElNSVQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubWFwKChvYmopID0+ICh7XG4gICAgICBvYmplY3RJZDogb2JqLm9iamVjdElkLFxuICAgICAgdmVyc2lvbjogb2JqLnZlcnNpb24sXG4gICAgICBkaWdlc3Q6IG9iai5kaWdlc3QsXG4gICAgfSkpO1xuICAgIGNvbnN0IHRva2VuQmFsYW5jZSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLnJlZHVjZSgoc3VtLCBvYmopID0+IHN1bSArIEJpZ0ludChvYmouYmFsYW5jZSksIDBuKTtcbiAgICBpZiAodG9rZW5CYWxhbmNlIDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGJhbGFuY2UgaXMgemVybycpO1xuICAgIH1cblxuICAgIGxldCBnYXNPYmplY3RzV2l0aEJhbGFuY2U6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdO1xuICAgIHRyeSB7XG4gICAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKHNlbmRlckFkZHJlc3MsIHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggZ2FzIG9iamVjdHMgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuICAgIGlmIChnYXNPYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGdhcyBvYmplY3RzIGZvdW5kIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cblxuICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zb3J0KChhLCBiKSA9PiAoQmlnSW50KGIuYmFsYW5jZSkgPiBCaWdJbnQoYS5iYWxhbmNlKSA/IDEgOiAtMSkpO1xuICAgIGlmIChnYXNPYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID49IE1BWF9HQVNfT0JKRUNUUykge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLnNsaWNlKDAsIE1BWF9HQVNfT0JKRUNUUyAtIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH0gPSBhd2FpdCB0aGlzLnByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLFxuICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRva2VuT2JqZWN0c1xuICAgICk7XG4gICAgY29uc3QgbmV0R2FzQmFsYW5jZSA9IHRvdGFsQmFsYW5jZSAtIEJpZ0ludChnYXNCdWRnZXQpO1xuICAgIGlmIChuZXRHYXNCYWxhbmNlIDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc3VmZmljaWVudCBnYXMgYmFsYW5jZSBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRva2VuQmFsYW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgdHhCdWlsZGVyXG4gICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiByZWNvdmVyeUFtb3VudCB9XSlcbiAgICAgIC5wYXltZW50T2JqZWN0cyh0b2tlbk9iamVjdHMpXG4gICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuICAgIGNvbnN0IHRva2VuQ29pbiA9IHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyB8fCB0aGlzLmdldENoYWluKCk7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbihcbiAgICAgICAgdHhCdWlsZGVyLFxuICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgaWR4LFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICBjb25zdCBmdWxsU2lnbmF0dXJlQmFzZTY0ID0gYXdhaXQgdGhpcy5zaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICAgIHR4QnVpbGRlcixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgIHVuc2lnbmVkVHgsXG4gICAgICBpc01wY1YyLFxuICAgICAgYml0Z29LZXlcbiAgICApO1xuXG4gICAgY29uc3QgZmluYWxUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzY2FuSW5kZXg6IGlkeCxcbiAgICAgICAgICByZWNvdmVyeUFtb3VudCxcbiAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgc2lnbmF0dXJlOiBmdWxsU2lnbmF0dXJlQmFzZTY0LFxuICAgICAgICAgIGNvaW46IHRva2VuQ29pbixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsYXN0U2NhbkluZGV4OiBpZHgsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNNcGN2MlNpZ25pbmdNYXRlcmlhbChcbiAgICB1c2VyS2V5Pzogc3RyaW5nLFxuICAgIGJhY2t1cEtleT86IHN0cmluZyxcbiAgICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghd2FsbGV0UGFzc3BocmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdXNlcktleSkgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVzZXJLZXknKTtcbiAgICBpZiAoIWJhY2t1cEtleSkgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJhY2t1cEtleScpO1xuICAgIGNvbnN0IG1hdGVyaWFsID0gYXdhaXQgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpLCB3YWxsZXRQYXNzcGhyYXNlLCB0aGlzLmJpdGdvKTtcbiAgICByZXR1cm4gbWF0ZXJpYWwudmVyc2lvbiA9PT0gJ3YyJztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgZGVyaXZlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIHVuc2lnbmVkVHg6IFRyYW5zZmVyVHJhbnNhY3Rpb24sXG4gICAgaXNNcGNWMjogYm9vbGVhbixcbiAgICBiaXRnb0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFwYXJhbXMudXNlcktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVzZXJLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuYmFja3VwS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIGxldCBzaWduYXR1cmVCdWZmZXI6IEJ1ZmZlcjtcblxuICAgIGlmICghaXNNcGNWMikge1xuICAgICAgLy8gRGVjcnlwdCBwcml2YXRlIGtleXMgZnJvbSBLZXlDYXJkIHZhbHVlc1xuICAgICAgbGV0IHVzZXJQcnY6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHVzZXJQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogdXNlcktleSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHVzZXJQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuVXNlclNpZ25pbmdNYXRlcmlhbDtcblxuICAgICAgbGV0IGJhY2t1cFBydjogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmFja3VwUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGJhY2t1cEtleSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgYmFja3VwIGtleWNoYWluOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBUU1Mgc2lnbmF0dXJlXG4gICAgICBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0VFNTU2lnbmF0dXJlKFxuICAgICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLFxuICAgICAgICBiYWNrdXBTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICB1bnNpZ25lZFR4XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgoe1xuICAgICAgICBtZXNzYWdlOiB1bnNpZ25lZFR4LnNpZ25hYmxlUGF5bG9hZCxcbiAgICAgICAgdXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGZ1bGwgc2lnbmF0dXJlOiBzY2hlbWVfZmxhZyAoMSBieXRlKSArIHNpZ25hdHVyZSAoNjQgYnl0ZXMpICsgcHVibGljX2tleSAoMzIgYnl0ZXMpXG4gICAgY29uc3Qgc2NoZW1lRmxhZyA9IEJ1ZmZlci5hbGxvYygxLCAweDAwKTsgLy8gRWQyNTUxOSBzY2hlbWVcbiAgICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKGRlcml2ZWRQdWJsaWNLZXksICdoZXgnKTtcbiAgICBjb25zdCBmdWxsU2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbc2NoZW1lRmxhZywgc2lnbmF0dXJlQnVmZmVyLCBwdWJsaWNLZXlCeXRlc10pO1xuXG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogZGVyaXZlZFB1YmxpY0tleSB9LCBzaWduYXR1cmVCdWZmZXIpO1xuXG4gICAgcmV0dXJuIGZ1bGxTaWduYXR1cmUudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3VycmVudCByZWZlcmVuY2UgZ2FzIHByaWNlIGZyb20gZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgZ2FzIHByaWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoR2FzUHJpY2UocnBjVXJsPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRSZWZlcmVuY2VHYXNQcmljZScsIFtdKTtcbiAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVzIGdhcyBmb3IgYSB0cmFuc2FjdGlvbiB2aWEgZHJ5IHJ1bi5cbiAgICpcbiAgICogQHBhcmFtIHR4QmFzZTY0IC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IGZvcm1hdFxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcmV0dXJucyBFc3RpbWF0ZWQgZ2FzIGNvc3RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXN0aW1hdGVHYXModHhCYXNlNjQ6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RhX2RyeVJ1blRyYW5zYWN0aW9uQmxvY2snLCBbdHhCYXNlNjRdKTtcblxuICAgIGNvbnN0IGNvbXB1dGF0aW9uQ29zdCA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuY29tcHV0YXRpb25Db3N0LCAxMCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvc3QgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLnN0b3JhZ2VDb3N0LCAxMCk7XG4gICAgY29uc3Qgc3RvcmFnZVJlYmF0ZSA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuc3RvcmFnZVJlYmF0ZSwgMTApO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGF0aW9uQ29zdCArIHN0b3JhZ2VDb3N0IC0gc3RvcmFnZVJlYmF0ZSwgY29tcHV0YXRpb25Db3N0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIGJpdGdvS2V5OiBzdHJpbmcsXG4gICAgc2NhbkluZGV4OiBudW1iZXIsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcz86IHN0cmluZ1xuICApOiBQcm9taXNlPE1QQ1N3ZWVwVHhzPiB7XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCB1bnNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgdGhpcy5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IHNlcmlhbGl6ZWRUeEhleCB9KTtcbiAgICBjb25zdCB3YWxsZXRDb2luID0gdG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuICAgIGNvbnN0IHBhcnNlZE91dHB1dHMgPSBwYXJzZWRUeC5vdXRwdXRzIGFzIEFycmF5PHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IHN0cmluZyB9PjtcbiAgICBjb25zdCBvdXRwdXQgPSBwYXJzZWRPdXRwdXRzWzBdO1xuXG4gICAgLy8gQnVpbGQgcGFyc2VkIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBmcm9tIHBhcnNlZCBkYXRhXG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LmFtb3VudCxcbiAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCksXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3Qgb3V0cHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgIHZhbHVlU3RyaW5nOiBvdXRwdXQuYW1vdW50LFxuICAgICAgICBjb2luTmFtZTogd2FsbGV0Q29pbixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGNvbXBsZXRlZFBhcnNlZFR4ID0ge1xuICAgICAgaW5wdXRzOiBpbnB1dHMsXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgICAgc3BlbmRBbW91bnQ6IG91dHB1dC5hbW91bnQsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgICB9O1xuXG4gICAgY29uc3QgZmVlID0gcGFyc2VkVHguZmVlIGFzIEJpZ051bWJlcjtcbiAgICBjb25zdCBmZWVJbmZvID0geyBmZWU6IGZlZS50b051bWJlcigpLCBmZWVTdHJpbmc6IGZlZS50b1N0cmluZygpIH07XG4gICAgY29uc3QgY29pblNwZWNpZmljID0geyBjb21tb25LZXljaGFpbjogYml0Z29LZXkgfTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBNUENUeCA9IHtcbiAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4SGV4LFxuICAgICAgc2NhbkluZGV4LFxuICAgICAgY29pbjogd2FsbGV0Q29pbixcbiAgICAgIHNpZ25hYmxlSGV4OiB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIHBhcnNlZFR4OiBjb21wbGV0ZWRQYXJzZWRUeCxcbiAgICAgIGZlZUluZm86IGZlZUluZm8sXG4gICAgICBjb2luU3BlY2lmaWM6IGNvaW5TcGVjaWZpYyxcbiAgICB9O1xuXG4gICAgY29uc3QgdW5zaWduZWRUeFdyYXBwZXI6IE1QQ1Vuc2lnbmVkVHggPSB7IHVuc2lnbmVkVHg6IHRyYW5zYWN0aW9uLCBzaWduYXR1cmVTaGFyZXM6IFtdIH07XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBSZWNvdmVyeVR4UmVxdWVzdCA9IHsgdHJhbnNhY3Rpb25zOiBbdW5zaWduZWRUeFdyYXBwZXJdLCB3YWxsZXRDb2luIH07XG4gICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogW3R4UmVxdWVzdF0gfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgZXh0cmFjdHMgdHJhbnNhY3Rpb24gaGV4IGZyb20gcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgKGZvciBlcnJvciBtZXNzYWdlcylcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHRocm93cyBFcnJvciBpZiB0eEhleCBpcyBtaXNzaW5nXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXggZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHR4SGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBhIFRyYW5zZmVyVHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRyYW5zYWN0aW9uIGlzIG5vdCBhIFRyYW5zZmVyVHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCEodHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2ZlclRyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBub3QgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRyYW5zYWN0aW9uIHJlY2lwaWVudHMgbWF0Y2ggdGhlIGV4cGVjdGVkIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkUmVjaXBpZW50cyAtIFRoZSBleHBlY3RlZCByZWNpcGllbnRzIGZyb20gdHJhbnNhY3Rpb24gcGFyYW1zXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcmVjaXBpZW50cyBkb24ndCBtYXRjaFxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHMoXG4gICAgdHJhbnNhY3Rpb246IFRyYW5zZmVyVHJhbnNhY3Rpb24sXG4gICAgZXhwZWN0ZWRSZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHR4RGF0YSA9IHRyYW5zYWN0aW9uLnRvSnNvbigpIGFzIFRyYW5zZmVyVHhEYXRhO1xuXG4gICAgaWYgKCF0eERhdGEucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCByZWNpcGllbnRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdHVhbFJlY2lwaWVudHMgPSB0aGlzLm5vcm1hbGl6ZVJlY2lwaWVudHModHhEYXRhLnJlY2lwaWVudHMpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKGV4cGVjdGVkUmVjaXBpZW50cyk7XG5cbiAgICBpZiAoIXRoaXMucmVjaXBpZW50c01hdGNoKGV4cGVjdGVkLCBhY3R1YWxSZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCByZWNpcGllbnRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHJlY2lwaWVudHMgYnkgZXh0cmFjdGluZyBvbmx5IHJlbGV2YW50IGZpZWxkcy5cbiAgICogQHBhcmFtIHJlY2lwaWVudHMgLSBSZWNpcGllbnRzIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIHJlY2lwaWVudHMgd2l0aCBhZGRyZXNzLCBhbW91bnQsIGFuZCB0b2tlbk5hbWUgb25seVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVSZWNpcGllbnRzKHJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdIHtcbiAgICByZXR1cm4gcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ2Ftb3VudCcsICd0b2tlbk5hbWUnXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBleHBlY3RlZCByZWNpcGllbnRzIG1hdGNoIGFjdHVhbCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gZXhwZWN0ZWQgLSBFeHBlY3RlZCByZWNpcGllbnRzXG4gICAqIEBwYXJhbSBhY3R1YWwgLSBBY3R1YWwgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYWxsIGV4cGVjdGVkIHJlY2lwaWVudHMgYXJlIGZvdW5kIGluIGFjdHVhbCByZWNpcGllbnRzXG4gICAqL1xuICBwcml2YXRlIHJlY2lwaWVudHNNYXRjaChleHBlY3RlZDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSwgYWN0dWFsOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLmV2ZXJ5KChleHBlY3RlZFJlY2lwaWVudCkgPT5cbiAgICAgIGFjdHVhbC5zb21lKChhY3R1YWxSZWNpcGllbnQpID0+IF8uaXNFcXVhbChleHBlY3RlZFJlY2lwaWVudCwgYWN0dWFsUmVjaXBpZW50KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW1wdHkgcGFyc2VkIHRyYW5zYWN0aW9uIHJlc3VsdC5cbiAgICogVXNlZCB3aGVuIHRyYW5zYWN0aW9uIGhhcyBubyBvdXRwdXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk6IFBhcnNlZFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzOiBbXSxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgZmVlOiBuZXcgQmlnTnVtYmVyKDApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdHJhbnNhY3Rpb24gZmVlIGZyb20gdGhlIGV4cGxhbmF0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgVGhlIGZlZSBhcyBhIEJpZ051bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUcmFuc2FjdGlvbkZlZShleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEJpZ051bWJlciB7XG4gICAgaWYgKGV4cGxhbmF0aW9uLmZlZS5mZWUgPT09ICcnKSB7XG4gICAgICByZXR1cm4gbmV3IEJpZ051bWJlcigwKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoZXhwbGFuYXRpb24uZmVlLmZlZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBpbnB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBJbmNsdWRlcyBzZW5kZXIgaW5wdXQgYW5kIG9wdGlvbmFsbHkgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHBhcmFtIGZlZSAtIFRoZSBjYWxjdWxhdGVkIHRyYW5zYWN0aW9uIGZlZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbiBpbnB1dHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFuc2FjdGlvbklucHV0cyhcbiAgICBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgICBmZWU6IEJpZ051bWJlclxuICApOiBBcnJheTx7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYWRkcmVzcztcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCk7XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgc3BvbnNvciwgc2VuZGVyIG9ubHkgcGF5cyBmb3Igb3V0cHV0c1xuICAgIC8vIE90aGVyd2lzZSwgc2VuZGVyIHBheXMgZm9yIG91dHB1dHMgKyBmZWVcbiAgICBjb25zdCBzZW5kZXJBbW91bnQgPSBleHBsYW5hdGlvbi5zcG9uc29yID8gb3V0cHV0QW1vdW50LnRvRml4ZWQoKSA6IG91dHB1dEFtb3VudC5wbHVzKGZlZSkudG9GaXhlZCgpO1xuXG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHNlbmRlckFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEFkZCBzcG9uc29yIGlucHV0IGlmIHByZXNlbnRcbiAgICBpZiAoZXhwbGFuYXRpb24uc3BvbnNvcikge1xuICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBleHBsYW5hdGlvbi5zcG9uc29yLFxuICAgICAgICBhbW91bnQ6IGZlZS50b0ZpeGVkKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgb3V0cHV0cyBhcnJheSBmb3IgYSBwYXJzZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbiBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25PdXRwdXRzKGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIHJldHVybiBleHBsYW5hdGlvbi5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCkudG9GaXhlZCgpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHJhbnNhY3Rpb24gYnVpbGRlciBmYWN0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IGZvciB0aGlzIGNvaW5cbiAgICovXG4gIHByaXZhdGUgZ2V0VHhCdWlsZGVyRmFjdG9yeSgpOiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZnJvbSBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gdHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IHRvIHJlYnVpbGRcbiAgICogQHJldHVybnMgVGhlIHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgcmVidWlsdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWJ1aWxkVHJhbnNhY3Rpb24odHhIZXg6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXJGYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHR4QnVpbGRlckZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgICByZXR1cm4gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYnVpbGQgdHJhbnNhY3Rpb246ICR7ZXJyLnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
900
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQWdDeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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L0MsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBOWtDRCxvQkE4a0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEVudmlyb25tZW50cyxcbiAgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwgYXMgc2hhcmVkR2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyxcbiAgTVBDUmVjb3ZlcnlPcHRpb25zLFxuICBNUENTd2VlcFR4cyxcbiAgTVBDVHgsXG4gIE1QQ1R4cyxcbiAgTVBDVHlwZSxcbiAgTVBDVW5zaWduZWRUeCxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUG9wdWxhdGVkSW50ZW50LFxuICBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMsXG4gIFJlY292ZXJ5VHhSZXF1ZXN0LFxuICBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbiAgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9HQVNfT1ZFUkhFQUQsXG4gIERFRkFVTFRfU0NBTl9GQUNUT1IsXG4gIE1BWF9HQVNfQlVER0VULFxuICBNQVhfR0FTX09CSkVDVFMsXG4gIE1BWF9PQkpFQ1RfTElNSVQsXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RWRkc2FTaWduaW5nTWF0ZXJpYWx9IFtwcmVjb21wdXRlZE1hdGVyaWFsXSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIG9uY2UgYnkgdGhlXG4gICAqIGNhbGxlciAoZS5nLiByZWNvdmVyQ29uc29saWRhdGlvbnMpIHRvIGF2b2lkIHJlLWRlY3J5cHRpbmcgdGhlIGtleWNhcmQgb24gZXZlcnkgbG9vcCBpdGVyYXRpb25cbiAgICpcbiAgICogQHJldHVybnMge01QQ1R4IHwgTVBDU3dlZXBUeHN9IGFycmF5IG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleCBzdHJpbmdzIGFuZCBpbmRpY2VzXG4gICAqIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIoXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHByZWNvbXB1dGVkTWF0ZXJpYWw/OiBFZGRzYVNpZ25pbmdNYXRlcmlhbFxuICApOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24gYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SWR4ID0gdXRpbHMuZ2V0U2FmZU51bWJlcigwLCAnSW52YWxpZCBzdGFydGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMnLCBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXgpO1xuICAgIGNvbnN0IG51bUl0ZXJhdGlvbnMgPSB1dGlscy5nZXRTYWZlTnVtYmVyKERFRkFVTFRfU0NBTl9GQUNUT1IsICdJbnZhbGlkIHNjYW5uaW5nIGZhY3RvcicsIHBhcmFtcy5zY2FuKTtcbiAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIG51bUl0ZXJhdGlvbnM7XG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHg7IGlkeCA8IGVuZElkeDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gKHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpIDogJ20nKSArIGAvJHtpZHh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkUHVibGljS2V5KTtcblxuICAgICAgLy8gVG9rZW4gcmVjb3ZlcnkgcGF0aDogcmVjb3ZlciB0aGUgdG9rZW4gcHJvdmlkZWQgYnkgdXNlclxuICAgICAgaWYgKHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmhhc1Rva2VuQmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRva2VuT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9rZW5PYmplY3RzID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBwYXJhbXMuZnVsbG5vZGVScGNVcmwsXG4gICAgICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW5PYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNvdmVySW90YVRva2VuKFxuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgdG9rZW5PYmplY3RzLFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIGJpdGdvS2V5LFxuICAgICAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXAgb2JqZWN0cyB0byBwcmV2ZW50IG92ZXJzaXplZCB0cmFuc2FjdGlvbnMgKElPVEEgbWF4IHR4IHNpemUgPSAxMjggS2lCKVxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPiBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gb3duZWRPYmplY3RzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSlcbiAgICAgICAgICAuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICAgIG93bmVkT2JqZWN0cyxcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXRCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG5cbiAgICAgIGlmIChuZXRCYWxhbmNlIDw9IDBuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSBuZXRCYWxhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgICAvLyBSZXR1cm4gdW5zaWduZWQgdHJhbnNhY3Rpb24gZm9yIGNvbGQvY3VzdG9keSB3YWxsZXRzXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKHR4QnVpbGRlciwgc2VuZGVyQWRkcmVzcywgYml0Z29LZXksIGlkeCwgZGVyaXZhdGlvblBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZ1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQga2V5c1xuICAgICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgdW5zaWduZWRUeCxcbiAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIGAgK1xuICAgICAgICBgU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAke3N0YXJ0SWR4fSB0byAke2VuZElkeCAtIDF9LiBgICtcbiAgICAgICAgYFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtlbmRJZHh9LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhvbGRzIGEgcG9zaXRpdmUgYmFsYW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzczogc3RyaW5nLCBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuZ2V0QmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwsIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICByZXR1cm4gYmFsYW5jZSA+IDBuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleT8ucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIERldGVjdCBzaWduaW5nIG1hdGVyaWFsIG9uY2UgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgdXNlcktleSAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMsIHNpZ25pbmdNYXRlcmlhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyBFcnJvcikubWVzc2FnZS5zdGFydHNXaXRoKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4nKSkge1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDU3dlZXBUeHMpLnR4UmVxdWVzdHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1R4cykudHJhbnNhY3Rpb25zWzBdKTtcbiAgICAgIH1cbiAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgfVxuXG4gICAgaWYgKGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAke1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggKyAxXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFcbiAgICAgIF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmxhc3RTY2FuSW5kZXggPSBsYXN0U2NhbkluZGV4O1xuICAgICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvdGFsIGNvaW4gYmFsYW5jZSBmb3IgYW4gYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgVG90YWwgYmFsYW5jZSBhcyBhIGJpZ2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRCYWxhbmNlKGFkZHJlc3M6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nLCBjb2luVHlwZT86IHN0cmluZyk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0QmFsYW5jZScsIFthZGRyZXNzLCBub3JtYWxpemVkQ29pblR5cGVdKTtcbiAgICByZXR1cm4gQmlnSW50KHJlc3BvbnNlLnRvdGFsQmFsYW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvd25lZCBvYmplY3RzIGZvciBhbiBhZGRyZXNzIHZpYSBmdWxsbm9kZSBSUEMuXG4gICAqIEhhbmRsZXMgcGFnaW5hdGlvbiB0byByZXRyaWV2ZSBhbGwgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIHRvIGZpbHRlciBvYmplY3RzIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygb3duZWQgb2JqZWN0cyB3aXRoIGJhbGFuY2UgaW5mb3JtYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hPd25lZE9iamVjdHMoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJwY1VybD86IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZ1xuICApOiBQcm9taXNlPElvdGFPYmplY3RXaXRoQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IGFsbE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdID0gW107XG4gICAgY29uc3QgaW5uZXJDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gYDB4Mjo6Y29pbjo6Q29pbjwke2lubmVyQ29pblR5cGV9PmA7XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBNQVhfUEFHRVMgPSA1MDA7XG4gICAgbGV0IHBhZ2VDb3VudCA9IDA7XG4gICAgd2hpbGUgKGhhc05leHRQYWdlICYmIHBhZ2VDb3VudCA8IE1BWF9QQUdFUykge1xuICAgICAgcGFnZUNvdW50Kys7XG4gICAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgICAgZmlsdGVyOiB7IFN0cnVjdFR5cGU6IHN0cnVjdFR5cGUgfSxcbiAgICAgICAgb3B0aW9uczogeyBzaG93Q29udGVudDogdHJ1ZSwgc2hvd1R5cGU6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRPd25lZE9iamVjdHMnLCBbYWRkcmVzcywgcXVlcnksIGN1cnNvciwgNTBdKTtcbiAgICAgIGNvbnN0IHsgZGF0YSwgbmV4dEN1cnNvciwgaGFzTmV4dFBhZ2U6IG1vcmUgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSB8fCBbXSkge1xuICAgICAgICBjb25zdCB7IG9iamVjdElkLCB2ZXJzaW9uLCBkaWdlc3QgfSA9IGl0ZW0uZGF0YTtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IGl0ZW0uZGF0YS5jb250ZW50Py5maWVsZHM/LmJhbGFuY2UgfHwgJzAnO1xuICAgICAgICBpZiAoQmlnSW50KGJhbGFuY2UpID4gMG4pIHtcbiAgICAgICAgICBhbGxPYmplY3RzLnB1c2goeyBvYmplY3RJZCwgdmVyc2lvbjogdmVyc2lvbi50b1N0cmluZygpLCBkaWdlc3QsIGJhbGFuY2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDdXJzb3IgPT09IGN1cnNvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc05leHRQYWdlID0gbW9yZTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2VDb3VudCA+PSBNQVhfUEFHRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgZmV0Y2hPd25lZE9iamVjdHM6IEhpdCBtYXggcGFnZSBsaW1pdCAoJHtNQVhfUEFHRVN9KSBmb3IgJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBKU09OLVJQQyBjYWxsIHRvIElPVEEgZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBGdWxsbm9kZSBSUEMgVVJMXG4gICAqIEBwYXJhbSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAgICogQHBhcmFtIHBhcmFtcyAtIFJQQyBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIFJQQyByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBSUEMgY2FsbCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUnBjQ2FsbCh1cmw6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQQyBjYWxsIGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGpzb24uZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUlBDIGVycm9yOiAke2pzb24uZXJyb3IubWVzc2FnZSB8fCBKU09OLnN0cmluZ2lmeShqc29uLmVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbi5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcHVibGljIG5vZGUgUlBDIFVSTCBmcm9tIHRoZSBjZW50cmFsaXplZCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBSUEMgVVJMIGZvciB0aGUgY3VycmVudCBCaXRHbyBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFB1YmxpY05vZGVVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmlvdGFOb2RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hdGl2ZSBjb2luIHR5cGUgaWRlbnRpZmllciBmb3IgZmlsdGVyaW5nIG93bmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIE5hdGl2ZSBjb2luIHR5cGUgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGdldE5hdGl2ZUNvaW5UeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcweDI6OmlvdGE6OklPVEEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGdhcyBjb25maWd1cmF0aW9uIGZvciBhIHJlY292ZXJ5IHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBHYXMgZXN0aW1hdGlvbiBpcyBkb25lIHZpYSBhIGRyeS1ydW4gb2YgYSB0ZW1wb3JhcnkgdHJhbnNhY3Rpb24sIHRoZW5cbiAgICogbXVsdGlwbGllZCBieSBERUZBVUxUX0dBU19PVkVSSEVBRCAoMS4xeCkgYXMgYSBzYWZldHkgYnVmZmVyLlxuICAgKlxuICAgKiBAcGFyYW0gb3duZWRPYmplY3RzIC0gTmF0aXZlIElPVEEgY29pbiBvYmplY3RzIHRvIHVzZSBhcyBnYXMgcGF5bWVudFxuICAgKiBAcGFyYW0gc2VuZGVyQWRkcmVzcyAtIFNlbmRlciBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyAtIFJlY292ZXJ5IHBhcmFtZXRlcnMgKGluY2x1ZGVzIHJlY292ZXJ5RGVzdGluYXRpb24sIHJwY1VybClcbiAgICogQHBhcmFtIHBheW1lbnRPYmplY3RzIC0gT3B0aW9uYWwgdG9rZW4gb2JqZWN0cyBmb3IgdG9rZW4gcmVjb3ZlcnlcbiAgICogQHJldHVybnMgR2FzIGJ1ZGdldCwgZ2FzIHByaWNlLCBnYXMgb2JqZWN0cyBhcnJheSwgYW5kIHRvdGFsIG5hdGl2ZSBiYWxhbmNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgIG93bmVkT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW10sXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICBwYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXVxuICApOiBQcm9taXNlPHtcbiAgICBnYXNCdWRnZXQ6IG51bWJlcjtcbiAgICBnYXNQcmljZTogbnVtYmVyO1xuICAgIGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcbiAgICB0b3RhbEJhbGFuY2U6IGJpZ2ludDtcbiAgfT4ge1xuICAgIGNvbnN0IGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IG93bmVkT2JqZWN0cy5tYXAoKG9iaikgPT4gKHtcbiAgICAgIG9iamVjdElkOiBvYmoub2JqZWN0SWQsXG4gICAgICB2ZXJzaW9uOiBvYmoudmVyc2lvbixcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9KSk7XG4gICAgY29uc3QgdG90YWxCYWxhbmNlID0gb3duZWRPYmplY3RzLnJlZHVjZSgoc3VtLCBvYmopID0+IHN1bSArIEJpZ0ludChvYmouYmFsYW5jZSksIDBuKTtcblxuICAgIGNvbnN0IGdhc1ByaWNlID0gYXdhaXQgdGhpcy5mZXRjaEdhc1ByaWNlKHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG5cbiAgICAvLyBCdWlsZCB0ZW1wIHRyYW5zYWN0aW9uIGZvciBlc3RpbWF0aW9uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHRlbXBCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICBjb25zdCBlc3RpbWF0aW9uQW1vdW50ID0gdG90YWxCYWxhbmNlID4gMG4gPyAnMScgOiAnMCc7XG5cbiAgICB0ZW1wQnVpbGRlci5zZW5kZXIoc2VuZGVyQWRkcmVzcykucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBlc3RpbWF0aW9uQW1vdW50IH1dKTtcblxuICAgIGlmIChwYXltZW50T2JqZWN0cyAmJiBwYXltZW50T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0ZW1wQnVpbGRlci5wYXltZW50T2JqZWN0cyhwYXltZW50T2JqZWN0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKGdhc09iamVjdHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBUeCA9IGF3YWl0IHRlbXBCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgZXN0aW1hdGVkR2FzID0gYXdhaXQgdGhpcy5lc3RpbWF0ZUdhcyhhd2FpdCB0ZW1wVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICBjb25zdCBnYXNCdWRnZXQgPSBNYXRoLm1pbihNQVhfR0FTX0JVREdFVCwgTWF0aC50cnVuYyhlc3RpbWF0ZWRHYXMgKiBERUZBVUxUX0dBU19PVkVSSEVBRCkpO1xuXG4gICAgcmV0dXJuIHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXJJb3RhVG9rZW4oXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgaWR4OiBudW1iZXIsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAodG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID4gTUFYX09CSkVDVF9MSU1JVCkge1xuICAgICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfT0JKRUNUX0xJTUlUKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b2tlbkJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG4gICAgaWYgKHRva2VuQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBiYWxhbmNlIGlzIHplcm8nKTtcbiAgICB9XG5cbiAgICBsZXQgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICB0cnkge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIGdhcyBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBnYXMgb2JqZWN0cyBmb3VuZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+PSBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSxcbiAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICBwYXJhbXMsXG4gICAgICB0b2tlbk9iamVjdHNcbiAgICApO1xuICAgIGNvbnN0IG5ldEdhc0JhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcbiAgICBpZiAobmV0R2FzQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgZ2FzIGJhbGFuY2UgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b2tlbkJhbGFuY2UudG9TdHJpbmcoKTtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgIHR4QnVpbGRlclxuICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogcmVjb3ZlcnlBbW91bnQgfV0pXG4gICAgICAucGF5bWVudE9iamVjdHModG9rZW5PYmplY3RzKVxuICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICBjb25zdCB0b2tlbkNvaW4gPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGlkeCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICB0eEJ1aWxkZXIsXG4gICAgICBwYXJhbXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICB1bnNpZ25lZFR4LFxuICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICk7XG5cbiAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZpbmFsVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgIHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgY29pbjogdG9rZW5Db2luLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgTVBDdjEgdnMgTVBDdjIga2V5Y2FyZCBmb3JtYXQgYW5kIHJldHVybnMgdHlwZWQgc2lnbmluZyBtYXRlcmlhbC5cbiAgICogV3JhcHBlZCBhcyBhIHByb3RlY3RlZCBtZXRob2Qgc28gc2lub24gY2FuIHN0dWIgaXQgaW4gdGVzdHMgKG1hdGNoaW5nIERPVC9TVUkpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXk6IHN0cmluZywgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICAgIHJldHVybiBzaGFyZWRHZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCB3YWxsZXRQYXNzcGhyYXNlLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBNUEN2MiAoTVBTKSByZWNvdmVyeSBzaWduaW5nIGZsb3cgYW5kIHJldHVybnMgdGhlIHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLlxuICAgKiBXcmFwcGVkIGFzIGEgcHJvdGVjdGVkIG1ldGhvZCBzbyBzaW5vbiBjYW4gc3R1YiBpdCBpbiB0ZXN0cyAobWF0Y2hpbmcgRE9UL1NVSSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2lnbklvdGFNcGNWMlJlY292ZXJ5KHBhcmFtczogUGFyYW1ldGVyczx0eXBlb2Ygc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4PlswXSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeChwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXBhcmFtcy51c2VyS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5iYWNrdXBLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbCA/PyAoYXdhaXQgdGhpcy5nZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpO1xuXG4gICAgbGV0IHNpZ25hdHVyZUJ1ZmZlcjogQnVmZmVyO1xuXG4gICAgaWYgKHNpZ25pbmdNYXRlcmlhbC52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCB0aGlzLnNpZ25Jb3RhTXBjVjJSZWNvdmVyeSh7XG4gICAgICAgIG1lc3NhZ2U6IHVuc2lnbmVkVHguc2lnbmFibGVQYXlsb2FkLFxuICAgICAgICB1c2VyS2V5OiBzaWduaW5nTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShzaWduaW5nTWF0ZXJpYWwudXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgICBsZXQgYmFja3VwUHJ2OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBiYWNrdXBQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUREU0FNZXRob2RUeXBlcy5CYWNrdXBTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAgIC8vIEdlbmVyYXRlIFRTUyBzaWduYXR1cmVcbiAgICAgIHNpZ25hdHVyZUJ1ZmZlciA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHVuc2lnbmVkVHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZnVsbCBzaWduYXR1cmU6IHNjaGVtZV9mbGFnICgxIGJ5dGUpICsgc2lnbmF0dXJlICg2NCBieXRlcykgKyBwdWJsaWNfa2V5ICgzMiBieXRlcylcbiAgICBjb25zdCBzY2hlbWVGbGFnID0gQnVmZmVyLmFsbG9jKDEsIDB4MDApOyAvLyBFZDI1NTE5IHNjaGVtZVxuICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gQnVmZmVyLmZyb20oZGVyaXZlZFB1YmxpY0tleSwgJ2hleCcpO1xuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzY2hlbWVGbGFnLCBzaWduYXR1cmVCdWZmZXIsIHB1YmxpY0tleUJ5dGVzXSk7XG5cbiAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBkZXJpdmVkUHVibGljS2V5IH0sIHNpZ25hdHVyZUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gZnVsbFNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjdXJyZW50IHJlZmVyZW5jZSBnYXMgcHJpY2UgZnJvbSBmdWxsbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgQ3VycmVudCBnYXMgcHJpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hHYXNQcmljZShycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldFJlZmVyZW5jZUdhc1ByaWNlJywgW10pO1xuICAgIHJldHVybiBwYXJzZUludChyZXN1bHQsIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZXMgZ2FzIGZvciBhIHRyYW5zYWN0aW9uIHZpYSBkcnkgcnVuLlxuICAgKlxuICAgKiBAcGFyYW0gdHhCYXNlNjQgLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgZm9ybWF0XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIEVzdGltYXRlZCBnYXMgY29zdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlc3RpbWF0ZUdhcyh0eEJhc2U2NDogc3RyaW5nLCBycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGFfZHJ5UnVuVHJhbnNhY3Rpb25CbG9jaycsIFt0eEJhc2U2NF0pO1xuXG4gICAgY29uc3QgY29tcHV0YXRpb25Db3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5jb21wdXRhdGlvbkNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlQ29zdCA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuc3RvcmFnZUNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlUmViYXRlID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlUmViYXRlLCAxMCk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0YXRpb25Db3N0ICsgc3RvcmFnZUNvc3QgLSBzdG9yYWdlUmViYXRlLCBjb21wdXRhdGlvbkNvc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBzY2FuSW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzPzogc3RyaW5nXG4gICk6IFByb21pc2U8TVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogc2VyaWFsaXplZFR4SGV4IH0pO1xuICAgIGNvbnN0IHdhbGxldENvaW4gPSB0b2tlbkNvbnRyYWN0QWRkcmVzcyB8fCB0aGlzLmdldENoYWluKCk7XG4gICAgY29uc3QgcGFyc2VkT3V0cHV0cyA9IHBhcnNlZFR4Lm91dHB1dHMgYXMgQXJyYXk8eyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0+O1xuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZE91dHB1dHNbMF07XG5cbiAgICAvLyBCdWlsZCBwYXJzZWQgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZyb20gcGFyc2VkIGRhdGFcbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHZhbHVlU3RyaW5nOiBvdXRwdXQuYW1vdW50LFxuICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBvdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIGNvaW5OYW1lOiB3YWxsZXRDb2luLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgY29tcGxldGVkUGFyc2VkVHggPSB7XG4gICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgIG91dHB1dHM6IG91dHB1dHMsXG4gICAgICBzcGVuZEFtb3VudDogb3V0cHV0LmFtb3VudCxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgIH07XG5cbiAgICBjb25zdCBmZWUgPSBwYXJzZWRUeC5mZWUgYXMgQmlnTnVtYmVyO1xuICAgIGNvbnN0IGZlZUluZm8gPSB7IGZlZTogZmVlLnRvTnVtYmVyKCksIGZlZVN0cmluZzogZmVlLnRvU3RyaW5nKCkgfTtcbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB7IGNvbW1vbktleWNoYWluOiBiaXRnb0tleSB9O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICBzY2FuSW5kZXgsXG4gICAgICBjb2luOiB3YWxsZXRDb2luLFxuICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgcGFyc2VkVHg6IGNvbXBsZXRlZFBhcnNlZFR4LFxuICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgIGNvaW5TcGVjaWZpYzogY29pblNwZWNpZmljLFxuICAgIH07XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4V3JhcHBlcjogTVBDVW5zaWduZWRUeCA9IHsgdW5zaWduZWRUeDogdHJhbnNhY3Rpb24sIHNpZ25hdHVyZVNoYXJlczogW10gfTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFJlY292ZXJ5VHhSZXF1ZXN0ID0geyB0cmFuc2FjdGlvbnM6IFt1bnNpZ25lZFR4V3JhcHBlcl0sIHdhbGxldENvaW4gfTtcbiAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBleHRyYWN0cyB0cmFuc2FjdGlvbiBoZXggZnJvbSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gdHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHR4SGV4IGlzIG1pc3NpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbmApO1xuICAgIH1cbiAgICByZXR1cm4gdHhIZXg7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGEgVHJhbnNmZXJUcmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gaXMgbm90IGEgVHJhbnNmZXJUcmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zZmVyVHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG5vdCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBtYXRjaCB0aGUgZXhwZWN0ZWQgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZXhwZWN0ZWRSZWNpcGllbnRzIC0gVGhlIGV4cGVjdGVkIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAgICogQHRocm93cyBFcnJvciBpZiByZWNpcGllbnRzIGRvbid0IG1hdGNoXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyhcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBleHBlY3RlZFJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCkgYXMgVHJhbnNmZXJUeERhdGE7XG5cbiAgICBpZiAoIXR4RGF0YS5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsUmVjaXBpZW50cyA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyh0eERhdGEucmVjaXBpZW50cyk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLm5vcm1hbGl6ZVJlY2lwaWVudHMoZXhwZWN0ZWRSZWNpcGllbnRzKTtcblxuICAgIGlmICghdGhpcy5yZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQsIGFjdHVhbFJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgcmVjaXBpZW50cyBieSBleHRyYWN0aW5nIG9ubHkgcmVsZXZhbnQgZmllbGRzLlxuICAgKiBAcGFyYW0gcmVjaXBpZW50cyAtIFJlY2lwaWVudHMgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgcmVjaXBpZW50cyB3aXRoIGFkZHJlc3MsIGFtb3VudCwgYW5kIHRva2VuTmFtZSBvbmx5XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVJlY2lwaWVudHMocmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAnYW1vdW50JywgJ3Rva2VuTmFtZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGV4cGVjdGVkIHJlY2lwaWVudHMgbWF0Y2ggYWN0dWFsIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSBleHBlY3RlZCAtIEV4cGVjdGVkIHJlY2lwaWVudHNcbiAgICogQHBhcmFtIGFjdHVhbCAtIEFjdHVhbCByZWNpcGllbnRzIGZyb20gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZXhwZWN0ZWQgcmVjaXBpZW50cyBhcmUgZm91bmQgaW4gYWN0dWFsIHJlY2lwaWVudHNcbiAgICovXG4gIHByaXZhdGUgcmVjaXBpZW50c01hdGNoKGV4cGVjdGVkOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdLCBhY3R1YWw6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoKGV4cGVjdGVkUmVjaXBpZW50KSA9PlxuICAgICAgYWN0dWFsLnNvbWUoKGFjdHVhbFJlY2lwaWVudCkgPT4gXy5pc0VxdWFsKGV4cGVjdGVkUmVjaXBpZW50LCBhY3R1YWxSZWNpcGllbnQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbXB0eSBwYXJzZWQgdHJhbnNhY3Rpb24gcmVzdWx0LlxuICAgKiBVc2VkIHdoZW4gdHJhbnNhY3Rpb24gaGFzIG5vIG91dHB1dHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTogUGFyc2VkVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IG5ldyBCaWdOdW1iZXIoMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0cmFuc2FjdGlvbiBmZWUgZnJvbSB0aGUgZXhwbGFuYXRpb24uXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcmV0dXJucyBUaGUgZmVlIGFzIGEgQmlnTnVtYmVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogQmlnTnVtYmVyIHtcbiAgICBpZiAoZXhwbGFuYXRpb24uZmVlLmZlZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5mZWUuZmVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGlucHV0cyBhcnJheSBmb3IgYSBwYXJzZWQgdHJhbnNhY3Rpb24uXG4gICAqIEluY2x1ZGVzIHNlbmRlciBpbnB1dCBhbmQgb3B0aW9uYWxseSBzcG9uc29yIGlucHV0IGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcGFyYW0gZmVlIC0gVGhlIGNhbGN1bGF0ZWQgdHJhbnNhY3Rpb24gZmVlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIGlucHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uSW5wdXRzKFxuICAgIGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIGZlZTogQmlnTnVtYmVyXG4gICk6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50KTtcblxuICAgIC8vIElmIHRoZXJlJ3MgYSBzcG9uc29yLCBzZW5kZXIgb25seSBwYXlzIGZvciBvdXRwdXRzXG4gICAgLy8gT3RoZXJ3aXNlLCBzZW5kZXIgcGF5cyBmb3Igb3V0cHV0cyArIGZlZVxuICAgIGNvbnN0IHNlbmRlckFtb3VudCA9IGV4cGxhbmF0aW9uLnNwb25zb3IgPyBvdXRwdXRBbW91bnQudG9GaXhlZCgpIDogb3V0cHV0QW1vdW50LnBsdXMoZmVlKS50b0ZpeGVkKCk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogc2VuZGVyQW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gQWRkIHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudFxuICAgIGlmIChleHBsYW5hdGlvbi5zcG9uc29yKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGV4cGxhbmF0aW9uLnNwb25zb3IsXG4gICAgICAgIGFtb3VudDogZmVlLnRvRml4ZWQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBvdXRwdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIG91dHB1dHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFuc2FjdGlvbk91dHB1dHMoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBBcnJheTx7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICB9PiB7XG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uLm91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KS50b0ZpeGVkKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZhY3RvcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZm9yIHRoaXMgY29pblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUeEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gcmVidWlsZFxuICAgKiBAcmV0dXJucyBUaGUgcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSByZWJ1aWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRUcmFuc2FjdGlvbih0eEhleDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlckZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHhCdWlsZGVyRmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIHJldHVybiAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVidWlsZCB0cmFuc2FjdGlvbjogJHtlcnIudG9TdHJpbmcoKX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==