@bitgo/sdk-coin-iota 2.0.11 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/iota.d.ts +1 -0
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +49 -23
- package/dist/test/unit/iota.js +204 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
package/dist/src/iota.d.ts
CHANGED
package/dist/src/iota.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iota.d.ts","sourceRoot":"","sources":["../../src/iota.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,
|
|
1
|
+
{"version":3,"file":"iota.d.ts","sourceRoot":"","sources":["../../src/iota.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EAKT,OAAO,EACP,YAAY,EACZ,+BAA+B,EAC/B,kBAAkB,EAClB,WAAW,EAEX,MAAM,EAGN,YAAY,EAEZ,iBAAiB,EACjB,eAAe,EACf,oCAAoC,EAGpC,iBAAiB,EACjB,sBAAsB,EAGtB,uBAAuB,EAEvB,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,UAAU,EAAS,MAAM,gBAAgB,CAAC;AAMhF,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EAGvB,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;;GAGG;AACH,qBAAa,IAAK,SAAQ,QAAQ;IAChC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAQ1F,aAAa,IAAI,MAAM,GAAG,MAAM;IAIhC,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,UAAU;IAIvB,WAAW,IAAI,MAAM;IAQrB,WAAW,IAAI,OAAO;IAItB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAQ/B;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxE;;;;;OAKG;IACG,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAM5F;;;;;;;OAOG;IACG,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAc3E;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBvF;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAcvC;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,IAAI;IAOlF;;;;OAIG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D;;OAEG;IACH,2BAA2B,IAAI,OAAO;IAItC;;;;OAIG;IACH,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oCAAoC,GAAG,IAAI;IAI1G;;;;;;;;OAQG;IACG,OAAO,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;IA+IzE;;OAEG;YACW,eAAe;IAS7B;;;;;;;;;;;;OAYG;IACG,qBAAqB,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;IA4EnG;;;;;;;OAOG;YACW,UAAU;IAOxB;;;;;;;;OAQG;YACW,iBAAiB;IA4C/B;;;;;;;;OAQG;YACW,WAAW;IAyBzB;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;;;;;;;;OAWG;YACW,oBAAoB;YAwCpB,gBAAgB;YAwGhB,sBAAsB;YAYtB,uBAAuB;IAuErC;;;;;OAKG;YACW,aAAa;IAM3B;;;;;;OAMG;YACW,WAAW;YAWX,6BAA6B;IA+D3C;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAkBnC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAQpC;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAgC9B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;YACW,kBAAkB;CASjC"}
|
package/dist/src/iota.js
CHANGED
|
@@ -247,6 +247,8 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
247
247
|
const endIdx = startIdx + numIterations;
|
|
248
248
|
const bitgoKey = params.bitgoKey.replace(/\s/g, '');
|
|
249
249
|
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);
|
|
250
252
|
for (let idx = startIdx; idx < endIdx; idx++) {
|
|
251
253
|
const derivationPath = (params.seed ? (0, sdk_lib_mpc_1.getDerivationPath)(params.seed) : 'm') + `/${idx}`;
|
|
252
254
|
const derivedPublicKey = MPC.deriveUnhardened(bitgoKey, derivationPath).slice(0, 64);
|
|
@@ -267,7 +269,7 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
267
269
|
continue;
|
|
268
270
|
}
|
|
269
271
|
try {
|
|
270
|
-
return await this.recoverIotaToken(params, tokenObjects, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey);
|
|
272
|
+
return await this.recoverIotaToken(params, tokenObjects, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, isMpcV2);
|
|
271
273
|
}
|
|
272
274
|
catch (e) {
|
|
273
275
|
continue;
|
|
@@ -309,7 +311,7 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
309
311
|
// Build transaction for signing
|
|
310
312
|
const unsignedTx = (await txBuilder.build());
|
|
311
313
|
// Sign the transaction with decrypted keys
|
|
312
|
-
const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx);
|
|
314
|
+
const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, isMpcV2, bitgoKey);
|
|
313
315
|
// Build and return signed transaction
|
|
314
316
|
const finalTx = (await txBuilder.build());
|
|
315
317
|
const serializedTx = await finalTx.toBroadcastFormat();
|
|
@@ -548,7 +550,7 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
548
550
|
const gasBudget = Math.min(constants_1.MAX_GAS_BUDGET, Math.trunc(estimatedGas * constants_1.DEFAULT_GAS_OVERHEAD));
|
|
549
551
|
return { gasBudget, gasPrice, gasObjects, totalBalance };
|
|
550
552
|
}
|
|
551
|
-
async recoverIotaToken(params, tokenObjectsWithBalance, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey) {
|
|
553
|
+
async recoverIotaToken(params, tokenObjectsWithBalance, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, isMpcV2) {
|
|
552
554
|
tokenObjectsWithBalance = tokenObjectsWithBalance.sort((a, b) => (BigInt(b.balance) > BigInt(a.balance) ? 1 : -1));
|
|
553
555
|
if (tokenObjectsWithBalance.length > constants_1.MAX_OBJECT_LIMIT) {
|
|
554
556
|
tokenObjectsWithBalance = tokenObjectsWithBalance.slice(0, constants_1.MAX_OBJECT_LIMIT);
|
|
@@ -595,7 +597,7 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
595
597
|
return this.buildUnsignedSweepTransaction(txBuilder, senderAddress, bitgoKey, idx, derivationPath, params.tokenContractAddress);
|
|
596
598
|
}
|
|
597
599
|
const unsignedTx = (await txBuilder.build());
|
|
598
|
-
const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx);
|
|
600
|
+
const fullSignatureBase64 = await this.signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, isMpcV2, bitgoKey);
|
|
599
601
|
const finalTx = (await txBuilder.build());
|
|
600
602
|
const serializedTx = await finalTx.toBroadcastFormat();
|
|
601
603
|
return {
|
|
@@ -611,7 +613,17 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
611
613
|
lastScanIndex: idx,
|
|
612
614
|
};
|
|
613
615
|
}
|
|
614
|
-
async
|
|
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';
|
|
625
|
+
}
|
|
626
|
+
async signRecoveryTransaction(txBuilder, params, derivationPath, derivedPublicKey, unsignedTx, isMpcV2, bitgoKey) {
|
|
615
627
|
if (!params.userKey) {
|
|
616
628
|
throw new Error('missing userKey');
|
|
617
629
|
}
|
|
@@ -623,25 +635,39 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
623
635
|
}
|
|
624
636
|
const userKey = params.userKey.replace(/\s/g, '');
|
|
625
637
|
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
userPrv
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
backupPrv
|
|
638
|
+
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);
|
|
649
|
+
let backupPrv;
|
|
650
|
+
try {
|
|
651
|
+
backupPrv = await this.bitgo.decrypt({ input: backupKey, password: params.walletPassphrase });
|
|
652
|
+
}
|
|
653
|
+
catch (e) {
|
|
654
|
+
throw new Error(`Error decrypting backup keychain: ${e.message}`);
|
|
655
|
+
}
|
|
656
|
+
const backupSigningMaterial = JSON.parse(backupPrv);
|
|
657
|
+
// Generate TSS signature
|
|
658
|
+
signatureBuffer = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, derivationPath, unsignedTx);
|
|
638
659
|
}
|
|
639
|
-
|
|
640
|
-
|
|
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
|
+
});
|
|
641
670
|
}
|
|
642
|
-
const backupSigningMaterial = JSON.parse(backupPrv);
|
|
643
|
-
// Generate TSS signature
|
|
644
|
-
const signatureBuffer = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, derivationPath, unsignedTx);
|
|
645
671
|
// Build full signature: scheme_flag (1 byte) + signature (64 bytes) + public_key (32 bytes)
|
|
646
672
|
const schemeFlag = Buffer.alloc(1, 0x00); // Ed25519 scheme
|
|
647
673
|
const publicKeyBytes = Buffer.from(derivedPublicKey, 'hex');
|
|
@@ -868,4 +894,4 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
868
894
|
}
|
|
869
895
|
}
|
|
870
896
|
exports.Iota = Iota;
|
|
871
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQTZCeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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QUFtQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxpQ0Qsb0JBa2lDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBFRERTQU1ldGhvZHMsXG4gIEVERFNBTWV0aG9kVHlwZXMsXG4gIEVudmlyb25tZW50cyxcbiAgS2V5UGFpcixcbiAgTVBDQWxnb3JpdGhtLFxuICBNUENDb25zb2xpZGF0aW9uUmVjb3ZlcnlPcHRpb25zLFxuICBNUENSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBNUENUeCxcbiAgTVBDVHhzLFxuICBNUENUeXBlLFxuICBNUENVbnNpZ25lZFR4LFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgUmVjb3ZlcnlUeFJlcXVlc3QsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbiAgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9HQVNfT1ZFUkhFQUQsXG4gIERFRkFVTFRfU0NBTl9GQUNUT1IsXG4gIE1BWF9HQVNfQlVER0VULFxuICBNQVhfR0FTX09CSkVDVFMsXG4gIE1BWF9PQkpFQ1RfTElNSVQsXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtNUENUeCB8IE1QQ1N3ZWVwVHhzfSBhcnJheSBvZiB0aGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXggc3RyaW5ncyBhbmQgaW5kaWNlc1xuICAgKiBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nIHN3ZXB0XG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBpZiAoIXBhcmFtcy5iaXRnb0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJpdGdvS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKDAsICdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsIHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCk7XG4gICAgY29uc3QgbnVtSXRlcmF0aW9ucyA9IHV0aWxzLmdldFNhZmVOdW1iZXIoREVGQVVMVF9TQ0FOX0ZBQ1RPUiwgJ0ludmFsaWQgc2Nhbm5pbmcgZmFjdG9yJywgcGFyYW1zLnNjYW4pO1xuICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgbnVtSXRlcmF0aW9ucztcbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAocGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgOiAnbScpICsgYC8ke2lkeH1gO1xuICAgICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBkZXJpdmF0aW9uUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGRlcml2ZWRQdWJsaWNLZXkpO1xuXG4gICAgICAvLyBUb2tlbiByZWNvdmVyeSBwYXRoOiByZWNvdmVyIHRoZSB0b2tlbiBwcm92aWRlZCBieSB1c2VyXG4gICAgICBpZiAocGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3MsIHBhcmFtcykpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG9rZW5PYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b2tlbk9iamVjdHMgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIHBhcmFtcy5mdWxsbm9kZVJwY1VybCxcbiAgICAgICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbk9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY292ZXJJb3RhVG9rZW4oXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB0b2tlbk9iamVjdHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgYml0Z29LZXlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IG93bmVkT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgICB0cnkge1xuICAgICAgICBvd25lZE9iamVjdHMgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKHNlbmRlckFkZHJlc3MsIHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3duZWRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwIG9iamVjdHMgdG8gcHJldmVudCBvdmVyc2l6ZWQgdHJhbnNhY3Rpb25zIChJT1RBIG1heCB0eCBzaXplID0gMTI4IEtpQilcbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID4gTUFYX0dBU19PQkpFQ1RTKSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IG93bmVkT2JqZWN0c1xuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoQmlnSW50KGIuYmFsYW5jZSkgPiBCaWdJbnQoYS5iYWxhbmNlKSA/IDEgOiAtMSkpXG4gICAgICAgICAgLnNsaWNlKDAsIE1BWF9HQVNfT0JKRUNUUyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH0gPSBhd2FpdCB0aGlzLnByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgICAgICBvd25lZE9iamVjdHMsXG4gICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHBhcmFtc1xuICAgICAgKTtcblxuICAgICAgY29uc3QgbmV0QmFsYW5jZSA9IHRvdGFsQmFsYW5jZSAtIEJpZ0ludChnYXNCdWRnZXQpO1xuXG4gICAgICBpZiAobmV0QmFsYW5jZSA8PSAwbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gbmV0QmFsYW5jZS50b1N0cmluZygpO1xuXG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgICAucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiByZWNvdmVyeUFtb3VudCB9XSlcbiAgICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgICAgLy8gUmV0dXJuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGZvciBjb2xkL2N1c3RvZHkgd2FsbGV0c1xuICAgICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbih0eEJ1aWxkZXIsIHNlbmRlckFkZHJlc3MsIGJpdGdvS2V5LCBpZHgsIGRlcml2YXRpb25QYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgdHJhbnNhY3Rpb24gZm9yIHNpZ25pbmdcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIFNpZ24gdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIGtleXNcbiAgICAgIGNvbnN0IGZ1bGxTaWduYXR1cmVCYXNlNjQgPSBhd2FpdCB0aGlzLnNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICAgIHVuc2lnbmVkVHhcbiAgICAgICk7XG5cbiAgICAgIC8vIEJ1aWxkIGFuZCByZXR1cm4gc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgZmluYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY2FuSW5kZXg6IGlkeCxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgICAgc2VyaWFsaXplZFR4LFxuICAgICAgICAgICAgc2lnbmF0dXJlOiBmdWxsU2lnbmF0dXJlQmFzZTY0LFxuICAgICAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBgICtcbiAgICAgICAgYFNjYW5uZWQgYWRkcmVzc2VzIGZyb20gaW5kZXggJHtzdGFydElkeH0gdG8gJHtlbmRJZHggLSAxfS4gYCArXG4gICAgICAgIGBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4ICR7ZW5kSWR4fS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgYWRkcmVzcyBob2xkcyBhIHBvc2l0aXZlIGJhbGFuY2Ugb2YgdGhlIHNwZWNpZmllZCB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3M6IHN0cmluZywgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB0aGlzLmdldEJhbGFuY2Uoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsLCBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgICAgcmV0dXJuIGJhbGFuY2UgPiAwbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBmdW5kcyBmcm9tIG11bHRpcGxlIHJlY2VpdmUgYWRkcmVzc2VzIHRvIHRoZSBiYXNlIGFkZHJlc3MgKGluZGV4IDApLlxuICAgKiBJZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBwcm92aWRlZCwgcmV0dXJucyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yIG9mZmxpbmUgc2lnbmluZ1xuICAgKiAoY29sZC9jdXN0b2R5IHdhbGxldCByZWNvdmVyeSkuIE90aGVyd2lzZSwgcmV0dXJucyBzaWduZWQgdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ29uc29saWRhdGlvbiByZWNvdmVyeSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBwYXJhbXMuYml0Z29LZXkgLSBUaGUgY29tbW9uS2V5Y2hhaW4gKGNvbWJpbmVkIFRTUyBwdWJsaWMga2V5KVxuICAgKiBAcGFyYW0gcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4IC0gU3RhcnRpbmcgYWRkcmVzcyBpbmRleCB0byBzY2FuIChkZWZhdWx0OiAxKVxuICAgKiBAcGFyYW0gcGFyYW1zLmVuZGluZ1NjYW5JbmRleCAtIEVuZGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IHN0YXJ0aW5nU2NhbkluZGV4ICsgMjApXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIE9wdGlvbmFsIHBhc3NwaHJhc2UgZm9yIHNpZ25pbmcgKG9taXQgZm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucylcbiAgICogQHJldHVybnMgTVBDVHhzIChzaWduZWQpIG9yIE1QQ1N3ZWVwVHhzICh1bnNpZ25lZCkgY29udGFpbmluZyBhbGwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICogQHRocm93cyBFcnJvciBpZiBubyBhZGRyZXNzZXMgd2l0aCBmdW5kcyBhcmUgZm91bmQgaW4gdGhlIHNjYW4gcmFuZ2VcbiAgICovXG4gIGFzeW5jIHJlY292ZXJDb25zb2xpZGF0aW9ucyhwYXJhbXM6IE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKDEsICdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsIHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCk7XG4gICAgY29uc3QgZW5kSWR4ID0gdXRpbHMuZ2V0U2FmZU51bWJlcihcbiAgICAgIHN0YXJ0SWR4ICsgREVGQVVMVF9TQ0FOX0ZBQ1RPUixcbiAgICAgICdJbnZhbGlkIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMnLFxuICAgICAgcGFyYW1zLmVuZGluZ1NjYW5JbmRleFxuICAgICk7XG5cbiAgICBpZiAoc3RhcnRJZHggPCAxIHx8IGVuZElkeCA8PSBzdGFydElkeCB8fCBlbmRJZHggLSBzdGFydElkeCA+IDEwICogREVGQVVMVF9TQ0FOX0ZBQ1RPUikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBzdGFydGluZyBvciBlbmRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzLiBzdGFydGluZ1NjYW5JbmRleDogJHtzdGFydElkeH0sIGVuZGluZ1NjYW5JbmRleDogJHtlbmRJZHh9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSAocGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgOiAnbScpICsgJy8wJztcbiAgICBjb25zdCBkZXJpdmVkQmFzZVB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBiYXNlUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoZGVyaXZlZEJhc2VQdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgY29uc29saWRhdGlvblRyYW5zYWN0aW9uczogYW55W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IHN0YXJ0SWR4O1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHg7IGlkeCA8IGVuZElkeDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IHJlY292ZXJQYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXJLZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHBhcmFtcy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBwYXJhbXMuYml0Z29LZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBzZWVkOiBwYXJhbXMuc2VlZCxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogYmFzZUFkZHJlc3MsIC8vIENvbnNvbGlkYXRlIHRvIGJhc2UgYWRkcmVzc1xuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogaWR4LFxuICAgICAgICBzY2FuOiAxLFxuICAgICAgfTtcblxuICAgICAgbGV0IHJlY292ZXJ5VHJhbnNhY3Rpb246IE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3ZlcnlUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVjb3ZlcihyZWNvdmVyUGFyYW1zKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKChlIGFzIEVycm9yKS5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLicpKSB7XG4gICAgICAgICAgbGFzdFNjYW5JbmRleCA9IGlkeDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCgocmVjb3ZlcnlUcmFuc2FjdGlvbiBhcyBNUENTd2VlcFR4cykudHhSZXF1ZXN0c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDVHhzKS50cmFuc2FjdGlvbnNbMF0pO1xuICAgICAgfVxuICAgICAgbGFzdFNjYW5JbmRleCA9IGlkeDtcbiAgICB9XG5cbiAgICBpZiAoY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4ICR7XG4gICAgICAgICAgbGFzdFNjYW5JbmRleCArIDFcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnNbXG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoIC0gMVxuICAgICAgXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5jb2luU3BlY2lmaWMubGFzdFNjYW5JbmRleCA9IGxhc3RTY2FuSW5kZXg7XG4gICAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLCBsYXN0U2NhbkluZGV4IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdG90YWwgY29pbiBiYWxhbmNlIGZvciBhbiBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIElPVEEgYWRkcmVzcyB0byBxdWVyeVxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcGFyYW0gY29pblR5cGUgLSBPcHRpb25hbCBjb2luIHR5cGUgKGRlZmF1bHRzIHRvIG5hdGl2ZSBJT1RBKVxuICAgKiBAcmV0dXJucyBUb3RhbCBiYWxhbmNlIGFzIGEgYmlnaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEJhbGFuY2UoYWRkcmVzczogc3RyaW5nLCBycGNVcmw/OiBzdHJpbmcsIGNvaW5UeXBlPzogc3RyaW5nKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvaW5UeXBlID0gY29pblR5cGUgfHwgdGhpcy5nZXROYXRpdmVDb2luVHlwZSgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRCYWxhbmNlJywgW2FkZHJlc3MsIG5vcm1hbGl6ZWRDb2luVHlwZV0pO1xuICAgIHJldHVybiBCaWdJbnQocmVzcG9uc2UudG90YWxCYWxhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIG93bmVkIG9iamVjdHMgZm9yIGFuIGFkZHJlc3MgdmlhIGZ1bGxub2RlIFJQQy5cbiAgICogSGFuZGxlcyBwYWdpbmF0aW9uIHRvIHJldHJpZXZlIGFsbCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIElPVEEgYWRkcmVzcyB0byBxdWVyeVxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcGFyYW0gY29pblR5cGUgLSBPcHRpb25hbCBjb2luIHR5cGUgdG8gZmlsdGVyIG9iamVjdHMgKGRlZmF1bHRzIHRvIG5hdGl2ZSBJT1RBKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBvd25lZCBvYmplY3RzIHdpdGggYmFsYW5jZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE93bmVkT2JqZWN0cyhcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgcnBjVXJsPzogc3RyaW5nLFxuICAgIGNvaW5UeXBlPzogc3RyaW5nXG4gICk6IFByb21pc2U8SW90YU9iamVjdFdpdGhCYWxhbmNlW10+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3QgYWxsT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW10gPSBbXTtcbiAgICBjb25zdCBpbm5lckNvaW5UeXBlID0gY29pblR5cGUgfHwgdGhpcy5nZXROYXRpdmVDb2luVHlwZSgpO1xuICAgIGNvbnN0IHN0cnVjdFR5cGUgPSBgMHgyOjpjb2luOjpDb2luPCR7aW5uZXJDb2luVHlwZX0+YDtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTmV4dFBhZ2UgPSB0cnVlO1xuICAgIGNvbnN0IE1BWF9QQUdFUyA9IDUwMDtcbiAgICBsZXQgcGFnZUNvdW50ID0gMDtcbiAgICB3aGlsZSAoaGFzTmV4dFBhZ2UgJiYgcGFnZUNvdW50IDwgTUFYX1BBR0VTKSB7XG4gICAgICBwYWdlQ291bnQrKztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgICBmaWx0ZXI6IHsgU3RydWN0VHlwZTogc3RydWN0VHlwZSB9LFxuICAgICAgICBvcHRpb25zOiB7IHNob3dDb250ZW50OiB0cnVlLCBzaG93VHlwZTogdHJ1ZSB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldE93bmVkT2JqZWN0cycsIFthZGRyZXNzLCBxdWVyeSwgY3Vyc29yLCA1MF0pO1xuICAgICAgY29uc3QgeyBkYXRhLCBuZXh0Q3Vyc29yLCBoYXNOZXh0UGFnZTogbW9yZSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IHsgb2JqZWN0SWQsIHZlcnNpb24sIGRpZ2VzdCB9ID0gaXRlbS5kYXRhO1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gaXRlbS5kYXRhLmNvbnRlbnQ/LmZpZWxkcz8uYmFsYW5jZSB8fCAnMCc7XG4gICAgICAgIGlmIChCaWdJbnQoYmFsYW5jZSkgPiAwbikge1xuICAgICAgICAgIGFsbE9iamVjdHMucHVzaCh7IG9iamVjdElkLCB2ZXJzaW9uOiB2ZXJzaW9uLnRvU3RyaW5nKCksIGRpZ2VzdCwgYmFsYW5jZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEN1cnNvciA9PT0gY3Vyc29yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaGFzTmV4dFBhZ2UgPSBtb3JlO1xuICAgICAgY3Vyc29yID0gbmV4dEN1cnNvcjtcbiAgICB9XG5cbiAgICBpZiAocGFnZUNvdW50ID49IE1BWF9QQUdFUykge1xuICAgICAgY29uc29sZS53YXJuKGBmZXRjaE93bmVkT2JqZWN0czogSGl0IG1heCBwYWdlIGxpbWl0ICgke01BWF9QQUdFU30pIGZvciAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxPYmplY3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIEpTT04tUlBDIGNhbGwgdG8gSU9UQSBmdWxsbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIEZ1bGxub2RlIFJQQyBVUkxcbiAgICogQHBhcmFtIG1ldGhvZCAtIFJQQyBtZXRob2QgbmFtZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUlBDIHBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgUlBDIHJlc3VsdFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIFJQQyBjYWxsIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1ha2VScGNDYWxsKHVybDogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogMSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXJhbXMsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUlBDIGNhbGwgZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoanNvbi5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSUEMgZXJyb3I6ICR7anNvbi5lcnJvci5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGpzb24uZXJyb3IpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwdWJsaWMgbm9kZSBSUEMgVVJMIGZyb20gdGhlIGNlbnRyYWxpemVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFJQQyBVUkwgZm9yIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UHVibGljTm9kZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0uaW90YU5vZGVVcmw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmF0aXZlIGNvaW4gdHlwZSBpZGVudGlmaWVyIGZvciBmaWx0ZXJpbmcgb3duZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHJldHVybnMgTmF0aXZlIGNvaW4gdHlwZSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZ2V0TmF0aXZlQ29pblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJzB4Mjo6aW90YTo6SU9UQSc7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZ2FzIGNvbmZpZ3VyYXRpb24gZm9yIGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEdhcyBlc3RpbWF0aW9uIGlzIGRvbmUgdmlhIGEgZHJ5LXJ1biBvZiBhIHRlbXBvcmFyeSB0cmFuc2FjdGlvbiwgdGhlblxuICAgKiBtdWx0aXBsaWVkIGJ5IERFRkFVTFRfR0FTX09WRVJIRUFEICgxLjF4KSBhcyBhIHNhZmV0eSBidWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lZE9iamVjdHMgLSBOYXRpdmUgSU9UQSBjb2luIG9iamVjdHMgdG8gdXNlIGFzIGdhcyBwYXltZW50XG4gICAqIEBwYXJhbSBzZW5kZXJBZGRyZXNzIC0gU2VuZGVyIGFkZHJlc3MgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUmVjb3ZlcnkgcGFyYW1ldGVycyAoaW5jbHVkZXMgcmVjb3ZlcnlEZXN0aW5hdGlvbiwgcnBjVXJsKVxuICAgKiBAcGFyYW0gcGF5bWVudE9iamVjdHMgLSBPcHRpb25hbCB0b2tlbiBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeVxuICAgKiBAcmV0dXJucyBHYXMgYnVkZ2V0LCBnYXMgcHJpY2UsIGdhcyBvYmplY3RzIGFycmF5LCBhbmQgdG90YWwgbmF0aXZlIGJhbGFuY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHBheW1lbnRPYmplY3RzPzogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdXG4gICk6IFByb21pc2U8e1xuICAgIGdhc0J1ZGdldDogbnVtYmVyO1xuICAgIGdhc1ByaWNlOiBudW1iZXI7XG4gICAgZ2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdO1xuICAgIHRvdGFsQmFsYW5jZTogYmlnaW50O1xuICB9PiB7XG4gICAgY29uc3QgZ2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gb3duZWRPYmplY3RzLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b3RhbEJhbGFuY2UgPSBvd25lZE9iamVjdHMucmVkdWNlKChzdW0sIG9iaikgPT4gc3VtICsgQmlnSW50KG9iai5iYWxhbmNlKSwgMG4pO1xuXG4gICAgY29uc3QgZ2FzUHJpY2UgPSBhd2FpdCB0aGlzLmZldGNoR2FzUHJpY2UocGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcblxuICAgIC8vIEJ1aWxkIHRlbXAgdHJhbnNhY3Rpb24gZm9yIGVzdGltYXRpb25cbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdGVtcEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGNvbnN0IGVzdGltYXRpb25BbW91bnQgPSB0b3RhbEJhbGFuY2UgPiAwbiA/ICcxJyA6ICcwJztcblxuICAgIHRlbXBCdWlsZGVyLnNlbmRlcihzZW5kZXJBZGRyZXNzKS5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IGVzdGltYXRpb25BbW91bnQgfV0pO1xuXG4gICAgaWYgKHBheW1lbnRPYmplY3RzICYmIHBheW1lbnRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKHBheW1lbnRPYmplY3RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcEJ1aWxkZXIucGF5bWVudE9iamVjdHMoZ2FzT2JqZWN0cyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFR4ID0gYXdhaXQgdGVtcEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRHYXMgPSBhd2FpdCB0aGlzLmVzdGltYXRlR2FzKGF3YWl0IHRlbXBUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIGNvbnN0IGdhc0J1ZGdldCA9IE1hdGgubWluKE1BWF9HQVNfQlVER0VULCBNYXRoLnRydW5jKGVzdGltYXRlZEdhcyAqIERFRkFVTFRfR0FTX09WRVJIRUFEKSk7XG5cbiAgICByZXR1cm4geyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlcklvdGFUb2tlbihcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2U6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIGRlcml2ZWRQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBpZHg6IG51bWJlcixcbiAgICBiaXRnb0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSk7XG4gICAgaWYgKHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+IE1BWF9PQkpFQ1RfTElNSVQpIHtcbiAgICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc2xpY2UoMCwgTUFYX09CSkVDVF9MSU1JVCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5PYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5tYXAoKG9iaikgPT4gKHtcbiAgICAgIG9iamVjdElkOiBvYmoub2JqZWN0SWQsXG4gICAgICB2ZXJzaW9uOiBvYmoudmVyc2lvbixcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9KSk7XG4gICAgY29uc3QgdG9rZW5CYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UucmVkdWNlKChzdW0sIG9iaikgPT4gc3VtICsgQmlnSW50KG9iai5iYWxhbmNlKSwgMG4pO1xuICAgIGlmICh0b2tlbkJhbGFuY2UgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gYmFsYW5jZSBpcyB6ZXJvJyk7XG4gICAgfVxuXG4gICAgbGV0IGdhc09iamVjdHNXaXRoQmFsYW5jZTogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgdHJ5IHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBnYXMgb2JqZWN0cyBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG4gICAgaWYgKGdhc09iamVjdHNXaXRoQmFsYW5jZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZ2FzIG9iamVjdHMgZm91bmQgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSk7XG4gICAgaWYgKGdhc09iamVjdHNXaXRoQmFsYW5jZS5sZW5ndGggPj0gTUFYX0dBU19PQkpFQ1RTKSB7XG4gICAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTIC0gMSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UsXG4gICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgcGFyYW1zLFxuICAgICAgdG9rZW5PYmplY3RzXG4gICAgKTtcbiAgICBjb25zdCBuZXRHYXNCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG4gICAgaWYgKG5ldEdhc0JhbGFuY2UgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5zdWZmaWNpZW50IGdhcyBiYWxhbmNlIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG9rZW5CYWxhbmNlLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5zZW5kZXIoc2VuZGVyQWRkcmVzcylcbiAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgLnBheW1lbnRPYmplY3RzKHRva2VuT2JqZWN0cylcbiAgICAgIC5nYXNEYXRhKHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzUGF5bWVudE9iamVjdHM6IGdhc09iamVjdHMgfSk7XG5cbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgY29uc3QgdG9rZW5Db2luID0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHx8IHRoaXMuZ2V0Q2hhaW4oKTtcblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGJpdGdvS2V5LFxuICAgICAgICBpZHgsXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmVCYXNlNjQgPSBhd2FpdCB0aGlzLnNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgICAgdHhCdWlsZGVyLFxuICAgICAgcGFyYW1zLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgdW5zaWduZWRUeFxuICAgICk7XG5cbiAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZpbmFsVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgIHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgY29pbjogdG9rZW5Db2luLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogVHJhbnNmZXJUcmFuc2FjdGlvblxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghcGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmJhY2t1cEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJhY2t1cEtleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAvLyBEZWNyeXB0IHByaXZhdGUga2V5cyBmcm9tIEtleUNhcmQgdmFsdWVzXG4gICAgbGV0IHVzZXJQcnY6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdXNlclBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIHVzZXIga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHVzZXJQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuVXNlclNpZ25pbmdNYXRlcmlhbDtcblxuICAgIGxldCBiYWNrdXBQcnY6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgYmFja3VwUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGJhY2t1cEtleSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UoYmFja3VwUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLkJhY2t1cFNpZ25pbmdNYXRlcmlhbDtcblxuICAgIC8vIEdlbmVyYXRlIFRTUyBzaWduYXR1cmVcbiAgICBjb25zdCBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0VFNTU2lnbmF0dXJlKFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbCxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgdW5zaWduZWRUeFxuICAgICk7XG5cbiAgICAvLyBCdWlsZCBmdWxsIHNpZ25hdHVyZTogc2NoZW1lX2ZsYWcgKDEgYnl0ZSkgKyBzaWduYXR1cmUgKDY0IGJ5dGVzKSArIHB1YmxpY19rZXkgKDMyIGJ5dGVzKVxuICAgIGNvbnN0IHNjaGVtZUZsYWcgPSBCdWZmZXIuYWxsb2MoMSwgMHgwMCk7IC8vIEVkMjU1MTkgc2NoZW1lXG4gICAgY29uc3QgcHVibGljS2V5Qnl0ZXMgPSBCdWZmZXIuZnJvbShkZXJpdmVkUHVibGljS2V5LCAnaGV4Jyk7XG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NjaGVtZUZsYWcsIHNpZ25hdHVyZUJ1ZmZlciwgcHVibGljS2V5Qnl0ZXNdKTtcblxuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IGRlcml2ZWRQdWJsaWNLZXkgfSwgc2lnbmF0dXJlQnVmZmVyKTtcblxuICAgIHJldHVybiBmdWxsU2lnbmF0dXJlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGN1cnJlbnQgcmVmZXJlbmNlIGdhcyBwcmljZSBmcm9tIGZ1bGxub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcmV0dXJucyBDdXJyZW50IGdhcyBwcmljZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEdhc1ByaWNlKHJwY1VybD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0UmVmZXJlbmNlR2FzUHJpY2UnLCBbXSk7XG4gICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdCwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyBnYXMgZm9yIGEgdHJhbnNhY3Rpb24gdmlhIGRyeSBydW4uXG4gICAqXG4gICAqIEBwYXJhbSB0eEJhc2U2NCAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBmb3JtYXRcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgRXN0aW1hdGVkIGdhcyBjb3N0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVzdGltYXRlR2FzKHR4QmFzZTY0OiBzdHJpbmcsIHJwY1VybD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YV9kcnlSdW5UcmFuc2FjdGlvbkJsb2NrJywgW3R4QmFzZTY0XSk7XG5cbiAgICBjb25zdCBjb21wdXRhdGlvbkNvc3QgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLmNvbXB1dGF0aW9uQ29zdCwgMTApO1xuICAgIGNvbnN0IHN0b3JhZ2VDb3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlQ29zdCwgMTApO1xuICAgIGNvbnN0IHN0b3JhZ2VSZWJhdGUgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLnN0b3JhZ2VSZWJhdGUsIDEwKTtcblxuICAgIHJldHVybiBNYXRoLm1heChjb21wdXRhdGlvbkNvc3QgKyBzdG9yYWdlQ29zdCAtIHN0b3JhZ2VSZWJhdGUsIGNvbXB1dGF0aW9uQ29zdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBiaXRnb0tleTogc3RyaW5nLFxuICAgIHNjYW5JbmRleDogbnVtYmVyLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNUENTd2VlcFR4cz4ge1xuICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHRoaXMucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSk7XG4gICAgY29uc3Qgd2FsbGV0Q29pbiA9IHRva2VuQ29udHJhY3RBZGRyZXNzIHx8IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICBjb25zdCBwYXJzZWRPdXRwdXRzID0gcGFyc2VkVHgub3V0cHV0cyBhcyBBcnJheTx7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBzdHJpbmcgfT47XG4gICAgY29uc3Qgb3V0cHV0ID0gcGFyc2VkT3V0cHV0c1swXTtcblxuICAgIC8vIEJ1aWxkIHBhcnNlZCB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgZnJvbSBwYXJzZWQgZGF0YVxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LmFtb3VudCxcbiAgICAgICAgY29pbk5hbWU6IHdhbGxldENvaW4sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBjb21wbGV0ZWRQYXJzZWRUeCA9IHtcbiAgICAgIGlucHV0czogaW5wdXRzLFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgIHNwZW5kQW1vdW50OiBvdXRwdXQuYW1vdW50LFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlNlbmQsXG4gICAgfTtcblxuICAgIGNvbnN0IGZlZSA9IHBhcnNlZFR4LmZlZSBhcyBCaWdOdW1iZXI7XG4gICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiBmZWUudG9OdW1iZXIoKSwgZmVlU3RyaW5nOiBmZWUudG9TdHJpbmcoKSB9O1xuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHsgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5IH07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbjogTVBDVHggPSB7XG4gICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIHNjYW5JbmRleCxcbiAgICAgIGNvaW46IHdhbGxldENvaW4sXG4gICAgICBzaWduYWJsZUhleDogdW5zaWduZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJzZWRUeDogY29tcGxldGVkUGFyc2VkVHgsXG4gICAgICBmZWVJbmZvOiBmZWVJbmZvLFxuICAgICAgY29pblNwZWNpZmljOiBjb2luU3BlY2lmaWMsXG4gICAgfTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHhXcmFwcGVyOiBNUENVbnNpZ25lZFR4ID0geyB1bnNpZ25lZFR4OiB0cmFuc2FjdGlvbiwgc2lnbmF0dXJlU2hhcmVzOiBbXSB9O1xuICAgIGNvbnN0IHR4UmVxdWVzdDogUmVjb3ZlcnlUeFJlcXVlc3QgPSB7IHRyYW5zYWN0aW9uczogW3Vuc2lnbmVkVHhXcmFwcGVyXSwgd2FsbGV0Q29pbiB9O1xuICAgIHJldHVybiB7IHR4UmVxdWVzdHM6IFt0eFJlcXVlc3RdIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGV4dHJhY3RzIHRyYW5zYWN0aW9uIGhleCBmcm9tIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEV4dHJhY3RUeEhleCh0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uYCk7XG4gICAgfVxuICAgIHJldHVybiB0eEhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgYSBUcmFuc2ZlclRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBpcyBub3QgYSBUcmFuc2ZlclRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNmZXJUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggbm90IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0cmFuc2FjdGlvbiByZWNpcGllbnRzIG1hdGNoIHRoZSBleHBlY3RlZCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFJlY2lwaWVudHMgLSBUaGUgZXhwZWN0ZWQgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uIHBhcmFtc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHJlY2lwaWVudHMgZG9uJ3QgbWF0Y2hcbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5VHJhbnNhY3Rpb25SZWNpcGllbnRzKFxuICAgIHRyYW5zYWN0aW9uOiBUcmFuc2ZlclRyYW5zYWN0aW9uLFxuICAgIGV4cGVjdGVkUmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUcmFuc2ZlclR4RGF0YTtcblxuICAgIGlmICghdHhEYXRhLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxSZWNpcGllbnRzID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKHR4RGF0YS5yZWNpcGllbnRzKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyhleHBlY3RlZFJlY2lwaWVudHMpO1xuXG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHNNYXRjaChleHBlY3RlZCwgYWN0dWFsUmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyByZWNpcGllbnRzIGJ5IGV4dHJhY3Rpbmcgb25seSByZWxldmFudCBmaWVsZHMuXG4gICAqIEBwYXJhbSByZWNpcGllbnRzIC0gUmVjaXBpZW50cyB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCByZWNpcGllbnRzIHdpdGggYWRkcmVzcywgYW1vdW50LCBhbmQgdG9rZW5OYW1lIG9ubHlcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVjaXBpZW50cyhyZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZXhwZWN0ZWQgcmVjaXBpZW50cyBtYXRjaCBhY3R1YWwgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIGV4cGVjdGVkIC0gRXhwZWN0ZWQgcmVjaXBpZW50c1xuICAgKiBAcGFyYW0gYWN0dWFsIC0gQWN0dWFsIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBleHBlY3RlZCByZWNpcGllbnRzIGFyZSBmb3VuZCBpbiBhY3R1YWwgcmVjaXBpZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQ6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10sIGFjdHVhbDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleHBlY3RlZC5ldmVyeSgoZXhwZWN0ZWRSZWNpcGllbnQpID0+XG4gICAgICBhY3R1YWwuc29tZSgoYWN0dWFsUmVjaXBpZW50KSA9PiBfLmlzRXF1YWwoZXhwZWN0ZWRSZWNpcGllbnQsIGFjdHVhbFJlY2lwaWVudCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHBhcnNlZCB0cmFuc2FjdGlvbiByZXN1bHQuXG4gICAqIFVzZWQgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gb3V0cHV0cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRW1wdHlQYXJzZWRUcmFuc2FjdGlvbigpOiBQYXJzZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZTogbmV3IEJpZ051bWJlcigwKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBmcm9tIHRoZSBleHBsYW5hdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBmZWUgYXMgYSBCaWdOdW1iZXJcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVHJhbnNhY3Rpb25GZWUoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBCaWdOdW1iZXIge1xuICAgIGlmIChleHBsYW5hdGlvbi5mZWUuZmVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLmZlZS5mZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgaW5wdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogSW5jbHVkZXMgc2VuZGVyIGlucHV0IGFuZCBvcHRpb25hbGx5IHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEBwYXJhbSBmZWUgLSBUaGUgY2FsY3VsYXRlZCB0cmFuc2FjdGlvbiBmZWVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gaW5wdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25JbnB1dHMoXG4gICAgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gICAgZmVlOiBCaWdOdW1iZXJcbiAgKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBhIHNwb25zb3IsIHNlbmRlciBvbmx5IHBheXMgZm9yIG91dHB1dHNcbiAgICAvLyBPdGhlcndpc2UsIHNlbmRlciBwYXlzIGZvciBvdXRwdXRzICsgZmVlXG4gICAgY29uc3Qgc2VuZGVyQW1vdW50ID0gZXhwbGFuYXRpb24uc3BvbnNvciA/IG91dHB1dEFtb3VudC50b0ZpeGVkKCkgOiBvdXRwdXRBbW91bnQucGx1cyhmZWUpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBzZW5kZXJBbW91bnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICAvLyBBZGQgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50XG4gICAgaWYgKGV4cGxhbmF0aW9uLnNwb25zb3IpIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogZXhwbGFuYXRpb24uc3BvbnNvcixcbiAgICAgICAgYW1vdW50OiBmZWUudG9GaXhlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG91dHB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gb3V0cHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uT3V0cHV0cyhleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICByZXR1cm4gZXhwbGFuYXRpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmFjdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBmb3IgdGhpcyBjb2luXG4gICAqL1xuICBwcml2YXRlIGdldFR4QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZyb20gaXRzIGhleCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byByZWJ1aWxkXG4gICAqIEByZXR1cm5zIFRoZSByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gY2Fubm90IGJlIHJlYnVpbHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyRmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0eEJ1aWxkZXJGYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uOiAke2Vyci50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
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=
|