@bitgo/abstract-utxo 2.2.0 → 2.3.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/CHANGELOG.md +10 -0
- package/dist/src/abstractUtxoCoin.d.ts +15 -1
- package/dist/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/src/abstractUtxoCoin.js +70 -13
- package/dist/src/sign.d.ts +26 -3
- package/dist/src/sign.d.ts.map +1 -1
- package/dist/src/sign.js +74 -2
- package/dist/tsconfig.tsbuildinfo +451 -287
- package/package.json +7 -7
|
@@ -111,11 +111,13 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
111
111
|
if (_.isUndefined(prebuild.txHex)) {
|
|
112
112
|
throw new Error('missing required txPrebuild property txHex');
|
|
113
113
|
}
|
|
114
|
-
const
|
|
114
|
+
const tx = utxo_lib_1.bitgo.isPsbt(prebuild.txHex)
|
|
115
|
+
? utxo_lib_1.bitgo.createPsbtFromHex(prebuild.txHex, this.network)
|
|
116
|
+
: this.createTransactionFromHex(prebuild.txHex);
|
|
115
117
|
if (_.isUndefined(prebuild.blockHeight)) {
|
|
116
118
|
prebuild.blockHeight = (await this.getLatestBlockHeight());
|
|
117
119
|
}
|
|
118
|
-
return _.extend({}, prebuild, { txHex:
|
|
120
|
+
return _.extend({}, prebuild, { txHex: tx.toHex() });
|
|
119
121
|
}
|
|
120
122
|
/**
|
|
121
123
|
* Find outputs that are within expected outputs but not within actual outputs, including duplicates
|
|
@@ -408,7 +410,21 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
408
410
|
* @returns {boolean}
|
|
409
411
|
*/
|
|
410
412
|
async verifyTransaction(params) {
|
|
411
|
-
|
|
413
|
+
var _a;
|
|
414
|
+
const { txParams, txPrebuild: txPrebuildObj, wallet, verification = { allowPaygoOutput: true }, reqId } = params;
|
|
415
|
+
let txPrebuild;
|
|
416
|
+
// TODO: BG-77743 Add native psbt support - we make a deep copy of the txPrebuild object here to avoid
|
|
417
|
+
// modifying the original object so that we can still use it later on in the function
|
|
418
|
+
if (txPrebuildObj.txHex && utxo_lib_1.bitgo.isPsbt(Buffer.from(txPrebuildObj.txHex, 'hex'))) {
|
|
419
|
+
if ((_a = txPrebuildObj.txInfo) === null || _a === void 0 ? void 0 : _a.unspents) {
|
|
420
|
+
throw new Error('should not have unspents in txInfo for psbt');
|
|
421
|
+
}
|
|
422
|
+
const psbt = utxo_lib_1.bitgo.createPsbtFromHex(txPrebuildObj.txHex, this.network);
|
|
423
|
+
txPrebuild = { ...txPrebuildObj, txHex: psbt.getUnsignedTx().toHex() };
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
txPrebuild = txPrebuildObj;
|
|
427
|
+
}
|
|
412
428
|
const disableNetworking = !!verification.disableNetworking;
|
|
413
429
|
const parsedTransaction = await this.parseTransaction({
|
|
414
430
|
txParams,
|
|
@@ -667,13 +683,25 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
667
683
|
addressType,
|
|
668
684
|
};
|
|
669
685
|
}
|
|
686
|
+
/**
|
|
687
|
+
* @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
|
|
688
|
+
* @param psbtHex all MuSig2 inputs should contain user MuSig2 nonce
|
|
689
|
+
* @param walletId
|
|
690
|
+
*/
|
|
691
|
+
async signPsbt(psbtHex, walletId) {
|
|
692
|
+
const params = { psbt: psbtHex };
|
|
693
|
+
return await this.bitgo
|
|
694
|
+
.post(this.url('/wallet/' + walletId + '/tx/signpsbt'))
|
|
695
|
+
.send(params)
|
|
696
|
+
.result();
|
|
697
|
+
}
|
|
670
698
|
/**
|
|
671
699
|
* Assemble keychain and half-sign prebuilt transaction
|
|
672
700
|
* @param params - {@see SignTransactionOptions}
|
|
673
701
|
* @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
|
|
674
702
|
*/
|
|
675
703
|
async signTransaction(params) {
|
|
676
|
-
var _a;
|
|
704
|
+
var _a, _b;
|
|
677
705
|
const txPrebuild = params.txPrebuild;
|
|
678
706
|
const userPrv = params.prv;
|
|
679
707
|
if (_.isUndefined(txPrebuild) || !_.isObject(txPrebuild)) {
|
|
@@ -682,12 +710,25 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
682
710
|
}
|
|
683
711
|
throw new Error('missing txPrebuild parameter');
|
|
684
712
|
}
|
|
685
|
-
|
|
686
|
-
if (
|
|
687
|
-
|
|
713
|
+
let tx;
|
|
714
|
+
if (utxo_lib_1.bitgo.isPsbt(txPrebuild.txHex)) {
|
|
715
|
+
tx = utxo_lib_1.bitgo.createPsbtFromHex(txPrebuild.txHex, this.network);
|
|
688
716
|
}
|
|
717
|
+
else {
|
|
718
|
+
tx = this.createTransactionFromHex(txPrebuild.txHex);
|
|
719
|
+
if (tx.ins.length !== ((_a = txPrebuild.txInfo.unspents) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
720
|
+
throw new Error('length of unspents array should equal to the number of transaction inputs');
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
const isTransactionWithKeyPathSpendInput = tx instanceof utxo_lib_1.bitgo.UtxoPsbt && utxo_lib_1.bitgo.musig2.isTransactionWithKeyPathSpendInput(tx);
|
|
689
724
|
let isLastSignature = false;
|
|
690
725
|
if (_.isBoolean(params.isLastSignature)) {
|
|
726
|
+
// We can only be the first signature on a transaction with taproot key path spend inputs because
|
|
727
|
+
// we require the secret nonce in the cache of the first signer, which is impossible to retrieve if
|
|
728
|
+
// deserialized from a hex.
|
|
729
|
+
if (isTransactionWithKeyPathSpendInput) {
|
|
730
|
+
throw new Error('Cannot be last signature on a transaction with key path spend inputs');
|
|
731
|
+
}
|
|
691
732
|
// if build is called instead of buildIncomplete, no signature placeholders are left in the sig script
|
|
692
733
|
isLastSignature = params.isLastSignature;
|
|
693
734
|
}
|
|
@@ -705,10 +746,26 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
705
746
|
throw new Error('expected user private key but received public key');
|
|
706
747
|
}
|
|
707
748
|
debug(`Here is the public key of the xprv you used to sign: ${signerKeychain.neutered().toBase58()}`);
|
|
708
|
-
const cosignerPub = (
|
|
749
|
+
const cosignerPub = (_b = params.cosignerPub) !== null && _b !== void 0 ? _b : params.pubs[2];
|
|
709
750
|
const keychains = params.pubs.map((pub) => utxo_lib_1.bip32.fromBase58(pub));
|
|
710
751
|
const cosignerKeychain = utxo_lib_1.bip32.fromBase58(cosignerPub);
|
|
711
|
-
|
|
752
|
+
if (tx instanceof utxo_lib_1.bitgo.UtxoPsbt && isTransactionWithKeyPathSpendInput) {
|
|
753
|
+
tx.setAllInputsMusig2NonceHD(signerKeychain);
|
|
754
|
+
const response = await this.signPsbt(tx.toHex(), txPrebuild.walletId);
|
|
755
|
+
const psbt = utxo_lib_1.bitgo.createPsbtFromHex(response.psbt, this.network);
|
|
756
|
+
tx.combine(psbt);
|
|
757
|
+
}
|
|
758
|
+
let signedTransaction;
|
|
759
|
+
if (tx instanceof utxo_lib_1.bitgo.UtxoPsbt) {
|
|
760
|
+
signedTransaction = sign_1.signAndVerifyPsbt(tx, signerKeychain, { isLastSignature });
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
assert(txPrebuild.txInfo.unspents, 'unspents are required');
|
|
764
|
+
const walletSigner = new utxo_lib_1.bitgo.WalletUnspentSigner(keychains, signerKeychain, cosignerKeychain);
|
|
765
|
+
signedTransaction = sign_1.signAndVerifyWalletTransaction(tx, txPrebuild.txInfo.unspents, walletSigner, {
|
|
766
|
+
isLastSignature,
|
|
767
|
+
});
|
|
768
|
+
}
|
|
712
769
|
return {
|
|
713
770
|
txHex: signedTransaction.toBuffer().toString('hex'),
|
|
714
771
|
};
|
|
@@ -745,7 +802,7 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
745
802
|
* @param params
|
|
746
803
|
*/
|
|
747
804
|
async explainTransaction(params) {
|
|
748
|
-
var _a, _b, _c;
|
|
805
|
+
var _a, _b, _c, _d;
|
|
749
806
|
const txHex = _.get(params, 'txHex');
|
|
750
807
|
if (!txHex || !_.isString(txHex) || !txHex.match(/^([a-f0-9]{2})+$/i)) {
|
|
751
808
|
throw new Error('invalid transaction hex, must be a valid hex string');
|
|
@@ -796,9 +853,9 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
796
853
|
explanation.locktime = transaction.locktime;
|
|
797
854
|
explanation.displayOrder.push('locktime');
|
|
798
855
|
}
|
|
799
|
-
const prevOutputs = (_b = params.txInfo) === null || _b === void 0 ? void 0 : _b.unspents.map((u) => toOutput(u, this.network));
|
|
856
|
+
const prevOutputs = (_c = (_b = params.txInfo) === null || _b === void 0 ? void 0 : _b.unspents) === null || _c === void 0 ? void 0 : _c.map((u) => toOutput(u, this.network));
|
|
800
857
|
// if keys are provided, prepare the keys for input signature checking
|
|
801
|
-
const keys = (
|
|
858
|
+
const keys = (_d = params.pubs) === null || _d === void 0 ? void 0 : _d.map((xpub) => utxo_lib_1.bip32.fromBase58(xpub));
|
|
802
859
|
const walletKeys = keys && keys.length === 3 ? new utxo_lib_1.bitgo.RootWalletKeys(keys) : undefined;
|
|
803
860
|
// get the number of signatures per input
|
|
804
861
|
const inputSignatureCounts = transaction.ins.map((input, idx) => {
|
|
@@ -928,4 +985,4 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
928
985
|
}
|
|
929
986
|
}
|
|
930
987
|
exports.AbstractUtxoCoin = AbstractUtxoCoin;
|
|
931
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsMkNBQTJDO0FBQzNDLDhDQUErRDtBQUMvRCxpQ0FBaUM7QUFDakMsb0RBQW9EO0FBQ3BELG1DQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMsNEJBQTRCO0FBQzVCLCtDQUFxQztBQUVyQyxvRUFBZ0Y7QUFDaEYseUNBTW9CO0FBRXBCLDhDQTBDeUI7QUFDekIsK0NBQWlFO0FBRWpFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUd4Qyx5REFBK0Q7QUFDL0QsaUNBQXdEO0FBQ3hELHFDQUF5RDtBQUV6RCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsMEJBQTBCLEVBQUUsR0FDbEgsZ0JBQUssQ0FBQztBQW1FUixNQUFhLHNCQUF1QixTQUFRLGlCQUFNO0lBR2hELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLFVBQWU7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTkQsd0RBTUM7QUE4R0QsTUFBc0IsZ0JBQWlCLFNBQVEsbUJBQVE7SUFNckQsWUFBc0IsS0FBZ0IsRUFBRSxPQUF3QixFQUFFLGFBQWtDLFFBQVE7UUFDMUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0Q7Z0JBQzdELDZFQUE2RSxDQUNoRixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxH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O1NBQzdCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsZ0JBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTztZQUNMLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ3RDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQXVDO1FBQ2xFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUE2QjtRQUMxQyxPQUFPO0lBQ1QsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFpQztRQUN4RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUM1QixZQUE2QyxFQUM3QyxTQUEyQjtRQUUzQixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFpQjtRQUNuQyxPQUFPLGtCQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQW5sQ0QsNENBbWxDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSwgYml0Z28gfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBiaXRjb2luTWVzc2FnZSBmcm9tICdiaXRjb2luanMtbWVzc2FnZSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmltcG9ydCB7IGJhY2t1cEtleVJlY292ZXJ5LCBSZWNvdmVyUGFyYW1zIH0gZnJvbSAnLi9yZWNvdmVyeS9iYWNrdXBLZXlSZWNvdmVyeSc7XG5pbXBvcnQge1xuICBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQsXG4gIENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkLFxuICBmb3JDb2luLFxuICByZWNvdmVyQ3Jvc3NDaGFpbixcbiAgUmVjb3ZlcnlQcm92aWRlcixcbn0gZnJvbSAnLi9yZWNvdmVyeSc7XG5cbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEFkZHJlc3NUeXBlQ2hhaW5NaXNtYXRjaEVycm9yLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyxcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgSUJhc2VDb2luLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkQWRkcmVzc1ZlcmlmaWNhdGlvbk9iamVjdFByb3BlcnR5RXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW4sXG4gIEtleWNoYWluc1RyaXBsZXQsXG4gIEtleUluZGljZXMsXG4gIFAyc2hQMndzaFVuc3VwcG9ydGVkRXJyb3IsXG4gIFAydHJNdXNpZzJVbnN1cHBvcnRlZEVycm9yLFxuICBQMnRyVW5zdXBwb3J0ZWRFcnJvcixcbiAgUDJ3c2hVbnN1cHBvcnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbiBhcyBCYXNlUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlY3JlYXRlQml0R29PcHRpb25zLFxuICBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBwcm9taXNlUHJvcHMsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uUGFyYW1zIGFzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCBhcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyaXBsZSxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyBhcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG4gIFdhbGxldERhdGEsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBDdXN0b21DaGFuZ2VPcHRpb25zLCBwYXJzZU91dHB1dCB9IGZyb20gJy4vcGFyc2VPdXRwdXQnO1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2Mjp1dHhvJyk7XG5cbmltcG9ydCBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcbmltcG9ydCB7IGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQgfSBmcm9tICcuL3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9zaWduJztcbmltcG9ydCB7IHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzIH0gZnJvbSAnLi9jb25maWcnO1xuXG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBpc0NoYWluQ29kZSwgc2NyaXB0VHlwZUZvckNoYWluLCBvdXRwdXRTY3JpcHRzLCB0b091dHB1dCwgdmVyaWZ5U2lnbmF0dXJlV2l0aFVuc3BlbnQgfSA9XG4gIGJpdGdvO1xudHlwZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gYml0Z28uVW5zcGVudDxUTnVtYmVyPjtcblxudHlwZSBSb290V2FsbGV0S2V5cyA9IGJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBZGRyZXNzT3B0aW9ucyBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZyB8IG51bWJlcjtcbiAgZXh0ZXJuYWw/OiBib29sZWFuO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPHN0cmluZywgc3RyaW5nPiB7XG4gIGxvY2t0aW1lOiBudW1iZXI7XG4gIG91dHB1dHM6IE91dHB1dFtdO1xuICBjaGFuZ2VPdXRwdXRzOiBPdXRwdXRbXTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGlucHV0IHNpZ25hdHVyZXMgcGVyIGlucHV0LlxuICAgKi9cbiAgaW5wdXRTaWduYXR1cmVzOiBudW1iZXJbXTtcblxuICAvKipcbiAgICogSGlnaGVzdCBpbnB1dCBzaWduYXR1cmUgY291bnQgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgc2lnbmF0dXJlczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIC8qKiBNYXBzIHR4aWQgdG8gdHhoZXguIFJlcXVpcmVkIGZvciBvZmZsaW5lIHNpZ25pbmcuICovXG4gIHR4SGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjaGFuZ2VBZGRyZXNzZXM/OiBzdHJpbmdbXTtcbiAgdW5zcGVudHM6IFVuc3BlbnQ8VE51bWJlcj5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBmZWVJbmZvPzogc3RyaW5nO1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCB0eXBlIFV0eG9OZXR3b3JrID0gdXR4b2xpYi5OZXR3b3JrO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QYXJhbXMgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25QYXJhbXMge1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xufVxuXG4vLyBwYXJzZVRyYW5zYWN0aW9ucycgcmV0dXJuIHR5cGUgbWFrZXMgdXNlIG9mIFdhbGxldERhdGEncyB0eXBlIGJ1dCB3aXRoIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMgYXMgcmVxdWlyZWQuXG5leHBvcnQgaW50ZXJmYWNlIEFic3RyYWN0VXR4b0NvaW5XYWxsZXREYXRhIGV4dGVuZHMgV2FsbGV0RGF0YSB7XG4gIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXM6IHtcbiAgICB1c2VyOiBzdHJpbmc7XG4gICAgYmFja3VwOiBzdHJpbmc7XG4gICAgYml0Z286IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic3RyYWN0VXR4b0NvaW5XYWxsZXQgZXh0ZW5kcyBXYWxsZXQge1xuICBwdWJsaWMgX3dhbGxldDogQWJzdHJhY3RVdHhvQ29pbldhbGxldERhdGE7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0RGF0YTogYW55KSB7XG4gICAgc3VwZXIoYml0Z28sIGJhc2VDb2luLCB3YWxsZXREYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICB3YWxsZXQ6IEFic3RyYWN0VXR4b0NvaW5XYWxsZXQ7XG4gIHZlcmlmaWNhdGlvbj86IFZlcmlmaWNhdGlvbk9wdGlvbnM7XG4gIHJlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VkVHJhbnNhY3Rpb24ge1xuICBrZXljaGFpbnM6IHtcbiAgICB1c2VyPzogS2V5Y2hhaW47XG4gICAgYmFja3VwPzogS2V5Y2hhaW47XG4gICAgYml0Z28/OiBLZXljaGFpbjtcbiAgfTtcbiAga2V5U2lnbmF0dXJlczoge1xuICAgIGJhY2t1cFB1Yj86IHN0cmluZztcbiAgICBiaXRnb1B1Yj86IHN0cmluZztcbiAgfTtcbiAgb3V0cHV0czogT3V0cHV0W107XG4gIG1pc3NpbmdPdXRwdXRzOiBPdXRwdXRbXTtcbiAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IE91dHB1dFtdO1xuICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogT3V0cHV0W107XG4gIGNoYW5nZU91dHB1dHM6IE91dHB1dFtdO1xuICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IFROdW1iZXI7XG4gIGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogVE51bWJlcjtcbiAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGJvb2xlYW47XG4gIGN1c3RvbUNoYW5nZT86IEN1c3RvbUNoYW5nZU9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyB7XG4gIGFkZHJlc3NUeXBlPzogU2NyaXB0VHlwZTJPZjM7XG4gIGtleWNoYWluczoge1xuICAgIHB1Yjogc3RyaW5nO1xuICAgIGFzcEtleUlkPzogc3RyaW5nO1xuICB9W107XG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgY2hhaW4/OiBudW1iZXI7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzZWd3aXQ/OiBib29sZWFuO1xuICBiZWNoMzI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEZXRhaWxzIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjaGFpbjogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luOiBzdHJpbmc7XG4gIGNvaW5TcGVjaWZpYzogQWRkcmVzc0NvaW5TcGVjaWZpYztcbiAgYWRkcmVzc1R5cGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgLyoqIFRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gYml0Z28gc2VydmVyICovXG4gIHR4UHJlYnVpbGQ6IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICAgIHR4SW5mbzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB9O1xuICAvKiogeHBydiBvZiB1c2VyIGtleSBvciBiYWNrdXAga2V5ICovXG4gIHBydjogc3RyaW5nO1xuICAvKiogeHB1YnMgdHJpcGxlIGZvciB3YWxsZXQgKHVzZXIsIGJhY2t1cCwgYml0Z28pICovXG4gIHB1YnM6IFRyaXBsZTxzdHJpbmc+O1xuICAvKiogeHB1YiBmb3IgY29zaWduZXIgKGRlZmF1bHRzIHRvIGJpdGdvKSAqL1xuICBjb3NpZ25lclB1Yj86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgY3JlYXRlcyBmdWxsLXNpZ25lZCB0cmFuc2FjdGlvbiB3aXRob3V0IHBsYWNlaG9sZGVyIHNpZ25hdHVyZXMuXG4gICAqIFdoZW4gZmFsc2UsIGNyZWF0ZXMgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKi9cbiAgaXNMYXN0U2lnbmF0dXJlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNpZ0FkZHJlc3Mge1xuICBvdXRwdXRTY3JpcHQ6IEJ1ZmZlcjtcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyO1xuICB3aXRuZXNzU2NyaXB0PzogQnVmZmVyO1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9ucyB7XG4gIHR4aWQ6IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB4cHJ2Pzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBjb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgcmVjb3ZlcnlDb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgc2lnbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbj86IEtleWNoYWluO1xuICBrZXljaGFpblRvVmVyaWZ5PzogS2V5Y2hhaW47XG4gIGtleVNpZ25hdHVyZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbj86IEtleWNoYWluO1xuICBkaXNhYmxlTmV0d29ya2luZzogYm9vbGVhbjtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEJhc2VWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICB3YWxsZXQ6IEFic3RyYWN0VXR4b0NvaW5XYWxsZXQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFV0eG9Db2luIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwdWJsaWMgYWx0U2NyaXB0SGFzaD86IG51bWJlcjtcbiAgcHVibGljIHN1cHBvcnRBbHRTY3JpcHREZXN0aW5hdGlvbj86IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yaywgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICAgIGlmICghdXR4b2xpYi5pc1ZhbGlkTmV0d29yayhuZXR3b3JrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnaW52YWxpZCBuZXR3b3JrOiBwbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSB0aGUgc2FtZSB2ZXJzaW9uIG9mICcgK1xuICAgICAgICAgICdAYml0Z28vdXR4by1saWIgYXMgdGhpcyBsaWJyYXJ5IHdoZW4gaW5pdGlhbGl6aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFtb3VudFR5cGUgPSBhbW91bnRUeXBlO1xuICAgIHRoaXMuX25ldHdvcmsgPSBuZXR3b3JrO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25ldHdvcms7XG4gIH1cblxuICBzd2VlcFdpdGhTZW5kTWFueSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBzdGF0aWMgZ2V0IHZhbGlkQWRkcmVzc1R5cGVzKCk6IFNjcmlwdFR5cGUyT2YzW10ge1xuICAgIHJldHVybiBbLi4ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZhY3RvciBiZXR3ZWVuIHRoZSBiYXNlIHVuaXQgYW5kIGl0cyBzbWFsbGVzdCBzdWJkaXZpc29uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIDFlODtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0Q29pbkxpYnJhcnkoKSB7XG4gICAgcmV0dXJuIHV0eG9saWI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWRkcmVzcyBpcyB2YWxpZFxuICAgKiBAcGFyYW0gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1cbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgcGFyYW0/OiB7IGFueUZvcm1hdDogYm9vbGVhbiB9IHwgLyogbGVnYWN5IHBhcmFtZXRlciAqLyBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Jvb2xlYW4nICYmIHBhcmFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlcHJlY2F0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXRzID0gcGFyYW0gJiYgcGFyYW0uYW55Rm9ybWF0ID8gdW5kZWZpbmVkIDogWydkZWZhdWx0JyBhcyBjb25zdF07XG4gICAgdHJ5IHtcbiAgICAgIHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdFRyeUZvcm1hdHMoYWRkcmVzcywgdGhpcy5uZXR3b3JrLCBmb3JtYXRzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXAzMi5mcm9tQmFzZTU4KHB1YikuaXNOZXV0ZXJlZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYmxvY2sgaGVpZ2h0XG4gICAqIEBwYXJhbSByZXFJZFxuICAgKi9cbiAgYXN5bmMgZ2V0TGF0ZXN0QmxvY2tIZWlnaHQocmVxSWQ/OiBSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYWluaGVhZCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcHVibGljL2Jsb2NrL2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gKGNoYWluaGVhZCBhcyBhbnkpLmhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gY3VzdG9tIGNvaW4gbG9naWMgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIEJpdEdvXG4gICAqIEBwYXJhbSBwcmVidWlsZFxuICAgKi9cbiAgYXN5bmMgcG9zdFByb2Nlc3NQcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj4+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcmVidWlsZC50eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4ocHJlYnVpbGQudHhIZXgpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHByZWJ1aWxkLmJsb2NrSGVpZ2h0KSkge1xuICAgICAgcHJlYnVpbGQuYmxvY2tIZWlnaHQgPSAoYXdhaXQgdGhpcy5nZXRMYXRlc3RCbG9ja0hlaWdodCgpKSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgdHhIZXg6IHRyYW5zYWN0aW9uLnRvSGV4KCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBvdXRwdXRzIHRoYXQgYXJlIHdpdGhpbiBleHBlY3RlZCBvdXRwdXRzIGJ1dCBub3Qgd2l0aGluIGFjdHVhbCBvdXRwdXRzLCBpbmNsdWRpbmcgZHVwbGljYXRlc1xuICAgKiBAcGFyYW0gZXhwZWN0ZWRPdXRwdXRzXG4gICAqIEBwYXJhbSBhY3R1YWxPdXRwdXRzXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluZE1pc3NpbmdPdXRwdXRzKGV4cGVjdGVkT3V0cHV0czogT3V0cHV0W10sIGFjdHVhbE91dHB1dHM6IE91dHB1dFtdKTogT3V0cHV0W10ge1xuICAgIGNvbnN0IGtleUZ1bmMgPSAoeyBhZGRyZXNzLCBhbW91bnQgfTogT3V0cHV0KTogc3RyaW5nID0+IGAke2FkZHJlc3N9OiR7YW1vdW50fWA7XG4gICAgY29uc3QgZ3JvdXBlZE91dHB1dHMgPSBfLmdyb3VwQnkoZXhwZWN0ZWRPdXRwdXRzLCBrZXlGdW5jKTtcblxuICAgIGFjdHVhbE91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3VwZWRPdXRwdXRzW2tleUZ1bmMob3V0cHV0KV07XG4gICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAucG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gXy5mbGF0dGVuKF8udmFsdWVzKGdyb3VwZWRPdXRwdXRzKSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuIGFkZHJlc3MnIHR5cGUgYmFzZWQgb24gaXRzIHdpdG5lc3MgYW5kIHJlZGVlbSBzY3JpcHQgcHJlc2VuY2VcbiAgICogQHBhcmFtIGFkZHJlc3NEZXRhaWxzXG4gICAqL1xuICBzdGF0aWMgaW5mZXJBZGRyZXNzVHlwZShhZGRyZXNzRGV0YWlsczogeyBjaGFpbjogbnVtYmVyIH0pOiBTY3JpcHRUeXBlMk9mMyB8IG51bGwge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShhZGRyZXNzRGV0YWlscy5jaGFpbikgPyBzY3JpcHRUeXBlRm9yQ2hhaW4oYWRkcmVzc0RldGFpbHMuY2hhaW4pIDogbnVsbDtcbiAgfVxuXG4gIGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBoZXg6IHN0cmluZ1xuICApOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KGhleCwgdGhpcy5uZXR3b3JrLCB0aGlzLmFtb3VudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYW5kIGZpbGwgdHJhbnNhY3Rpb24gZGV0YWlscyBzdWNoIGFzIGludGVybmFsL2NoYW5nZSBzcGVuZCwgZXh0ZXJuYWwgc3BlbmQgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCksIGV0Yy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gPSB7fSwgcmVxSWQgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cbiAgICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAgIGNvbnN0IGZldGNoS2V5Y2hhaW5zID0gYXN5bmMgKHdhbGxldDogSVdhbGxldCk6IFByb21pc2U8VmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10+ID0+IHtcbiAgICAgIHJldHVybiBwcm9taXNlUHJvcHMoe1xuICAgICAgICB1c2VyOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5VU0VSXSwgcmVxSWQgfSksXG4gICAgICAgIGJhY2t1cDogdGhpcy5rZXljaGFpbnMoKS5nZXQoeyBpZDogd2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuQkFDS1VQXSwgcmVxSWQgfSksXG4gICAgICAgIGJpdGdvOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5CSVRHT10sIHJlcUlkIH0pLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIG9idGFpbiB0aGUga2V5Y2hhaW5zIGFuZCBrZXkgc2lnbmF0dXJlc1xuICAgIGxldCBrZXljaGFpbnM6IFZlcmlmaWNhdGlvbk9wdGlvbnNbJ2tleWNoYWlucyddIHwgdW5kZWZpbmVkID0gdmVyaWZpY2F0aW9uLmtleWNoYWlucztcbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGZldGNoIGtleWNoYWlucyB3aXRob3V0IG5ldHdvcmtpbmcnKTtcbiAgICAgIH1cbiAgICAgIGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKHdhbGxldCk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMgfHwgIWtleWNoYWlucy51c2VyIHx8ICFrZXljaGFpbnMuYmFja3VwIHx8ICFrZXljaGFpbnMuYml0Z28pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW5zIGFyZSByZXF1aXJlZCwgYnV0IGNvdWxkIG5vdCBiZSBmZXRjaGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5BcnJheTogVHJpcGxlPEtleWNoYWluPiA9IFtrZXljaGFpbnMudXNlciwga2V5Y2hhaW5zLmJhY2t1cCwga2V5Y2hhaW5zLmJpdGdvXTtcblxuICAgIGNvbnN0IGtleVNpZ25hdHVyZXMgPSBfLmdldCh3YWxsZXQsICdfd2FsbGV0LmtleVNpZ25hdHVyZXMnLCB7fSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4UHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG4gICAgLy8gb2J0YWluIGFsbCBvdXRwdXRzXG4gICAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICAgIHR4SW5mbzogdHhQcmVidWlsZC50eEluZm8sXG4gICAgICBwdWJzOiBrZXljaGFpbkFycmF5Lm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWxsT3V0cHV0cyA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXTtcblxuICAgIC8vIHZlcmlmeSB0aGF0IGVhY2ggcmVjaXBpZW50IGZyb20gdHhQYXJhbXMgaGFzIHRoZWlyIG93biBvdXRwdXRcbiAgICBjb25zdCBleHBlY3RlZE91dHB1dHMgPSBfLmdldCh0eFBhcmFtcywgJ3JlY2lwaWVudHMnLCBbXSBhcyBUcmFuc2FjdGlvblJlY2lwaWVudFtdKS5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4ub3V0cHV0LCBhZGRyZXNzOiB0aGlzLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IEFic3RyYWN0VXR4b0NvaW4uZmluZE1pc3NpbmdPdXRwdXRzKGV4cGVjdGVkT3V0cHV0cywgYWxsT3V0cHV0cyk7XG5cbiAgICAvLyBnZXQgdGhlIGtleWNoYWlucyBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIHdhbGxldCBpZiBuZWVkZWRcbiAgICBsZXQgY3VzdG9tQ2hhbmdlOiBDdXN0b21DaGFuZ2VPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgICBpZiAoY3VzdG9tQ2hhbmdlV2FsbGV0SWQpIHtcbiAgICAgIC8vIGZldGNoIGtleWNoYWlucyBmcm9tIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGZvciBkZXJpdmluZyBhZGRyZXNzZXMuXG4gICAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMgPSB3YWxsZXQuX3dhbGxldC5jdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzO1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlV2FsbGV0OiBXYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldHMoKS5nZXQoeyBpZDogY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSk7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY3VzdG9tQ2hhbmdlV2FsbGV0KTtcblxuICAgICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1c3RvbUNoYW5nZUtleXMudXNlciAmJiBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCAmJiBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvICYmIGN1c3RvbUNoYW5nZVdhbGxldCkge1xuICAgICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFtLZXljaGFpbiwgS2V5Y2hhaW4sIEtleWNoYWluXSA9IFtcbiAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLnVzZXIsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgICAgXTtcblxuICAgICAgICBjdXN0b21DaGFuZ2UgPSB7XG4gICAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IFtcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMudXNlcixcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYmFja3VwLFxuICAgICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnbyxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb3AgdGhyb3VnaCBhbGwgdGhlIG91dHB1dHMgYW5kIGNsYXNzaWZ5IGVhY2ggb2YgdGhlbSBhcyBlaXRoZXIgaW50ZXJuYWwgc3BlbmRzXG4gICAgICogb3IgZXh0ZXJuYWwgc3BlbmRzIGJ5IHNldHRpbmcgdGhlIFwiZXh0ZXJuYWxcIiBwcm9wZXJ0eSB0byB0cnVlIG9yIGZhbHNlIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGNvbnN0IGFsbE91dHB1dERldGFpbHM6IE91dHB1dFtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhbGxPdXRwdXRzLm1hcCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICAgICAgY29pbjogdGhpcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgICBrZXljaGFpbkFycmF5LFxuICAgICAgICAgIHdhbGxldCxcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24gPSBhbGxPdXRwdXREZXRhaWxzLnNvbWUoXG4gICAgICAob3V0cHV0KSA9PiBvdXRwdXQubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgICApO1xuXG4gICAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IF8uZmlsdGVyKGFsbE91dHB1dERldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuXG4gICAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgb3V0cHV0cyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAgIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IEFic3RyYWN0VXR4b0NvaW4uZmluZE1pc3NpbmdPdXRwdXRzKGFsbE91dHB1dERldGFpbHMsIGV4cGVjdGVkT3V0cHV0cyk7XG5cbiAgICBjb25zdCBleHBsaWNpdE91dHB1dHMgPSBBYnN0cmFjdFV0eG9Db2luLmZpbmRNaXNzaW5nT3V0cHV0cyhhbGxPdXRwdXREZXRhaWxzLCBpbXBsaWNpdE91dHB1dHMpO1xuXG4gICAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgbm9uLXdhbGxldCBvdXRwdXRzIHRoYXQgaGFkIGJlZW4gb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiByZWNpcGllbnRzXG4gICAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBfLmZpbHRlcihleHBsaWNpdE91dHB1dHMsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG5cbiAgICAvLyB0aGlzIGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIG5vbi13YWxsZXQgb3V0cHV0IHZhbHVlc1xuICAgIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICAgIHRoaXMuYW1vdW50VHlwZVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGFtb3VudCBwZXJ0YWlucyB0byB2ZXJpZnlpbmcgdGhlIHBheS1hcy15b3UtZ28tZmVlIEJpdEdvXG4gICAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgICAqIGluIHRoYXQgd2UgY29tcGFyZSB0aGUgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHRoYXQgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IGJ5IHRoZSB1c2VyIHRvIHRoZSBwb3J0aW9uXG4gICAgICogdGhhdCB3YXMgc3BlY2lmaWVkIGltcGxpY2l0bHkuIFRvIHByb3RlY3QgY3VzdG9tZXJzIGZyb20gcGVvcGxlIHRhbXBlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBvdXRwdXRzLCB3ZVxuICAgICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAgICogZXh0ZXJuYWwgc3BlbmQuXG4gICAgICovXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAgIC8vIGdldCBhbGwgdGhlIGFkZGl0aW9uYWwgZXh0ZXJuYWwgb3V0cHV0cyB0aGUgc2VydmVyIGFkZGVkIGFuZCBjYWxjdWxhdGUgdGhlaXIgdmFsdWVzXG4gICAgY29uc3QgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMgPSBfLmZpbHRlcihpbXBsaWNpdE91dHB1dHMsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG4gICAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvOiBPdXRwdXQpID0+IHN1bSArIEJpZ0ludChvLmFtb3VudCksIEJpZ0ludCgwKSkgYXMgYmlnaW50LFxuICAgICAgdGhpcy5hbW91bnRUeXBlXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXljaGFpbnMsXG4gICAgICBrZXlTaWduYXR1cmVzLFxuICAgICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICAgIG1pc3NpbmdPdXRwdXRzLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHMsXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbixcbiAgICAgIGN1c3RvbUNoYW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY3J5cHQgdGhlIHdhbGxldCdzIHVzZXIgcHJpdmF0ZSBrZXkgYW5kIHZlcmlmeSB0aGF0IHRoZSBjbGFpbWVkIHB1YmxpYyBrZXkgbWF0Y2hlc1xuICAgKiBAcGFyYW0ge1ZlcmlmeVVzZXJQdWJsaWNLZXlPcHRpb25zfSBwYXJhbXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeVVzZXJQdWJsaWNLZXkocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCB0eFBhcmFtcywgZGlzYWJsZU5ldHdvcmtpbmcgfSA9IHBhcmFtcztcbiAgICBpZiAoIXVzZXJLZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIGtleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclB1YiA9IHVzZXJLZXljaGFpbi5wdWI7XG5cbiAgICAvLyBkZWNyeXB0IHRoZSB1c2VyIHByaXZhdGUga2V5IHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCBwdWJsaWMga2V5IGlzIGEgbWF0Y2hcbiAgICBsZXQgdXNlclBydiA9IHVzZXJLZXljaGFpbi5wcnY7XG4gICAgaWYgKF8uaXNFbXB0eSh1c2VyUHJ2KSkge1xuICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmIChlbmNyeXB0ZWRQcnYgJiYgIV8uaXNFbXB0eShlbmNyeXB0ZWRQcnYpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBkZWNyeXB0aW9uIGZhaWxzLCBpdCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgcGFzc3dvcmQ6IHR4UGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXNlclBydikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ3VzZXIgcHJpdmF0ZSBrZXkgdW5hdmFpbGFibGUgZm9yIHZlcmlmaWNhdGlvbic7XG4gICAgICBpZiAoZGlzYWJsZU5ldHdvcmtpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJQcml2YXRlS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2KTtcbiAgICAgIGlmICh1c2VyUHJpdmF0ZUtleS50b0Jhc2U1OCgpID09PSB1c2VyUHJpdmF0ZUtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIHByaXZhdGUga2V5IGlzIG9ubHkgcHVibGljJyk7XG4gICAgICB9XG4gICAgICBpZiAodXNlclByaXZhdGVLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpICE9PSB1c2VyUHViKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBwcml2YXRlIGtleSBkb2VzIG5vdCBtYXRjaCBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHNpZ25hdHVyZXMgcHJvZHVjZWQgYnkgdGhlIHVzZXIga2V5IG92ZXIgdGhlIGJhY2t1cCBhbmQgYml0Z28ga2V5cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGVzZSBzaWduYXR1cmVzIGVuc3VyZSB0aGF0IHRoZSB3YWxsZXQga2V5cyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgd2FsbGV0IGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7VmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnN9IHBhcmFtc1xuICAgKiBAcmV0dXJuIHt7YmFja3VwOiBib29sZWFuLCBiaXRnbzogYm9vbGVhbn19XG4gICAqL1xuICBwcm90ZWN0ZWQgdmVyaWZ5S2V5U2lnbmF0dXJlKHBhcmFtczogVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAvLyBmaXJzdCwgbGV0J3MgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHVzZXIga2V5LCB3aG9zZSBwdWJsaWMga2V5IGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgdmVyaWZpY2F0aW9uc1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBrZXljaGFpblRvVmVyaWZ5LCBrZXlTaWduYXR1cmUgfSA9IHBhcmFtcztcbiAgICBpZiAoIXVzZXJLZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIGtleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpblRvVmVyaWZ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIHRvIHZlcmlmeSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICgha2V5U2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleSBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSB1c2VyIHB1YmxpYyBrZXlcbiAgICBhc3NlcnQodXNlcktleWNoYWluLnB1Yik7XG4gICAgY29uc3QgcHVibGljS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyS2V5Y2hhaW4ucHViKS5wdWJsaWNLZXk7XG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MudG9CYXNlNThDaGVjayhcbiAgICAgIHV0eG9saWIuY3J5cHRvLmhhc2gxNjAocHVibGljS2V5KSxcbiAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pbi5wdWJLZXlIYXNoLFxuICAgICAgdGhpcy5uZXR3b3JrXG4gICAgKTtcblxuICAgIC8vIEJHLTU3MDM6IHVzZSBCVEMgbWFpbm5ldCBwcmVmaXggZm9yIGFsbCBrZXkgc2lnbmF0dXJlIG9wZXJhdGlvbnNcbiAgICAvLyAodGhpcyBtZWFucyBkbyBub3QgcGFzcyBhIHByZWZpeCBwYXJhbWV0ZXIsIGFuZCBsZXQgaXQgdXNlIHRoZSBkZWZhdWx0IHByZWZpeCBpbnN0ZWFkKVxuICAgIGFzc2VydChrZXljaGFpblRvVmVyaWZ5LnB1Yik7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXRjb2luTWVzc2FnZS52ZXJpZnkoa2V5Y2hhaW5Ub1ZlcmlmeS5wdWIsIHNpZ25pbmdBZGRyZXNzLCBCdWZmZXIuZnJvbShrZXlTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ2Vycm9yIHRocm93biBmcm9tIGJpdGNvaW5tZXNzYWdlIHdoaWxlIHZlcmlmeWluZyBrZXkgc2lnbmF0dXJlJywgZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVzIGFnYWluc3QgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgb3ZlciB0aGUgY2hhbmdlIHdhbGxldCBleHRlbmRlZCBrZXlzXG4gICAqIEBwYXJhbSB7UGFyc2VkVHJhbnNhY3Rpb259IHR4XG4gICAqIEBwYXJhbSB7S2V5Y2hhaW59IHVzZXJLZXljaGFpblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgdmVyaWZ5Q3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICB0eDogUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gICAgdXNlcktleWNoYWluOiBLZXljaGFpblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXR4LmN1c3RvbUNoYW5nZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJzZWQgdHJhbnNhY3Rpb24gaXMgbWlzc2luZyByZXF1aXJlZCBjdXN0b20gY2hhbmdlIHZlcmlmaWNhdGlvbiBkYXRhJyk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR4LmN1c3RvbUNoYW5nZS5rZXlzKSB8fCAhQXJyYXkuaXNBcnJheSh0eC5jdXN0b21DaGFuZ2Uuc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tQ2hhbmdlIHByb3BlcnR5IGlzIG1pc3Npbmcga2V5cyBvciBzaWduYXR1cmVzJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXlJbmRleCBvZiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT10pIHtcbiAgICAgIGNvbnN0IGtleWNoYWluVG9WZXJpZnkgPSB0eC5jdXN0b21DaGFuZ2Uua2V5c1trZXlJbmRleF07XG4gICAgICBjb25zdCBrZXlTaWduYXR1cmUgPSB0eC5jdXN0b21DaGFuZ2Uuc2lnbmF0dXJlc1trZXlJbmRleF07XG4gICAgICBpZiAoIWtleWNoYWluVG9WZXJpZnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIGN1c3RvbSBjaGFuZ2UgJHtLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpfSBrZXljaGFpbiBwdWJsaWMga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtleVNpZ25hdHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgcmVxdWlyZWQgY3VzdG9tIGNoYW5nZSAke0tleUluZGljZXNba2V5SW5kZXhdLnRvTG93ZXJDYXNlKCl9IGtleWNoYWluIHNpZ25hdHVyZWApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnZlcmlmeUtleVNpZ25hdHVyZSh7IHVzZXJLZXljaGFpbiwga2V5Y2hhaW5Ub1ZlcmlmeSwga2V5U2lnbmF0dXJlIH0pKSB7XG4gICAgICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgJXMga2V5IHNpZ25hdHVyZSEnLCBLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBwZXJjZW50YWdlIGxpbWl0IGZvciBwYXktYXMteW91LWdvIG91dHB1dHNcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBheUdvTGltaXQoYWxsb3dQYXlnb091dHB1dD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIC8vIGFsbG93aW5nIHBheWdvIG91dHB1dHMgbmVlZHMgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIHNvIG9ubHkgZGlzYWxsb3cgcGF5Z28gb3V0cHV0cyBpZiB0aGVcbiAgICAvLyByZWxldmFudCB2ZXJpZmljYXRpb24gb3B0aW9uIGlzIGJvdGggc2V0IGFuZCBmYWxzZVxuICAgIGlmICghXy5pc05pbChhbGxvd1BheWdvT3V0cHV0KSAmJiAhYWxsb3dQYXlnb091dHB1dCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIDE1MCBiYXNpcyBwb2ludHMgaXMgdGhlIGFic29sdXRlIHBlcm1pdHRlZCBtYXhpbXVtIGlmIHBheWdvIG91dHB1dHMgYXJlIGFsbG93ZWRcbiAgICByZXR1cm4gMC4wMTU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UGFyYW1zIHBhcmFtcyBvYmplY3QgcGFzc2VkIHRvIHNlbmRcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkIHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBzZXJ2ZXJcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4IHByZWJ1aWx0IHRyYW5zYWN0aW9uJ3MgdHhIZXggZm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCBXYWxsZXQgb2JqZWN0IHRvIG9idGFpbiBrZXlzIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uIE9iamVjdCBzcGVjaWZ5aW5nIHNvbWUgdmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgRGlzYWxsb3cgZmV0Y2hpbmcgYW55IGRhdGEgZnJvbSB0aGUgaW50ZXJuZXQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5rZXljaGFpbnMgUGFzcyBrZXljaGFpbnMgbWFudWFsbHkgcmF0aGVyIHRoYW4gZmV0Y2hpbmcgdGhlbSBieSBpZFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5hZGRyZXNzZXMgQWRkcmVzcyBkZXRhaWxzIHRvIHBhc3MgaW4gZm9yIG91dC1vZi1iYW5kIHZlcmlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uID0geyBhbGxvd1BheWdvT3V0cHV0OiB0cnVlIH0sIHJlcUlkIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSAhIXZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcbiAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbjogUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4gPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgdHhQYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgd2FsbGV0LFxuICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgcmVxSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBwYXJzZWRUcmFuc2FjdGlvbi5rZXljaGFpbnM7XG5cbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCB1c2VyIHB1YmxpYyBrZXkgY29ycmVzcG9uZHMgdG8gdGhlIHdhbGxldCdzIHVzZXIgcHJpdmF0ZSBrZXlcbiAgICBsZXQgdXNlclB1YmxpY0tleVZlcmlmaWVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHZlcmlmeSB0aGUgdXNlciBwdWJsaWMga2V5IG1hdGNoZXMgdGhlIHByaXZhdGUga2V5IC0gdGhpcyB3aWxsIHRocm93IGlmIHRoZXJlIGlzIG5vIG1hdGNoXG4gICAgICB1c2VyUHVibGljS2V5VmVyaWZpZWQgPSB0aGlzLnZlcmlmeVVzZXJQdWJsaWNLZXkoeyB1c2VyS2V5Y2hhaW46IGtleWNoYWlucy51c2VyLCBkaXNhYmxlTmV0d29ya2luZywgdHhQYXJhbXMgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byB2ZXJpZnkgdXNlciBwdWJsaWMga2V5IScsIGUpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIHZlcmlmeSB0aGVzZSBrZXljaGFpbnNcbiAgICBjb25zdCBrZXlTaWduYXR1cmVzID0gcGFyc2VkVHJhbnNhY3Rpb24ua2V5U2lnbmF0dXJlcztcbiAgICBpZiAoIV8uaXNFbXB0eShrZXlTaWduYXR1cmVzKSkge1xuICAgICAgY29uc3QgdmVyaWZ5ID0gKGtleSwgcHViKSA9PlxuICAgICAgICB0aGlzLnZlcmlmeUtleVNpZ25hdHVyZSh7IHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zLnVzZXIsIGtleWNoYWluVG9WZXJpZnk6IGtleSwga2V5U2lnbmF0dXJlOiBwdWIgfSk7XG4gICAgICBjb25zdCBpc0JhY2t1cEtleVNpZ25hdHVyZVZhbGlkID0gdmVyaWZ5KGtleWNoYWlucy5iYWNrdXAsIGtleVNpZ25hdHVyZXMuYmFja3VwUHViKTtcbiAgICAgIGNvbnN0IGlzQml0Z29LZXlTaWduYXR1cmVWYWxpZCA9IHZlcmlmeShrZXljaGFpbnMuYml0Z28sIGtleVNpZ25hdHVyZXMuYml0Z29QdWIpO1xuICAgICAgaWYgKCFpc0JhY2t1cEtleVNpZ25hdHVyZVZhbGlkIHx8ICFpc0JpdGdvS2V5U2lnbmF0dXJlVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWNvbmRhcnkgcHVibGljIGtleSBzaWduYXR1cmVzIGludmFsaWQnKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdzdWNjZXNzZnVsbHkgdmVyaWZpZWQgYmFja3VwIGFuZCBiaXRnbyBrZXkgc2lnbmF0dXJlcycpO1xuICAgIH0gZWxzZSBpZiAoIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAvLyB0aGVzZSBrZXlzIHdlcmUgb2J0YWluZWQgb25saW5lIGFuZCB0aGVpciBzaWduYXR1cmVzIHdlcmUgbm90IHZlcmlmaWVkXG4gICAgICAvLyB0aGlzIGNvdWxkIGJlIGRhbmdlcm91c1xuICAgICAgY29uc29sZS5sb2coJ3Vuc2lnbmVkIGtleXMgb2J0YWluZWQgb25saW5lIGFyZSBiZWluZyB1c2VkIGZvciBhZGRyZXNzIHZlcmlmaWNhdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRUcmFuc2FjdGlvbi5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbikge1xuICAgICAgaWYgKCFrZXljaGFpbnMudXNlciB8fCAhdXNlclB1YmxpY0tleVZlcmlmaWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gcmVxdWlyZXMgdmVyaWZpY2F0aW9uIG9mIHVzZXIgcHVibGljIGtleSwgYnV0IGl0IHdhcyB1bmFibGUgdG8gYmUgdmVyaWZpZWQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXNWZXJpZmllZCA9IHRoaXMudmVyaWZ5Q3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyhwYXJzZWRUcmFuc2FjdGlvbiwga2V5Y2hhaW5zLnVzZXIpO1xuICAgICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICd0cmFuc2FjdGlvbiByZXF1aXJlcyB2ZXJpZmljYXRpb24gb2YgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcywgYnV0IHRoZXkgd2VyZSB1bmFibGUgdG8gYmUgdmVyaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWJ1Zygnc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIHVzZXIgcHVibGljIGtleSBhbmQgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gcGFyc2VkVHJhbnNhY3Rpb24ubWlzc2luZ091dHB1dHM7XG4gICAgaWYgKG1pc3NpbmdPdXRwdXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdGhlcmUgYXJlIHNvbWUgb3V0cHV0cyBpbiB0aGUgcmVjaXBpZW50cyBsaXN0IHRoYXQgaGF2ZSBub3QgbWFkZSBpdCBpbnRvIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgb3V0cHV0cyBtaXNzaW5nIGluIHRyYW5zYWN0aW9uIHByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZW5kZWRFeHRlcm5hbFNwZW5kID0gcGFyc2VkVHJhbnNhY3Rpb24uZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50O1xuXG4gICAgLy8gdGhpcyBpcyBhIGxpbWl0IHdlIGltcG9zZSBmb3IgdGhlIHRvdGFsIHZhbHVlIHRoYXQgaXMgYW1lbmRlZCB0byB0aGUgdHJhbnNhY3Rpb24gYmV5b25kIHdoYXQgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWRcbiAgICBjb25zdCBwYXlBc1lvdUdvTGltaXQgPSBuZXcgQmlnTnVtYmVyKHRoaXMuZ2V0UGF5R29MaW1pdCh2ZXJpZmljYXRpb24uYWxsb3dQYXlnb091dHB1dCkpLm11bHRpcGxpZWRCeShcbiAgICAgIGludGVuZGVkRXh0ZXJuYWxTcGVuZC50b1N0cmluZygpXG4gICAgKTtcblxuICAgIC8qXG4gICAgU29tZSBleHBsYW5hdGlvbiBmb3Igd2h5IHdlJ3JlIGRvaW5nIHdoYXQgd2UncmUgZG9pbmc6XG4gICAgU29tZSBjdXN0b21lcnMgd2lsbCBoYXZlIGFuIG91dHB1dCB0byBCaXRHbydzIFBBWUdvIHdhbGxldCBhZGRlZCB0byB0aGVpciB0cmFuc2FjdGlvbiwgYW5kIHdlIG5lZWQgdG8gYWNjb3VudCBmb3JcbiAgICBpdCBoZXJlLiBUbyBwcm90ZWN0IHNvbWVvbmUgdGFtcGVyaW5nIHdpdGggdGhlIG91dHB1dCB0byBtYWtlIGl0IHNlbmQgbW9yZSB0aGFuIGl0IHNob3VsZCB0byBCaXRHbywgd2UgZGVmaW5lIGFcbiAgICB0aHJlc2hvbGQgZm9yIHRoZSBvdXRwdXQncyB2YWx1ZSBhYm92ZSB3aGljaCB3ZSdsbCB0aHJvdyBhbiBlcnJvciwgYmVjYXVzZSB0aGUgcGF5Z28gb3V0cHV0IHNob3VsZCBuZXZlciBiZSB0aGF0XG4gICAgaGlnaC5cbiAgICAgKi9cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZXh0cmEgYWRkcmVzc2VzIGFyZSBjaGFuZ2UgYWRkcmVzc2VzXG4gICAgLy8gZ2V0IGFsbCB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIHRoZSBzZXJ2ZXIgYWRkZWQgYW5kIGNhbGN1bGF0ZSB0aGVpciB2YWx1ZXNcbiAgICBjb25zdCBub25DaGFuZ2VBbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcnNlZFRyYW5zYWN0aW9uLmltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudC50b1N0cmluZygpKTtcblxuICAgIGRlYnVnKFxuICAgICAgJ0ludGVuZGVkIHNwZW5kIGlzICVzLCBOb24tY2hhbmdlIGFtb3VudCBpcyAlcywgcGF5Z28gbGltaXQgaXMgJXMnLFxuICAgICAgaW50ZW5kZWRFeHRlcm5hbFNwZW5kLnRvU3RyaW5nKCksXG4gICAgICBub25DaGFuZ2VBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIHBheUFzWW91R29MaW1pdC50b1N0cmluZygpXG4gICAgKTtcblxuICAgIC8vIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgY2FuIG9ubHkgYmUgQml0R28ncyBwYXktYXMteW91LWdvIGZlZSwgYnV0IHdlIGNhbm5vdCB2ZXJpZnkgdGhlIHdhbGxldCBhZGRyZXNzXG4gICAgaWYgKG5vbkNoYW5nZUFtb3VudC5ndChwYXlBc1lvdUdvTGltaXQpKSB7XG4gICAgICAvLyB0aGVyZSBhcmUgc29tZSBhZGRyZXNzZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgaW50ZW5kZWQgcmVjaXBpZW50cyB0aGF0IGFyZSBub3QgY2hhbmdlIGFkZHJlc3Nlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmVidWlsZCBhdHRlbXB0cyB0byBzcGVuZCB0byB1bmludGVuZGVkIGV4dGVybmFsIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxPdXRwdXRzID0gcGFyc2VkVHJhbnNhY3Rpb24ub3V0cHV0cztcbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZC50eEhleCBub3Qgc2V0YCk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25DYWNoZSA9IHt9O1xuICAgIGNvbnN0IGlucHV0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHJhbnNhY3Rpb24uaW5zLm1hcChhc3luYyAoY3VycmVudElucHV0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSAoQnVmZmVyLmZyb20oY3VycmVudElucHV0Lmhhc2gpLnJldmVyc2UoKSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgY29uc3QgdHhIZXggPSB0eFByZWJ1aWxkLnR4SW5mbz8udHhIZXhlcz8uW3RyYW5zYWN0aW9uSWRdO1xuICAgICAgICBpZiAodHhIZXgpIHtcbiAgICAgICAgICBjb25zdCBsb2NhbFR4ID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhIZXgpO1xuICAgICAgICAgIGlmIChsb2NhbFR4LmdldElkKCkgIT09IHRyYW5zYWN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXQgdHJhbnNhY3Rpb24gaGV4IGRvZXMgbm90IG1hdGNoIGlkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRPdXRwdXQgPSBsb2NhbFR4Lm91dHNbY3VycmVudElucHV0LmluZGV4XTtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoY3VycmVudE91dHB1dC5zY3JpcHQsIHRoaXMubmV0d29yayk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogY3VycmVudE91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3RyaW5nOiBjdXJyZW50T3V0cHV0LnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdHJhbnNhY3Rpb25DYWNoZVt0cmFuc2FjdGlvbklkXSkge1xuICAgICAgICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRyYW5zYWN0aW9uIGRldGFpbHMgZXh0ZXJuYWxseSB3aXRoIG5ldHdvcmtpbmcgZGlzYWJsZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcUlkKSB7XG4gICAgICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc2FjdGlvbkNhY2hlW3RyYW5zYWN0aW9uSWRdID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoYC9wdWJsaWMvdHgvJHt0cmFuc2FjdGlvbklkfWApKS5yZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbkRldGFpbHMgPSB0cmFuc2FjdGlvbkNhY2hlW3RyYW5zYWN0aW9uSWRdO1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25EZXRhaWxzLm91dHB1dHNbY3VycmVudElucHV0LmluZGV4XTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGNvaW5zIChkb2dlKSB0aGF0IGNhbiBleGNlZWQgbnVtYmVyIGxpbWl0cyAoYW5kIHRodXMgd2lsbCB1c2UgYmlnaW50KSB3aWxsIGhhdmUgdGhlIGB2YWx1ZVN0cmluZ2AgZmllbGRcbiAgICBjb25zdCBpbnB1dEFtb3VudCA9IGlucHV0cy5yZWR1Y2UoXG4gICAgICAoc3VtOiBiaWdpbnQsIGkpID0+IHN1bSArIEJpZ0ludCh0aGlzLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gaS52YWx1ZVN0cmluZyA6IGkudmFsdWUpLFxuICAgICAgQmlnSW50KDApXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBhbGxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBmZWUgPSBpbnB1dEFtb3VudCAtIG91dHB1dEFtb3VudDtcblxuICAgIGlmIChmZWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhdHRlbXB0aW5nIHRvIHNwZW5kICR7b3V0cHV0QW1vdW50fSBzYXRvc2hpcywgd2hpY2ggZXhjZWVkcyB0aGUgaW5wdXQgYW1vdW50ICgke2lucHV0QW1vdW50fSBzYXRvc2hpcykgYnkgJHstZmVlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBzdXJlIGFuIGFkZHJlc3MgaXMgdmFsaWQgYW5kIHRocm93IGFuIGVycm9yIGlmIGl0J3Mgbm90LlxuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3Mgc3RyaW5nIG9uIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgS2V5Y2hhaW4gb2JqZWN0cyB3aXRoIHhwdWJzXG4gICAqIEBwYXJhbSBwYXJhbXMuY29pblNwZWNpZmljIENvaW4tc3BlY2lmaWMgZGV0YWlscyBmb3IgdGhlIGFkZHJlc3Mgc3VjaCBhcyBhIHdpdG5lc3Mgc2NyaXB0XG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhaW4gRGVyaXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zLmluZGV4IERlcml2YXRpb24gaW5kZXhcbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NFcnJvcn1cbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcn1cbiAgICogQHRocm93cyB7VW5leHBlY3RlZEFkZHJlc3NFcnJvcn1cbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBhZGRyZXNzVHlwZSwga2V5Y2hhaW5zLCBjb2luU3BlY2lmaWMsIGNoYWluLCBpbmRleCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgaWYgKChfLmlzVW5kZWZpbmVkKGNoYWluKSAmJiBfLmlzVW5kZWZpbmVkKGluZGV4KSkgfHwgIShfLmlzRmluaXRlKGNoYWluKSAmJiBfLmlzRmluaXRlKGluZGV4KSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IGludmFsaWQgY2hhaW4gKCR7Y2hhaW59KSBvciBpbmRleCAoJHtpbmRleH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QoY29pblNwZWNpZmljKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzVmVyaWZpY2F0aW9uT2JqZWN0UHJvcGVydHlFcnJvcihcbiAgICAgICAgJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBjb2luU3BlY2lmaWMgZmllbGQgbXVzdCBiZSBhbiBvYmplY3QnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gdGhpcy5nZW5lcmF0ZUFkZHJlc3Moe1xuICAgICAgYWRkcmVzc1R5cGU6IGFkZHJlc3NUeXBlIGFzIFNjcmlwdFR5cGUyT2YzLFxuICAgICAga2V5Y2hhaW5zLFxuICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgY2hhaW4sXG4gICAgICBpbmRleCxcbiAgICB9KTtcblxuICAgIGlmIChleHBlY3RlZEFkZHJlc3MuYWRkcmVzcyAhPT0gYWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogZXhwZWN0ZWQgJHtleHBlY3RlZEFkZHJlc3MuYWRkcmVzc30gYnV0IGdvdCAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBjb2luIHN1cHBvcnRzIGEgYmxvY2sgdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3VwcG9ydHNCbG9ja1RhcmdldCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIHVuc3BlbnRUeXBlXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuaXNTdXBwb3J0ZWRTY3JpcHRUeXBlKHRoaXMubmV0d29yaywgYWRkcmVzc1R5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcmV0dXJuIHRydWUgaWZmIGNvaW4gc3VwcG9ydHMgc3BlbmRpbmcgZnJvbSBjaGFpblxuICAgKi9cbiAgc3VwcG9ydHNBZGRyZXNzQ2hhaW4oY2hhaW46IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShjaGFpbikgJiYgdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSk7XG4gIH1cblxuICBrZXlJZHNGb3JTaWduaW5nKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRPRE8oQkctMTE0ODcpOiBSZW1vdmUgYWRkcmVzc1R5cGUsIHNlZ3dpdCwgYW5kIGJlY2gzMiBwYXJhbXMgaW4gU0RLdjZcbiAgICogR2VuZXJhdGUgYW4gYWRkcmVzcyBmb3IgYSB3YWxsZXQgYmFzZWQgb24gYSBzZXQgb2YgY29uZmlndXJhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzVHlwZSB7c3RyaW5nfSAgIERlcHJlY2F0ZWRcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgICB7W29iamVjdF19IEFycmF5IG9mIG9iamVjdHMgd2l0aCB4cHVic1xuICAgKiBAcGFyYW0gcGFyYW1zLnRocmVzaG9sZCAgIHtudW1iZXJ9ICAgTWluaW11bSBudW1iZXIgb2Ygc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNoYWluICAgICAgIHtudW1iZXJ9ICAgRGVyaXZhdGlvbiBjaGFpbiAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9CaXRHby91bnNwZW50cy9ibG9iL21hc3Rlci9zcmMvY29kZXMudHMgZm9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGFkZHJlc3MgdHlwZSBvZiBhIGdpdmVuIGNoYWluIGNvZGUpXG4gICAqIEBwYXJhbSBwYXJhbXMuaW5kZXggICAgICAge251bWJlcn0gICBEZXJpdmF0aW9uIGluZGV4XG4gICAqIEBwYXJhbSBwYXJhbXMuc2Vnd2l0ICAgICAge2Jvb2xlYW59ICBEZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXMuYmVjaDMyICAgICAge2Jvb2xlYW59ICBEZXByZWNhdGVkXG4gICAqIEByZXR1cm5zIHt7Y2hhaW46IG51bWJlciwgaW5kZXg6IG51bWJlciwgY29pbjogbnVtYmVyLCBjb2luU3BlY2lmaWM6IHtvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdH19fVxuICAgKi9cbiAgZ2VuZXJhdGVBZGRyZXNzKHBhcmFtczogR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyk6IEFkZHJlc3NEZXRhaWxzIHtcbiAgICBjb25zdCB7IGtleWNoYWlucywgdGhyZXNob2xkLCBjaGFpbiwgaW5kZXgsIHNlZ3dpdCA9IGZhbHNlLCBiZWNoMzIgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICAgIGxldCBkZXJpdmF0aW9uQ2hhaW4gPSBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xuICAgIGlmIChfLmlzTnVtYmVyKGNoYWluKSAmJiBfLmlzSW50ZWdlcihjaGFpbikgJiYgaXNDaGFpbkNvZGUoY2hhaW4pKSB7XG4gICAgICBkZXJpdmF0aW9uQ2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0RmxhZ3NUb0FkZHJlc3NUeXBlKCk6IFNjcmlwdFR5cGUyT2YzIHtcbiAgICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikpIHtcbiAgICAgICAgcmV0dXJuIHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQm9vbGVhbihzZWd3aXQpICYmIHNlZ3dpdCkge1xuICAgICAgICByZXR1cm4gJ3Ayc2hQMndzaCc7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKGJlY2gzMikgJiYgYmVjaDMyKSB7XG4gICAgICAgIHJldHVybiAncDJ3c2gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdwMnNoJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzVHlwZSA9IHBhcmFtcy5hZGRyZXNzVHlwZSB8fCBjb252ZXJ0RmxhZ3NUb0FkZHJlc3NUeXBlKCk7XG5cbiAgICBpZiAoYWRkcmVzc1R5cGUgIT09IHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGRlcml2YXRpb25DaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBBZGRyZXNzVHlwZUNoYWluTWlzbWF0Y2hFcnJvcihhZGRyZXNzVHlwZSwgZGVyaXZhdGlvbkNoYWluKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNBZGRyZXNzVHlwZShhZGRyZXNzVHlwZSkpIHtcbiAgICAgIHN3aXRjaCAoYWRkcmVzc1R5cGUpIHtcbiAgICAgICAgY2FzZSAncDJzaCc6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnRlcm5hbCBlcnJvcjogcDJzaCBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZGApO1xuICAgICAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgICAgIHRocm93IG5ldyBQMnNoUDJ3c2hVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ3c2hVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3AydHInOlxuICAgICAgICAgIHRocm93IG5ldyBQMnRyVW5zdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICBjYXNlICdwMnRyTXVzaWcyJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ0ck11c2lnMlVuc3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKHRocmVzaG9sZCkpIHtcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZCBhcyBudW1iZXI7XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkID4ga2V5Y2hhaW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBjYW5ub3QgZXhjZWVkIG51bWJlciBvZiBrZXlzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25JbmRleCA9IDA7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKGluZGV4KSAmJiAoaW5kZXggYXMgbnVtYmVyKSA+IDApIHtcbiAgICAgIGRlcml2YXRpb25JbmRleCA9IGluZGV4IGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gJzAvMC8nICsgZGVyaXZhdGlvbkNoYWluICsgJy8nICsgZGVyaXZhdGlvbkluZGV4O1xuICAgIGNvbnN0IGhkTm9kZXMgPSBrZXljaGFpbnMubWFwKCh7IHB1YiB9KSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpO1xuICAgIGNvbnN0IGRlcml2ZWRLZXlzID0gaGROb2Rlcy5tYXAoKGhkTm9kZSkgPT4gaGROb2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhdGgpKS5wdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgeyBvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgYWRkcmVzcyB9ID0gdGhpcy5jcmVhdGVNdWx0aVNpZ0FkZHJlc3MoXG4gICAgICBhZGRyZXNzVHlwZSxcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCxcbiAgICAgIGRlcml2ZWRLZXlzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzLFxuICAgICAgY2hhaW46IGRlcml2YXRpb25DaGFpbixcbiAgICAgIGluZGV4OiBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgb3V0cHV0U2NyaXB0OiBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICByZWRlZW1TY3JpcHQ6IHJlZGVlbVNjcmlwdCAmJiByZWRlZW1TY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB3aXRuZXNzU2NyaXB0OiB3aXRuZXNzU2NyaXB0ICYmIHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGFkZHJlc3NUeXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgU2lnblRyYW5zYWN0aW9uT3B0aW9uc31cbiAgICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eFByZWJ1aWxkID0gcGFyYW1zLnR4UHJlYnVpbGQ7XG4gICAgY29uc3QgdXNlclBydiA9IHBhcmFtcy5wcnY7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkKSB8fCAhXy5pc09iamVjdCh0eFByZWJ1aWxkKSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpICYmICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhQcmVidWlsZH1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KHR4UHJlYnVpbGQudHhIZXgpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uLmlucy5sZW5ndGggIT09IHR4UHJlYnVpbGQudHhJbmZvLnVuc3BlbnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggb2YgdW5zcGVudHMgYXJyYXkgc2hvdWxkIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gaW5wdXRzJyk7XG4gICAgfVxuXG4gICAgbGV0IGlzTGFzdFNpZ25hdHVyZSA9IGZhbHNlO1xuICAgIGlmIChfLmlzQm9vbGVhbihwYXJhbXMuaXNMYXN0U2lnbmF0dXJlKSkge1xuICAgICAgLy8gaWYgYnVpbGQgaXMgY2FsbGVkIGluc3RlYWQgb2YgYnVpbGRJbmNvbXBsZXRlLCBubyBzaWduYXR1cmUgcGxhY2Vob2xkZXJzIGFyZSBsZWZ0IGluIHRoZSBzaWcgc2NyaXB0XG4gICAgICBpc0xhc3RTaWduYXR1cmUgPSBwYXJhbXMuaXNMYXN0U2lnbmF0dXJlO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHVzZXJQcnYpIHx8ICFfLmlzU3RyaW5nKHVzZXJQcnYpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodXNlclBydikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcnYgbXVzdCBiZSBhIHN0cmluZywgZ290IHR5cGUgJHt0eXBlb2YgdXNlclBydn1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wdWJzIHx8IHBhcmFtcy5wdWJzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgeHB1YiBhcnJheWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lcktleWNoYWluID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGlmIChzaWduZXJLZXljaGFpbi5pc05ldXRlcmVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgdXNlciBwcml2YXRlIGtleSBidXQgcmVjZWl2ZWQgcHVibGljIGtleScpO1xuICAgIH1cbiAgICBkZWJ1ZyhgSGVyZSBpcyB0aGUgcHVibGljIGtleSBvZiB0aGUgeHBydiB5b3UgdXNlZCB0byBzaWduOiAke3NpZ25lcktleWNoYWluLm5ldXRlcmVkKCkudG9CYXNlNTgoKX1gKTtcblxuICAgIGNvbnN0IGNvc2lnbmVyUHViID0gcGFyYW1zLmNvc2lnbmVyUHViID8/IHBhcmFtcy5wdWJzWzJdO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5wdWJzLm1hcCgocHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT47XG4gICAgY29uc3QgY29zaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgoY29zaWduZXJQdWIpO1xuXG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24oXG4gICAgICB0cmFuc2FjdGlvbixcbiAgICAgIHR4UHJlYnVpbGQudHhJbmZvLnVuc3BlbnRzLFxuICAgICAgbmV3IGJpdGdvLldhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+KGtleWNoYWlucywgc2lnbmVyS2V5Y2hhaW4sIGNvc2lnbmVyS2V5Y2hhaW4pLFxuICAgICAgeyBpc0xhc3RTaWduYXR1cmUgfVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHVuc3BlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0JpdEdvVGFpbnRlZFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4odW5zcGVudDogVW5zcGVudDxUTnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50PFROdW1iZXI+KHVuc3BlbnQsIHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKSBpbnN0ZWFkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGVmYXVsdFNpZ0hhc2hUeXBlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2godGhpcy5uZXR3b3JrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB1dHhvbGliLmJpdGNvaW4udmVyaWZ5U2lnbmF0dXJlKCkgaW5zdGVhZFxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKFxuICAgIHRyYW5zYWN0aW9uOiBhbnksXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGFtb3VudDogbnVtYmVyLFxuICAgIHZlcmlmaWNhdGlvblNldHRpbmdzOiB7XG4gICAgICBzaWduYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICAgIHB1YmxpY0tleT86IHN0cmluZztcbiAgICB9ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm5ldHdvcmsgIT09IHRoaXMubmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBuZXR3b3JrIG1pc21hdGNoYCk7XG4gICAgfVxuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLnZlcmlmeVNpZ25hdHVyZSh0cmFuc2FjdGlvbiwgaW5wdXRJbmRleCwgYW1vdW50LCB7XG4gICAgICBzaWduYXR1cmVJbmRleDogdmVyaWZpY2F0aW9uU2V0dGluZ3Muc2lnbmF0dXJlSW5kZXgsXG4gICAgICBwdWJsaWNLZXk6IHZlcmlmaWNhdGlvblNldHRpbmdzLnB1YmxpY0tleSA/IEJ1ZmZlci5mcm9tKHZlcmlmaWNhdGlvblNldHRpbmdzLnB1YmxpY0tleSwgJ2hleCcpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcG9zZSBhIHJhdyB0cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAgICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gXy5nZXQocGFyYW1zLCAndHhIZXgnKTtcbiAgICBpZiAoIXR4SGV4IHx8ICFfLmlzU3RyaW5nKHR4SGV4KSB8fCAhdHhIZXgubWF0Y2goL14oW2EtZjAtOV17Mn0pKyQvaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0cmFuc2FjdGlvbiBoZXgsIG11c3QgYmUgYSB2YWxpZCBoZXggc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBwYXJzZSB0cmFuc2FjdGlvbiBoZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHRyYW5zYWN0aW9uLmdldElkKCk7XG4gICAgbGV0IHNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oMCwgdGhpcy5hbW91bnRUeXBlKTtcbiAgICBsZXQgY2hhbmdlQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oMCwgdGhpcy5hbW91bnRUeXBlKTtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cyddLFxuICAgICAgaWQ6IGlkLFxuICAgICAgb3V0cHV0czogW10gYXMgT3V0cHV0W10sXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSBhcyBPdXRwdXRbXSxcbiAgICB9IGFzIFRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG5cbiAgICBjb25zdCB7IGNoYW5nZUFkZHJlc3NlcyA9IFtdLCB1bnNwZW50cyA9IFtdIH0gPSBwYXJhbXMudHhJbmZvID8/IHt9O1xuXG4gICAgdHJhbnNhY3Rpb24ub3V0cy5mb3JFYWNoKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KGN1cnJlbnRPdXRwdXQuc2NyaXB0LCB0aGlzLm5ldHdvcmspO1xuICAgICAgY29uc3QgY3VycmVudEFtb3VudCA9IGN1cnJlbnRPdXRwdXQudmFsdWU7XG5cbiAgICAgIGlmIChjaGFuZ2VBZGRyZXNzZXMuaW5jbHVkZXMoY3VycmVudEFkZHJlc3MpKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgY2hhbmdlXG4gICAgICAgIGNoYW5nZUFtb3VudCArPSBjdXJyZW50QW1vdW50O1xuICAgICAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogY3VycmVudEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzcGVuZEFtb3VudCArPSBjdXJyZW50QW1vdW50O1xuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogY3VycmVudEFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50ID0gc3BlbmRBbW91bnQudG9TdHJpbmcoKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQgPSBjaGFuZ2VBbW91bnQudG9TdHJpbmcoKTtcblxuICAgIC8vIGFkZCBmZWUgaW5mbyBpZiBhdmFpbGFibGVcbiAgICBpZiAocGFyYW1zLmZlZUluZm8pIHtcbiAgICAgIGV4cGxhbmF0aW9uLmRpc3BsYXlPcmRlci5wdXNoKCdmZWUnKTtcbiAgICAgIGV4cGxhbmF0aW9uLmZlZSA9IHBhcmFtcy5mZWVJbmZvO1xuICAgIH1cblxuICAgIGlmIChfLmlzSW50ZWdlcih0cmFuc2FjdGlvbi5sb2NrdGltZSkgJiYgdHJhbnNhY3Rpb24ubG9ja3RpbWUgPiAwKSB7XG4gICAgICBleHBsYW5hdGlvbi5sb2NrdGltZSA9IHRyYW5zYWN0aW9uLmxvY2t0aW1lO1xuICAgICAgZXhwbGFuYXRpb24uZGlzcGxheU9yZGVyLnB1c2goJ2xvY2t0aW1lJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldk91dHB1dHMgPSBwYXJhbXMudHhJbmZvPy51bnNwZW50cy5tYXAoKHUpID0+IHRvT3V0cHV0PFROdW1iZXI+KHUsIHRoaXMubmV0d29yaykpO1xuXG4gICAgLy8gaWYga2V5cyBhcmUgcHJvdmlkZWQsIHByZXBhcmUgdGhlIGtleXMgZm9yIGlucHV0IHNpZ25hdHVyZSBjaGVja2luZ1xuICAgIGNvbnN0IGtleXMgPSBwYXJhbXMucHVicz8ubWFwKCh4cHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHhwdWIpKTtcbiAgICBjb25zdCB3YWxsZXRLZXlzID0ga2V5cyAmJiBrZXlzLmxlbmd0aCA9PT0gMyA/IG5ldyBiaXRnby5Sb290V2FsbGV0S2V5cyhrZXlzIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4pIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gZ2V0IHRoZSBudW1iZXIgb2Ygc2lnbmF0dXJlcyBwZXIgaW5wdXRcbiAgICBjb25zdCBpbnB1dFNpZ25hdHVyZUNvdW50cyA9IHRyYW5zYWN0aW9uLmlucy5tYXAoKGlucHV0LCBpZHgpOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCAhPT0gdHJhbnNhY3Rpb24uaW5zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmV2T3V0cHV0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc3RhdGVgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF3YWxsZXRLZXlzKSB7XG4gICAgICAgIC8vIG5vIHB1YiBrZXlzIG9yIGluY29ycmVjdCBudW1iZXIgb2YgcHViIGtleXNcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2ZXJpZnlTaWduYXR1cmVXaXRoVW5zcGVudDxUTnVtYmVyPih0cmFuc2FjdGlvbiwgaWR4LCB1bnNwZW50cywgd2FsbGV0S2V5cykuZmlsdGVyKCh2KSA9PiB2KS5sZW5ndGg7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJyZWQgYW5kIHdlIGNhbid0IHZhbGlkYXRlIHRoZSBzaWduYXR1cmVzXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwbGFuYXRpb24uaW5wdXRTaWduYXR1cmVzID0gaW5wdXRTaWduYXR1cmVDb3VudHM7XG4gICAgZXhwbGFuYXRpb24uc2lnbmF0dXJlcyA9IF8ubWF4KGlucHV0U2lnbmF0dXJlQ291bnRzKSBhcyBudW1iZXI7XG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG11bHRpc2lnIGFkZHJlc3Mgb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsaXN0IG9mIGtleWNoYWlucyBhbmQgYSBzaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHNpZ25hdHVyZVRocmVzaG9sZFxuICAgKiBAcGFyYW0ga2V5c1xuICAgKi9cbiAgY3JlYXRlTXVsdGlTaWdBZGRyZXNzKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMywgc2lnbmF0dXJlVGhyZXNob2xkOiBudW1iZXIsIGtleXM6IEJ1ZmZlcltdKTogTXVsdGlTaWdBZGRyZXNzIHtcbiAgICBjb25zdCB7XG4gICAgICBzY3JpcHRQdWJLZXk6IG91dHB1dFNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgfSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGtleXMsIGFkZHJlc3NUeXBlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRTY3JpcHQsXG4gICAgICByZWRlZW1TY3JpcHQsXG4gICAgICB3aXRuZXNzU2NyaXB0LFxuICAgICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0LCB0aGlzLm5ldHdvcmspLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Uge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtcyAtIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IFJlY292ZXJQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiBiYWNrdXBLZXlSZWNvdmVyeT4ge1xuICAgIHJldHVybiBiYWNrdXBLZXlSZWNvdmVyeSh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgY29pbiB0aGF0IHdhcyBzZW50IHRvIHdyb25nIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eGlkIFRoZSB0eGlkIG9mIHRoZSBmYXVsdHkgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlDb2luIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnNpZ25lZCByZXR1cm4gYSBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiAoZGVmYXVsdD10cnVlKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMueHBydiB0aGUgdW5lbmNyeXB0ZWQgeHBydiAodXNlZCBpbnN0ZWFkIG9mIHdhbGxldCBwYXNzcGhyYXNlKVxuICAgKiBAcGFyYW0gcGFyYW1zLmFwaUtleSBmb3IgdXR4byBjb2lucyBvdGhlciB0aGFuIFtCVEMsVEJUQ10gdGhpcyBpcyBhIEJsb2NrIENoYWlyIGFwaSBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZWNvdmVyRnJvbVdyb25nQ2hhaW48VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBSZWNvdmVyRnJvbVdyb25nQ2hhaW5PcHRpb25zXG4gICk6IFByb21pc2U8Q3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXI+IHwgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlcj4+IHtcbiAgICBjb25zdCB7IHR4aWQsIHJlY292ZXJ5QWRkcmVzcywgd2FsbGV0LCB3YWxsZXRQYXNzcGhyYXNlLCB4cHJ2LCBhcGlLZXkgfSA9IHBhcmFtcztcblxuICAgIC8vIHBhcmFtcy5yZWNvdmVyeUNvaW4gdXNlZCB0byBiZSBwYXJhbXMuY29pbiwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWNvdmVyeUNvaW4gPSBwYXJhbXMuY29pbiB8fCBwYXJhbXMucmVjb3ZlcnlDb2luO1xuICAgIGlmICghcmVjb3ZlcnlDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHJlY292ZXJ5Q29pbicpO1xuICAgIH1cbiAgICAvLyBzaWduZWQgc2hvdWxkIGRlZmF1bHQgdG8gdHJ1ZSwgYW5kIG9ubHkgYmUgZGlzYWJsZWQgaWYgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UgKG5vdCB1bmRlZmluZWQpXG4gICAgY29uc3Qgc2lnbmVkID0gcGFyYW1zLnNpZ25lZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBzb3VyY2VDb2luRmFtaWx5ID0gdGhpcy5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCByZWNvdmVyeUNvaW5GYW1pbHkgPSByZWNvdmVyeUNvaW4uZ2V0RmFtaWx5KCk7XG4gICAgY29uc3Qgc3VwcG9ydGVkUmVjb3ZlcnlDb2lucyA9IHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzW3NvdXJjZUNvaW5GYW1pbHldO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc3VwcG9ydGVkUmVjb3ZlcnlDb2lucykgfHwgIXN1cHBvcnRlZFJlY292ZXJ5Q29pbnMuaW5jbHVkZXMocmVjb3ZlcnlDb2luRmFtaWx5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBvZiAke3NvdXJjZUNvaW5GYW1pbHl9IGJhbGFuY2VzIGZyb20gJHtyZWNvdmVyeUNvaW5GYW1pbHl9IHdhbGxldHMgaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlcj4odGhpcy5iaXRnbywge1xuICAgICAgc291cmNlQ29pbjogdGhpcyxcbiAgICAgIHJlY292ZXJ5Q29pbixcbiAgICAgIHdhbGxldElkOiB3YWxsZXQsXG4gICAgICB0eGlkLFxuICAgICAgcmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogc2lnbmVkID8gd2FsbGV0UGFzc3BocmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHhwcnY6IHNpZ25lZCA/IHhwcnYgOiB1bmRlZmluZWQsXG4gICAgICBhcGlLZXksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmlwMzIga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZDogQnVmZmVyKTogeyBwdWI6IHN0cmluZzsgcHJ2OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAgIC8vIG1heGltdW0gZW50cm9weSBhbmQgZ2l2ZXMgdXMgbWF4aW11bSBzZWN1cml0eSBhZ2FpbnN0IGNyYWNraW5nLlxuICAgICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbmRlZEtleSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhidWlsZFBhcmFtczogRXh0cmFQcmVidWlsZFBhcmFtc09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByZUNyZWF0ZUJpdEdvKHBhcmFtczogUHJlY3JlYXRlQml0R29PcHRpb25zKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgcHJlc2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGFzeW5jIHN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldChcbiAgICB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gICAga2V5Y2hhaW5zOiBLZXljaGFpbnNUcmlwbGV0XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHdhbGxldFBhcmFtcztcbiAgfVxuXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFJlY292ZXJ5UHJvdmlkZXIoYXBpVG9rZW4/OiBzdHJpbmcpOiBSZWNvdmVyeVByb3ZpZGVyIHtcbiAgICByZXR1cm4gZm9yQ29pbih0aGlzLmdldENoYWluKCksIGFwaVRva2VuKTtcbiAgfVxufVxuIl19
|
|
988
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsMkNBQTJDO0FBQzNDLDhDQUErRDtBQUMvRCxpQ0FBaUM7QUFDakMsb0RBQW9EO0FBQ3BELG1DQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMsNEJBQTRCO0FBQzVCLCtDQUFxQztBQUVyQyxvRUFBZ0Y7QUFDaEYseUNBTW9CO0FBRXBCLDhDQTBDeUI7QUFDekIsK0NBQWlFO0FBRWpFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUd4Qyx5REFBK0Q7QUFDL0QsaUNBQTJFO0FBQzNFLHFDQUF5RDtBQUV6RCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsMEJBQTBCLEVBQUUsR0FDbEgsZ0JBQUssQ0FBQztBQW9FUixNQUFhLHNCQUF1QixTQUFRLGlCQUFNO0lBR2hELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLFVBQWU7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTkQsd0RBTUM7QUF1SEQsTUFBc0IsZ0JBQWlCLFNBQVEsbUJBQVE7SUFNckQsWUFBc0IsS0FBZ0IsRUFBRSxPQUF3QixFQUFFLGFBQWtDLFFBQVE7UUFDMUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0Q7Z0JBQzdELDZFQUE2RSxDQUNoRixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxH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RTtZQUMxRSxrRUFBa0U7WUFDbEUsSUFBSSxHQUFHLG9CQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsZ0JBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTztZQUNMLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ3RDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQXVDO1FBQ2xFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUE2QjtRQUMxQyxPQUFPO0lBQ1QsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFpQztRQUN4RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUM1QixZQUE2QyxFQUM3QyxTQUEyQjtRQUUzQixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFpQjtRQUNuQyxPQUFPLGtCQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQTVvQ0QsNENBNG9DQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSwgYml0Z28gfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBiaXRjb2luTWVzc2FnZSBmcm9tICdiaXRjb2luanMtbWVzc2FnZSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmltcG9ydCB7IGJhY2t1cEtleVJlY292ZXJ5LCBSZWNvdmVyUGFyYW1zIH0gZnJvbSAnLi9yZWNvdmVyeS9iYWNrdXBLZXlSZWNvdmVyeSc7XG5pbXBvcnQge1xuICBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQsXG4gIENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkLFxuICBmb3JDb2luLFxuICByZWNvdmVyQ3Jvc3NDaGFpbixcbiAgUmVjb3ZlcnlQcm92aWRlcixcbn0gZnJvbSAnLi9yZWNvdmVyeSc7XG5cbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEFkZHJlc3NUeXBlQ2hhaW5NaXNtYXRjaEVycm9yLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyxcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgSUJhc2VDb2luLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkQWRkcmVzc1ZlcmlmaWNhdGlvbk9iamVjdFByb3BlcnR5RXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW4sXG4gIEtleWNoYWluc1RyaXBsZXQsXG4gIEtleUluZGljZXMsXG4gIFAyc2hQMndzaFVuc3VwcG9ydGVkRXJyb3IsXG4gIFAydHJNdXNpZzJVbnN1cHBvcnRlZEVycm9yLFxuICBQMnRyVW5zdXBwb3J0ZWRFcnJvcixcbiAgUDJ3c2hVbnN1cHBvcnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbiBhcyBCYXNlUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlY3JlYXRlQml0R29PcHRpb25zLFxuICBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBwcm9taXNlUHJvcHMsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uUGFyYW1zIGFzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCBhcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyaXBsZSxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyBhcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG4gIFdhbGxldERhdGEsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBDdXN0b21DaGFuZ2VPcHRpb25zLCBwYXJzZU91dHB1dCB9IGZyb20gJy4vcGFyc2VPdXRwdXQnO1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2Mjp1dHhvJyk7XG5cbmltcG9ydCBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcbmltcG9ydCB7IGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQgfSBmcm9tICcuL3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVBzYnQsIHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4vc2lnbic7XG5pbXBvcnQgeyBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyB9IGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgeyBnZXRFeHRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiwgb3V0cHV0U2NyaXB0cywgdG9PdXRwdXQsIHZlcmlmeVNpZ25hdHVyZVdpdGhVbnNwZW50IH0gPVxuICBiaXRnbztcbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG5cbnR5cGUgUm9vdFdhbGxldEtleXMgPSBiaXRnby5Sb290V2FsbGV0S2V5cztcbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5QWRkcmVzc09wdGlvbnMgZXh0ZW5kcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMge1xuICBjaGFpbjogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dCB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmcgfCBudW1iZXI7XG4gIGV4dGVybmFsPzogYm9vbGVhbjtcbiAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjxzdHJpbmcsIHN0cmluZz4ge1xuICBsb2NrdGltZTogbnVtYmVyO1xuICBvdXRwdXRzOiBPdXRwdXRbXTtcbiAgY2hhbmdlT3V0cHV0czogT3V0cHV0W107XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBpbnB1dCBzaWduYXR1cmVzIHBlciBpbnB1dC5cbiAgICovXG4gIGlucHV0U2lnbmF0dXJlczogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIEhpZ2hlc3QgaW5wdXQgc2lnbmF0dXJlIGNvdW50IGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNpZ25hdHVyZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkluZm88VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICAvKiogTWFwcyB0eGlkIHRvIHR4aGV4LiBSZXF1aXJlZCBmb3Igb2ZmbGluZSBzaWduaW5nLiAqL1xuICB0eEhleGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY2hhbmdlQWRkcmVzc2VzPzogc3RyaW5nW107XG4gIC8qKiBwc2J0IGRvZXMgbm90IHJlcXVpcmUgdW5zcGVudHMuICovXG4gIHVuc3BlbnRzPzogVW5zcGVudDxUTnVtYmVyPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIGZlZUluZm8/OiBzdHJpbmc7XG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgVXR4b05ldHdvcmsgPSB1dHhvbGliLk5ldHdvcms7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblBhcmFtcyBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyB7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG59XG5cbi8vIHBhcnNlVHJhbnNhY3Rpb25zJyByZXR1cm4gdHlwZSBtYWtlcyB1c2Ugb2YgV2FsbGV0RGF0YSdzIHR5cGUgYnV0IHdpdGggY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyBhcyByZXF1aXJlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQWJzdHJhY3RVdHhvQ29pbldhbGxldERhdGEgZXh0ZW5kcyBXYWxsZXREYXRhIHtcbiAgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlczoge1xuICAgIHVzZXI6IHN0cmluZztcbiAgICBiYWNrdXA6IHN0cmluZztcbiAgICBiaXRnbzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RVdHhvQ29pbldhbGxldCBleHRlbmRzIFdhbGxldCB7XG4gIHB1YmxpYyBfd2FsbGV0OiBBYnN0cmFjdFV0eG9Db2luV2FsbGV0RGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXREYXRhOiBhbnkpIHtcbiAgICBzdXBlcihiaXRnbywgYmFzZUNvaW4sIHdhbGxldERhdGEpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogQWJzdHJhY3RVdHhvQ29pbldhbGxldDtcbiAgdmVyaWZpY2F0aW9uPzogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VQYXJzZWRUcmFuc2FjdGlvbiB7XG4gIGtleWNoYWluczoge1xuICAgIHVzZXI/OiBLZXljaGFpbjtcbiAgICBiYWNrdXA/OiBLZXljaGFpbjtcbiAgICBiaXRnbz86IEtleWNoYWluO1xuICB9O1xuICBrZXlTaWduYXR1cmVzOiB7XG4gICAgYmFja3VwUHViPzogc3RyaW5nO1xuICAgIGJpdGdvUHViPzogc3RyaW5nO1xuICB9O1xuICBvdXRwdXRzOiBPdXRwdXRbXTtcbiAgbWlzc2luZ091dHB1dHM6IE91dHB1dFtdO1xuICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogT3V0cHV0W107XG4gIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBPdXRwdXRbXTtcbiAgY2hhbmdlT3V0cHV0czogT3V0cHV0W107XG4gIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogVE51bWJlcjtcbiAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBUTnVtYmVyO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgY3VzdG9tQ2hhbmdlPzogQ3VzdG9tQ2hhbmdlT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAga2V5Y2hhaW5zOiB7XG4gICAgcHViOiBzdHJpbmc7XG4gICAgYXNwS2V5SWQ/OiBzdHJpbmc7XG4gIH1bXTtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljO1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIHdhbGxldElkOiBzdHJpbmc7XG4gICAgdHhIZXg6IHN0cmluZztcbiAgICB0eEluZm86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgfTtcbiAgLyoqIHhwcnYgb2YgdXNlciBrZXkgb3IgYmFja3VwIGtleSAqL1xuICBwcnY6IHN0cmluZztcbiAgLyoqIHhwdWJzIHRyaXBsZSBmb3Igd2FsbGV0ICh1c2VyLCBiYWNrdXAsIGJpdGdvKSAqL1xuICBwdWJzOiBUcmlwbGU8c3RyaW5nPjtcbiAgLyoqIHhwdWIgZm9yIGNvc2lnbmVyIChkZWZhdWx0cyB0byBiaXRnbykgKi9cbiAgY29zaWduZXJQdWI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKiBXaGVuIGZhbHNlLCBjcmVhdGVzIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICovXG4gIGlzTGFzdFNpZ25hdHVyZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTaWdBZGRyZXNzIHtcbiAgb3V0cHV0U2NyaXB0OiBCdWZmZXI7XG4gIHJlZGVlbVNjcmlwdD86IEJ1ZmZlcjtcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcjtcbiAgYWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnMge1xuICB0eGlkOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xuICB3YWxsZXQ6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgeHBydj86IHN0cmluZztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgY29pbj86IEFic3RyYWN0VXR4b0NvaW47XG4gIHJlY292ZXJ5Q29pbj86IEFic3RyYWN0VXR4b0NvaW47XG4gIHNpZ25lZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW4/OiBLZXljaGFpbjtcbiAga2V5Y2hhaW5Ub1ZlcmlmeT86IEtleWNoYWluO1xuICBrZXlTaWduYXR1cmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW4/OiBLZXljaGFpbjtcbiAgZGlzYWJsZU5ldHdvcmtpbmc6IGJvb2xlYW47XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj5cbiAgZXh0ZW5kcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgd2FsbGV0OiBBYnN0cmFjdFV0eG9Db2luV2FsbGV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25Qc2J0UmVxdWVzdCB7XG4gIHBzYnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduUHNidFJlc3BvbnNlIHtcbiAgcHNidDogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVdHhvQ29pbiBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHVibGljIGFsdFNjcmlwdEhhc2g/OiBudW1iZXI7XG4gIHB1YmxpYyBzdXBwb3J0QWx0U2NyaXB0RGVzdGluYXRpb24/OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JztcbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJykge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgICBpZiAoIXV0eG9saWIuaXNWYWxpZE5ldHdvcmsobmV0d29yaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2ludmFsaWQgbmV0d29yazogcGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgdGhlIHNhbWUgdmVyc2lvbiBvZiAnICtcbiAgICAgICAgICAnQGJpdGdvL3V0eG8tbGliIGFzIHRoaXMgbGlicmFyeSB3aGVuIGluaXRpYWxpemluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hbW91bnRUeXBlID0gYW1vdW50VHlwZTtcbiAgICB0aGlzLl9uZXR3b3JrID0gbmV0d29yaztcbiAgfVxuXG4gIGdldCBuZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLl9uZXR3b3JrO1xuICB9XG5cbiAgc3dlZXBXaXRoU2VuZE1hbnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgc3RhdGljIGdldCB2YWxpZEFkZHJlc3NUeXBlcygpOiBTY3JpcHRUeXBlMk9mM1tdIHtcbiAgICByZXR1cm4gWy4uLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmYWN0b3IgYmV0d2VlbiB0aGUgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRCYXNlRmFjdG9yKCkge1xuICAgIHJldHVybiAxZTg7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldENvaW5MaWJyYXJ5KCkge1xuICAgIHJldHVybiB1dHhvbGliO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgaXMgdmFsaWRcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIHBhcmFtPzogeyBhbnlGb3JtYXQ6IGJvb2xlYW4gfSB8IC8qIGxlZ2FjeSBwYXJhbWV0ZXIgKi8gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdib29sZWFuJyAmJiBwYXJhbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0cyA9IHBhcmFtICYmIHBhcmFtLmFueUZvcm1hdCA/IHVuZGVmaW5lZCA6IFsnZGVmYXVsdCcgYXMgY29uc3RdO1xuICAgIHRyeSB7XG4gICAgICB1dHhvbGliLmFkZHJlc3NGb3JtYXQudG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKGFkZHJlc3MsIHRoaXMubmV0d29yaywgZm9ybWF0cyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmlwMzIuZnJvbUJhc2U1OChwdWIpLmlzTmV1dGVyZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGF0ZXN0IGJsb2NrIGhlaWdodFxuICAgKiBAcGFyYW0gcmVxSWRcbiAgICovXG4gIGFzeW5jIGdldExhdGVzdEJsb2NrSGVpZ2h0KHJlcUlkPzogUmVxdWVzdFRyYWNlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBjaGFpbmhlYWQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3B1YmxpYy9ibG9jay9sYXRlc3QnKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIChjaGFpbmhlYWQgYXMgYW55KS5oZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGN1c3RvbSBjb2luIGxvZ2ljIGFmdGVyIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBCaXRHb1xuICAgKiBAcGFyYW0gcHJlYnVpbGRcbiAgICovXG4gIGFzeW5jIHBvc3RQcm9jZXNzUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJlYnVpbGQudHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHhQcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cbiAgICBjb25zdCB0eCA9IGJpdGdvLmlzUHNidChwcmVidWlsZC50eEhleClcbiAgICAgID8gYml0Z28uY3JlYXRlUHNidEZyb21IZXgocHJlYnVpbGQudHhIZXgsIHRoaXMubmV0d29yaylcbiAgICAgIDogdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4ocHJlYnVpbGQudHhIZXgpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHByZWJ1aWxkLmJsb2NrSGVpZ2h0KSkge1xuICAgICAgcHJlYnVpbGQuYmxvY2tIZWlnaHQgPSAoYXdhaXQgdGhpcy5nZXRMYXRlc3RCbG9ja0hlaWdodCgpKSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgdHhIZXg6IHR4LnRvSGV4KCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBvdXRwdXRzIHRoYXQgYXJlIHdpdGhpbiBleHBlY3RlZCBvdXRwdXRzIGJ1dCBub3Qgd2l0aGluIGFjdHVhbCBvdXRwdXRzLCBpbmNsdWRpbmcgZHVwbGljYXRlc1xuICAgKiBAcGFyYW0gZXhwZWN0ZWRPdXRwdXRzXG4gICAqIEBwYXJhbSBhY3R1YWxPdXRwdXRzXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluZE1pc3NpbmdPdXRwdXRzKGV4cGVjdGVkT3V0cHV0czogT3V0cHV0W10sIGFjdHVhbE91dHB1dHM6IE91dHB1dFtdKTogT3V0cHV0W10ge1xuICAgIGNvbnN0IGtleUZ1bmMgPSAoeyBhZGRyZXNzLCBhbW91bnQgfTogT3V0cHV0KTogc3RyaW5nID0+IGAke2FkZHJlc3N9OiR7YW1vdW50fWA7XG4gICAgY29uc3QgZ3JvdXBlZE91dHB1dHMgPSBfLmdyb3VwQnkoZXhwZWN0ZWRPdXRwdXRzLCBrZXlGdW5jKTtcblxuICAgIGFjdHVhbE91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3VwZWRPdXRwdXRzW2tleUZ1bmMob3V0cHV0KV07XG4gICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAucG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gXy5mbGF0dGVuKF8udmFsdWVzKGdyb3VwZWRPdXRwdXRzKSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuIGFkZHJlc3MnIHR5cGUgYmFzZWQgb24gaXRzIHdpdG5lc3MgYW5kIHJlZGVlbSBzY3JpcHQgcHJlc2VuY2VcbiAgICogQHBhcmFtIGFkZHJlc3NEZXRhaWxzXG4gICAqL1xuICBzdGF0aWMgaW5mZXJBZGRyZXNzVHlwZShhZGRyZXNzRGV0YWlsczogeyBjaGFpbjogbnVtYmVyIH0pOiBTY3JpcHRUeXBlMk9mMyB8IG51bGwge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShhZGRyZXNzRGV0YWlscy5jaGFpbikgPyBzY3JpcHRUeXBlRm9yQ2hhaW4oYWRkcmVzc0RldGFpbHMuY2hhaW4pIDogbnVsbDtcbiAgfVxuXG4gIGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBoZXg6IHN0cmluZ1xuICApOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KGhleCwgdGhpcy5uZXR3b3JrLCB0aGlzLmFtb3VudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYW5kIGZpbGwgdHJhbnNhY3Rpb24gZGV0YWlscyBzdWNoIGFzIGludGVybmFsL2NoYW5nZSBzcGVuZCwgZXh0ZXJuYWwgc3BlbmQgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCksIGV0Yy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gPSB7fSwgcmVxSWQgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cbiAgICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAgIGNvbnN0IGZldGNoS2V5Y2hhaW5zID0gYXN5bmMgKHdhbGxldDogSVdhbGxldCk6IFByb21pc2U8VmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10+ID0+IHtcbiAgICAgIHJldHVybiBwcm9taXNlUHJvcHMoe1xuICAgICAgICB1c2VyOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5VU0VSXSwgcmVxSWQgfSksXG4gICAgICAgIGJhY2t1cDogdGhpcy5rZXljaGFpbnMoKS5nZXQoeyBpZDogd2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuQkFDS1VQXSwgcmVxSWQgfSksXG4gICAgICAgIGJpdGdvOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5CSVRHT10sIHJlcUlkIH0pLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIG9idGFpbiB0aGUga2V5Y2hhaW5zIGFuZCBrZXkgc2lnbmF0dXJlc1xuICAgIGxldCBrZXljaGFpbnM6IFZlcmlmaWNhdGlvbk9wdGlvbnNbJ2tleWNoYWlucyddIHwgdW5kZWZpbmVkID0gdmVyaWZpY2F0aW9uLmtleWNoYWlucztcbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGZldGNoIGtleWNoYWlucyB3aXRob3V0IG5ldHdvcmtpbmcnKTtcbiAgICAgIH1cbiAgICAgIGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKHdhbGxldCk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMgfHwgIWtleWNoYWlucy51c2VyIHx8ICFrZXljaGFpbnMuYmFja3VwIHx8ICFrZXljaGFpbnMuYml0Z28pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW5zIGFyZSByZXF1aXJlZCwgYnV0IGNvdWxkIG5vdCBiZSBmZXRjaGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5BcnJheTogVHJpcGxlPEtleWNoYWluPiA9IFtrZXljaGFpbnMudXNlciwga2V5Y2hhaW5zLmJhY2t1cCwga2V5Y2hhaW5zLmJpdGdvXTtcblxuICAgIGNvbnN0IGtleVNpZ25hdHVyZXMgPSBfLmdldCh3YWxsZXQsICdfd2FsbGV0LmtleVNpZ25hdHVyZXMnLCB7fSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4UHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG4gICAgLy8gb2J0YWluIGFsbCBvdXRwdXRzXG4gICAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICAgIHR4SW5mbzogdHhQcmVidWlsZC50eEluZm8sXG4gICAgICBwdWJzOiBrZXljaGFpbkFycmF5Lm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWxsT3V0cHV0cyA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXTtcblxuICAgIC8vIHZlcmlmeSB0aGF0IGVhY2ggcmVjaXBpZW50IGZyb20gdHhQYXJhbXMgaGFzIHRoZWlyIG93biBvdXRwdXRcbiAgICBjb25zdCBleHBlY3RlZE91dHB1dHMgPSBfLmdldCh0eFBhcmFtcywgJ3JlY2lwaWVudHMnLCBbXSBhcyBUcmFuc2FjdGlvblJlY2lwaWVudFtdKS5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4ub3V0cHV0LCBhZGRyZXNzOiB0aGlzLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IEFic3RyYWN0VXR4b0NvaW4uZmluZE1pc3NpbmdPdXRwdXRzKGV4cGVjdGVkT3V0cHV0cywgYWxsT3V0cHV0cyk7XG5cbiAgICAvLyBnZXQgdGhlIGtleWNoYWlucyBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIHdhbGxldCBpZiBuZWVkZWRcbiAgICBsZXQgY3VzdG9tQ2hhbmdlOiBDdXN0b21DaGFuZ2VPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgICBpZiAoY3VzdG9tQ2hhbmdlV2FsbGV0SWQpIHtcbiAgICAgIC8vIGZldGNoIGtleWNoYWlucyBmcm9tIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGZvciBkZXJpdmluZyBhZGRyZXNzZXMuXG4gICAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMgPSB3YWxsZXQuX3dhbGxldC5jdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzO1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlV2FsbGV0OiBXYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldHMoKS5nZXQoeyBpZDogY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSk7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY3VzdG9tQ2hhbmdlV2FsbGV0KTtcblxuICAgICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1c3RvbUNoYW5nZUtleXMudXNlciAmJiBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCAmJiBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvICYmIGN1c3RvbUNoYW5nZVdhbGxldCkge1xuICAgICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFtLZXljaGFpbiwgS2V5Y2hhaW4sIEtleWNoYWluXSA9IFtcbiAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLnVzZXIsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgICAgXTtcblxuICAgICAgICBjdXN0b21DaGFuZ2UgPSB7XG4gICAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IFtcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMudXNlcixcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYmFja3VwLFxuICAgICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnbyxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb3AgdGhyb3VnaCBhbGwgdGhlIG91dHB1dHMgYW5kIGNsYXNzaWZ5IGVhY2ggb2YgdGhlbSBhcyBlaXRoZXIgaW50ZXJuYWwgc3BlbmRzXG4gICAgICogb3IgZXh0ZXJuYWwgc3BlbmRzIGJ5IHNldHRpbmcgdGhlIFwiZXh0ZXJuYWxcIiBwcm9wZXJ0eSB0byB0cnVlIG9yIGZhbHNlIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGNvbnN0IGFsbE91dHB1dERldGFpbHM6IE91dHB1dFtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhbGxPdXRwdXRzLm1hcCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICAgICAgY29pbjogdGhpcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgICBrZXljaGFpbkFycmF5LFxuICAgICAgICAgIHdhbGxldCxcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24gPSBhbGxPdXRwdXREZXRhaWxzLnNvbWUoXG4gICAgICAob3V0cHV0KSA9PiBvdXRwdXQubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgICApO1xuXG4gICAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IF8uZmlsdGVyKGFsbE91dHB1dERldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuXG4gICAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgb3V0cHV0cyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAgIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IEFic3RyYWN0VXR4b0NvaW4uZmluZE1pc3NpbmdPdXRwdXRzKGFsbE91dHB1dERldGFpbHMsIGV4cGVjdGVkT3V0cHV0cyk7XG5cbiAgICBjb25zdCBleHBsaWNpdE91dHB1dHMgPSBBYnN0cmFjdFV0eG9Db2luLmZpbmRNaXNzaW5nT3V0cHV0cyhhbGxPdXRwdXREZXRhaWxzLCBpbXBsaWNpdE91dHB1dHMpO1xuXG4gICAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgbm9uLXdhbGxldCBvdXRwdXRzIHRoYXQgaGFkIGJlZW4gb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiByZWNpcGllbnRzXG4gICAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBfLmZpbHRlcihleHBsaWNpdE91dHB1dHMsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG5cbiAgICAvLyB0aGlzIGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIG5vbi13YWxsZXQgb3V0cHV0IHZhbHVlc1xuICAgIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICAgIHRoaXMuYW1vdW50VHlwZVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGFtb3VudCBwZXJ0YWlucyB0byB2ZXJpZnlpbmcgdGhlIHBheS1hcy15b3UtZ28tZmVlIEJpdEdvXG4gICAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgICAqIGluIHRoYXQgd2UgY29tcGFyZSB0aGUgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHRoYXQgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IGJ5IHRoZSB1c2VyIHRvIHRoZSBwb3J0aW9uXG4gICAgICogdGhhdCB3YXMgc3BlY2lmaWVkIGltcGxpY2l0bHkuIFRvIHByb3RlY3QgY3VzdG9tZXJzIGZyb20gcGVvcGxlIHRhbXBlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBvdXRwdXRzLCB3ZVxuICAgICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAgICogZXh0ZXJuYWwgc3BlbmQuXG4gICAgICovXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAgIC8vIGdldCBhbGwgdGhlIGFkZGl0aW9uYWwgZXh0ZXJuYWwgb3V0cHV0cyB0aGUgc2VydmVyIGFkZGVkIGFuZCBjYWxjdWxhdGUgdGhlaXIgdmFsdWVzXG4gICAgY29uc3QgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMgPSBfLmZpbHRlcihpbXBsaWNpdE91dHB1dHMsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG4gICAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvOiBPdXRwdXQpID0+IHN1bSArIEJpZ0ludChvLmFtb3VudCksIEJpZ0ludCgwKSkgYXMgYmlnaW50LFxuICAgICAgdGhpcy5hbW91bnRUeXBlXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXljaGFpbnMsXG4gICAgICBrZXlTaWduYXR1cmVzLFxuICAgICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICAgIG1pc3NpbmdPdXRwdXRzLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHMsXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbixcbiAgICAgIGN1c3RvbUNoYW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY3J5cHQgdGhlIHdhbGxldCdzIHVzZXIgcHJpdmF0ZSBrZXkgYW5kIHZlcmlmeSB0aGF0IHRoZSBjbGFpbWVkIHB1YmxpYyBrZXkgbWF0Y2hlc1xuICAgKiBAcGFyYW0ge1ZlcmlmeVVzZXJQdWJsaWNLZXlPcHRpb25zfSBwYXJhbXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeVVzZXJQdWJsaWNLZXkocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCB0eFBhcmFtcywgZGlzYWJsZU5ldHdvcmtpbmcgfSA9IHBhcmFtcztcbiAgICBpZiAoIXVzZXJLZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIGtleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclB1YiA9IHVzZXJLZXljaGFpbi5wdWI7XG5cbiAgICAvLyBkZWNyeXB0IHRoZSB1c2VyIHByaXZhdGUga2V5IHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCBwdWJsaWMga2V5IGlzIGEgbWF0Y2hcbiAgICBsZXQgdXNlclBydiA9IHVzZXJLZXljaGFpbi5wcnY7XG4gICAgaWYgKF8uaXNFbXB0eSh1c2VyUHJ2KSkge1xuICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmIChlbmNyeXB0ZWRQcnYgJiYgIV8uaXNFbXB0eShlbmNyeXB0ZWRQcnYpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBkZWNyeXB0aW9uIGZhaWxzLCBpdCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgcGFzc3dvcmQ6IHR4UGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXNlclBydikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ3VzZXIgcHJpdmF0ZSBrZXkgdW5hdmFpbGFibGUgZm9yIHZlcmlmaWNhdGlvbic7XG4gICAgICBpZiAoZGlzYWJsZU5ldHdvcmtpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJQcml2YXRlS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2KTtcbiAgICAgIGlmICh1c2VyUHJpdmF0ZUtleS50b0Jhc2U1OCgpID09PSB1c2VyUHJpdmF0ZUtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIHByaXZhdGUga2V5IGlzIG9ubHkgcHVibGljJyk7XG4gICAgICB9XG4gICAgICBpZiAodXNlclByaXZhdGVLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpICE9PSB1c2VyUHViKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBwcml2YXRlIGtleSBkb2VzIG5vdCBtYXRjaCBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHNpZ25hdHVyZXMgcHJvZHVjZWQgYnkgdGhlIHVzZXIga2V5IG92ZXIgdGhlIGJhY2t1cCBhbmQgYml0Z28ga2V5cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGVzZSBzaWduYXR1cmVzIGVuc3VyZSB0aGF0IHRoZSB3YWxsZXQga2V5cyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgd2FsbGV0IGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7VmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnN9IHBhcmFtc1xuICAgKiBAcmV0dXJuIHt7YmFja3VwOiBib29sZWFuLCBiaXRnbzogYm9vbGVhbn19XG4gICAqL1xuICBwcm90ZWN0ZWQgdmVyaWZ5S2V5U2lnbmF0dXJlKHBhcmFtczogVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAvLyBmaXJzdCwgbGV0J3MgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHVzZXIga2V5LCB3aG9zZSBwdWJsaWMga2V5IGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgdmVyaWZpY2F0aW9uc1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBrZXljaGFpblRvVmVyaWZ5LCBrZXlTaWduYXR1cmUgfSA9IHBhcmFtcztcbiAgICBpZiAoIXVzZXJLZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIGtleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpblRvVmVyaWZ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIHRvIHZlcmlmeSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICgha2V5U2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleSBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSB1c2VyIHB1YmxpYyBrZXlcbiAgICBhc3NlcnQodXNlcktleWNoYWluLnB1Yik7XG4gICAgY29uc3QgcHVibGljS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyS2V5Y2hhaW4ucHViKS5wdWJsaWNLZXk7XG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MudG9CYXNlNThDaGVjayhcbiAgICAgIHV0eG9saWIuY3J5cHRvLmhhc2gxNjAocHVibGljS2V5KSxcbiAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pbi5wdWJLZXlIYXNoLFxuICAgICAgdGhpcy5uZXR3b3JrXG4gICAgKTtcblxuICAgIC8vIEJHLTU3MDM6IHVzZSBCVEMgbWFpbm5ldCBwcmVmaXggZm9yIGFsbCBrZXkgc2lnbmF0dXJlIG9wZXJhdGlvbnNcbiAgICAvLyAodGhpcyBtZWFucyBkbyBub3QgcGFzcyBhIHByZWZpeCBwYXJhbWV0ZXIsIGFuZCBsZXQgaXQgdXNlIHRoZSBkZWZhdWx0IHByZWZpeCBpbnN0ZWFkKVxuICAgIGFzc2VydChrZXljaGFpblRvVmVyaWZ5LnB1Yik7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXRjb2luTWVzc2FnZS52ZXJpZnkoa2V5Y2hhaW5Ub1ZlcmlmeS5wdWIsIHNpZ25pbmdBZGRyZXNzLCBCdWZmZXIuZnJvbShrZXlTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ2Vycm9yIHRocm93biBmcm9tIGJpdGNvaW5tZXNzYWdlIHdoaWxlIHZlcmlmeWluZyBrZXkgc2lnbmF0dXJlJywgZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVzIGFnYWluc3QgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgb3ZlciB0aGUgY2hhbmdlIHdhbGxldCBleHRlbmRlZCBrZXlzXG4gICAqIEBwYXJhbSB7UGFyc2VkVHJhbnNhY3Rpb259IHR4XG4gICAqIEBwYXJhbSB7S2V5Y2hhaW59IHVzZXJLZXljaGFpblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgdmVyaWZ5Q3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICB0eDogUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gICAgdXNlcktleWNoYWluOiBLZXljaGFpblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXR4LmN1c3RvbUNoYW5nZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJzZWQgdHJhbnNhY3Rpb24gaXMgbWlzc2luZyByZXF1aXJlZCBjdXN0b20gY2hhbmdlIHZlcmlmaWNhdGlvbiBkYXRhJyk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR4LmN1c3RvbUNoYW5nZS5rZXlzKSB8fCAhQXJyYXkuaXNBcnJheSh0eC5jdXN0b21DaGFuZ2Uuc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tQ2hhbmdlIHByb3BlcnR5IGlzIG1pc3Npbmcga2V5cyBvciBzaWduYXR1cmVzJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXlJbmRleCBvZiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT10pIHtcbiAgICAgIGNvbnN0IGtleWNoYWluVG9WZXJpZnkgPSB0eC5jdXN0b21DaGFuZ2Uua2V5c1trZXlJbmRleF07XG4gICAgICBjb25zdCBrZXlTaWduYXR1cmUgPSB0eC5jdXN0b21DaGFuZ2Uuc2lnbmF0dXJlc1trZXlJbmRleF07XG4gICAgICBpZiAoIWtleWNoYWluVG9WZXJpZnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIGN1c3RvbSBjaGFuZ2UgJHtLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpfSBrZXljaGFpbiBwdWJsaWMga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtleVNpZ25hdHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgcmVxdWlyZWQgY3VzdG9tIGNoYW5nZSAke0tleUluZGljZXNba2V5SW5kZXhdLnRvTG93ZXJDYXNlKCl9IGtleWNoYWluIHNpZ25hdHVyZWApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnZlcmlmeUtleVNpZ25hdHVyZSh7IHVzZXJLZXljaGFpbiwga2V5Y2hhaW5Ub1ZlcmlmeSwga2V5U2lnbmF0dXJlIH0pKSB7XG4gICAgICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgJXMga2V5IHNpZ25hdHVyZSEnLCBLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBwZXJjZW50YWdlIGxpbWl0IGZvciBwYXktYXMteW91LWdvIG91dHB1dHNcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBheUdvTGltaXQoYWxsb3dQYXlnb091dHB1dD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIC8vIGFsbG93aW5nIHBheWdvIG91dHB1dHMgbmVlZHMgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIHNvIG9ubHkgZGlzYWxsb3cgcGF5Z28gb3V0cHV0cyBpZiB0aGVcbiAgICAvLyByZWxldmFudCB2ZXJpZmljYXRpb24gb3B0aW9uIGlzIGJvdGggc2V0IGFuZCBmYWxzZVxuICAgIGlmICghXy5pc05pbChhbGxvd1BheWdvT3V0cHV0KSAmJiAhYWxsb3dQYXlnb091dHB1dCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIDE1MCBiYXNpcyBwb2ludHMgaXMgdGhlIGFic29sdXRlIHBlcm1pdHRlZCBtYXhpbXVtIGlmIHBheWdvIG91dHB1dHMgYXJlIGFsbG93ZWRcbiAgICByZXR1cm4gMC4wMTU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UGFyYW1zIHBhcmFtcyBvYmplY3QgcGFzc2VkIHRvIHNlbmRcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkIHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBzZXJ2ZXJcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4IHByZWJ1aWx0IHRyYW5zYWN0aW9uJ3MgdHhIZXggZm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCBXYWxsZXQgb2JqZWN0IHRvIG9idGFpbiBrZXlzIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uIE9iamVjdCBzcGVjaWZ5aW5nIHNvbWUgdmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgRGlzYWxsb3cgZmV0Y2hpbmcgYW55IGRhdGEgZnJvbSB0aGUgaW50ZXJuZXQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5rZXljaGFpbnMgUGFzcyBrZXljaGFpbnMgbWFudWFsbHkgcmF0aGVyIHRoYW4gZmV0Y2hpbmcgdGhlbSBieSBpZFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5hZGRyZXNzZXMgQWRkcmVzcyBkZXRhaWxzIHRvIHBhc3MgaW4gZm9yIG91dC1vZi1iYW5kIHZlcmlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGRPYmosIHdhbGxldCwgdmVyaWZpY2F0aW9uID0geyBhbGxvd1BheWdvT3V0cHV0OiB0cnVlIH0sIHJlcUlkIH0gPSBwYXJhbXM7XG4gICAgbGV0IHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG5cbiAgICAvLyBUT0RPOiBCRy03Nzc0MyBBZGQgbmF0aXZlIHBzYnQgc3VwcG9ydCAtIHdlIG1ha2UgYSBkZWVwIGNvcHkgb2YgdGhlIHR4UHJlYnVpbGQgb2JqZWN0IGhlcmUgdG8gYXZvaWRcbiAgICAvLyBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBzdGlsbCB1c2UgaXQgbGF0ZXIgb24gaW4gdGhlIGZ1bmN0aW9uXG4gICAgaWYgKHR4UHJlYnVpbGRPYmoudHhIZXggJiYgYml0Z28uaXNQc2J0KEJ1ZmZlci5mcm9tKHR4UHJlYnVpbGRPYmoudHhIZXgsICdoZXgnKSkpIHtcbiAgICAgIGlmICh0eFByZWJ1aWxkT2JqLnR4SW5mbz8udW5zcGVudHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGhhdmUgdW5zcGVudHMgaW4gdHhJbmZvIGZvciBwc2J0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBzYnQgPSBiaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eFByZWJ1aWxkT2JqLnR4SGV4LCB0aGlzLm5ldHdvcmspO1xuICAgICAgdHhQcmVidWlsZCA9IHsgLi4udHhQcmVidWlsZE9iaiwgdHhIZXg6IHBzYnQuZ2V0VW5zaWduZWRUeCgpLnRvSGV4KCkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZCA9IHR4UHJlYnVpbGRPYmo7XG4gICAgfVxuXG4gICAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSAhIXZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcbiAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbjogUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4gPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgdHhQYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgd2FsbGV0LFxuICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgcmVxSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBwYXJzZWRUcmFuc2FjdGlvbi5rZXljaGFpbnM7XG5cbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCB1c2VyIHB1YmxpYyBrZXkgY29ycmVzcG9uZHMgdG8gdGhlIHdhbGxldCdzIHVzZXIgcHJpdmF0ZSBrZXlcbiAgICBsZXQgdXNlclB1YmxpY0tleVZlcmlmaWVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHZlcmlmeSB0aGUgdXNlciBwdWJsaWMga2V5IG1hdGNoZXMgdGhlIHByaXZhdGUga2V5IC0gdGhpcyB3aWxsIHRocm93IGlmIHRoZXJlIGlzIG5vIG1hdGNoXG4gICAgICB1c2VyUHVibGljS2V5VmVyaWZpZWQgPSB0aGlzLnZlcmlmeVVzZXJQdWJsaWNLZXkoeyB1c2VyS2V5Y2hhaW46IGtleWNoYWlucy51c2VyLCBkaXNhYmxlTmV0d29ya2luZywgdHhQYXJhbXMgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byB2ZXJpZnkgdXNlciBwdWJsaWMga2V5IScsIGUpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIHZlcmlmeSB0aGVzZSBrZXljaGFpbnNcbiAgICBjb25zdCBrZXlTaWduYXR1cmVzID0gcGFyc2VkVHJhbnNhY3Rpb24ua2V5U2lnbmF0dXJlcztcbiAgICBpZiAoIV8uaXNFbXB0eShrZXlTaWduYXR1cmVzKSkge1xuICAgICAgY29uc3QgdmVyaWZ5ID0gKGtleSwgcHViKSA9PlxuICAgICAgICB0aGlzLnZlcmlmeUtleVNpZ25hdHVyZSh7IHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zLnVzZXIsIGtleWNoYWluVG9WZXJpZnk6IGtleSwga2V5U2lnbmF0dXJlOiBwdWIgfSk7XG4gICAgICBjb25zdCBpc0JhY2t1cEtleVNpZ25hdHVyZVZhbGlkID0gdmVyaWZ5KGtleWNoYWlucy5iYWNrdXAsIGtleVNpZ25hdHVyZXMuYmFja3VwUHViKTtcbiAgICAgIGNvbnN0IGlzQml0Z29LZXlTaWduYXR1cmVWYWxpZCA9IHZlcmlmeShrZXljaGFpbnMuYml0Z28sIGtleVNpZ25hdHVyZXMuYml0Z29QdWIpO1xuICAgICAgaWYgKCFpc0JhY2t1cEtleVNpZ25hdHVyZVZhbGlkIHx8ICFpc0JpdGdvS2V5U2lnbmF0dXJlVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWNvbmRhcnkgcHVibGljIGtleSBzaWduYXR1cmVzIGludmFsaWQnKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdzdWNjZXNzZnVsbHkgdmVyaWZpZWQgYmFja3VwIGFuZCBiaXRnbyBrZXkgc2lnbmF0dXJlcycpO1xuICAgIH0gZWxzZSBpZiAoIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAvLyB0aGVzZSBrZXlzIHdlcmUgb2J0YWluZWQgb25saW5lIGFuZCB0aGVpciBzaWduYXR1cmVzIHdlcmUgbm90IHZlcmlmaWVkXG4gICAgICAvLyB0aGlzIGNvdWxkIGJlIGRhbmdlcm91c1xuICAgICAgY29uc29sZS5sb2coJ3Vuc2lnbmVkIGtleXMgb2J0YWluZWQgb25saW5lIGFyZSBiZWluZyB1c2VkIGZvciBhZGRyZXNzIHZlcmlmaWNhdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRUcmFuc2FjdGlvbi5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbikge1xuICAgICAgaWYgKCFrZXljaGFpbnMudXNlciB8fCAhdXNlclB1YmxpY0tleVZlcmlmaWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gcmVxdWlyZXMgdmVyaWZpY2F0aW9uIG9mIHVzZXIgcHVibGljIGtleSwgYnV0IGl0IHdhcyB1bmFibGUgdG8gYmUgdmVyaWZpZWQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXNWZXJpZmllZCA9IHRoaXMudmVyaWZ5Q3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyhwYXJzZWRUcmFuc2FjdGlvbiwga2V5Y2hhaW5zLnVzZXIpO1xuICAgICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICd0cmFuc2FjdGlvbiByZXF1aXJlcyB2ZXJpZmljYXRpb24gb2YgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcywgYnV0IHRoZXkgd2VyZSB1bmFibGUgdG8gYmUgdmVyaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWJ1Zygnc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIHVzZXIgcHVibGljIGtleSBhbmQgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gcGFyc2VkVHJhbnNhY3Rpb24ubWlzc2luZ091dHB1dHM7XG4gICAgaWYgKG1pc3NpbmdPdXRwdXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdGhlcmUgYXJlIHNvbWUgb3V0cHV0cyBpbiB0aGUgcmVjaXBpZW50cyBsaXN0IHRoYXQgaGF2ZSBub3QgbWFkZSBpdCBpbnRvIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgb3V0cHV0cyBtaXNzaW5nIGluIHRyYW5zYWN0aW9uIHByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZW5kZWRFeHRlcm5hbFNwZW5kID0gcGFyc2VkVHJhbnNhY3Rpb24uZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50O1xuXG4gICAgLy8gdGhpcyBpcyBhIGxpbWl0IHdlIGltcG9zZSBmb3IgdGhlIHRvdGFsIHZhbHVlIHRoYXQgaXMgYW1lbmRlZCB0byB0aGUgdHJhbnNhY3Rpb24gYmV5b25kIHdoYXQgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWRcbiAgICBjb25zdCBwYXlBc1lvdUdvTGltaXQgPSBuZXcgQmlnTnVtYmVyKHRoaXMuZ2V0UGF5R29MaW1pdCh2ZXJpZmljYXRpb24uYWxsb3dQYXlnb091dHB1dCkpLm11bHRpcGxpZWRCeShcbiAgICAgIGludGVuZGVkRXh0ZXJuYWxTcGVuZC50b1N0cmluZygpXG4gICAgKTtcblxuICAgIC8qXG4gICAgU29tZSBleHBsYW5hdGlvbiBmb3Igd2h5IHdlJ3JlIGRvaW5nIHdoYXQgd2UncmUgZG9pbmc6XG4gICAgU29tZSBjdXN0b21lcnMgd2lsbCBoYXZlIGFuIG91dHB1dCB0byBCaXRHbydzIFBBWUdvIHdhbGxldCBhZGRlZCB0byB0aGVpciB0cmFuc2FjdGlvbiwgYW5kIHdlIG5lZWQgdG8gYWNjb3VudCBmb3JcbiAgICBpdCBoZXJlLiBUbyBwcm90ZWN0IHNvbWVvbmUgdGFtcGVyaW5nIHdpdGggdGhlIG91dHB1dCB0byBtYWtlIGl0IHNlbmQgbW9yZSB0aGFuIGl0IHNob3VsZCB0byBCaXRHbywgd2UgZGVmaW5lIGFcbiAgICB0aHJlc2hvbGQgZm9yIHRoZSBvdXRwdXQncyB2YWx1ZSBhYm92ZSB3aGljaCB3ZSdsbCB0aHJvdyBhbiBlcnJvciwgYmVjYXVzZSB0aGUgcGF5Z28gb3V0cHV0IHNob3VsZCBuZXZlciBiZSB0aGF0XG4gICAgaGlnaC5cbiAgICAgKi9cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZXh0cmEgYWRkcmVzc2VzIGFyZSBjaGFuZ2UgYWRkcmVzc2VzXG4gICAgLy8gZ2V0IGFsbCB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIHRoZSBzZXJ2ZXIgYWRkZWQgYW5kIGNhbGN1bGF0ZSB0aGVpciB2YWx1ZXNcbiAgICBjb25zdCBub25DaGFuZ2VBbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcnNlZFRyYW5zYWN0aW9uLmltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudC50b1N0cmluZygpKTtcblxuICAgIGRlYnVnKFxuICAgICAgJ0ludGVuZGVkIHNwZW5kIGlzICVzLCBOb24tY2hhbmdlIGFtb3VudCBpcyAlcywgcGF5Z28gbGltaXQgaXMgJXMnLFxuICAgICAgaW50ZW5kZWRFeHRlcm5hbFNwZW5kLnRvU3RyaW5nKCksXG4gICAgICBub25DaGFuZ2VBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIHBheUFzWW91R29MaW1pdC50b1N0cmluZygpXG4gICAgKTtcblxuICAgIC8vIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgY2FuIG9ubHkgYmUgQml0R28ncyBwYXktYXMteW91LWdvIGZlZSwgYnV0IHdlIGNhbm5vdCB2ZXJpZnkgdGhlIHdhbGxldCBhZGRyZXNzXG4gICAgaWYgKG5vbkNoYW5nZUFtb3VudC5ndChwYXlBc1lvdUdvTGltaXQpKSB7XG4gICAgICAvLyB0aGVyZSBhcmUgc29tZSBhZGRyZXNzZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgaW50ZW5kZWQgcmVjaXBpZW50cyB0aGF0IGFyZSBub3QgY2hhbmdlIGFkZHJlc3Nlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmVidWlsZCBhdHRlbXB0cyB0byBzcGVuZCB0byB1bmludGVuZGVkIGV4dGVybmFsIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxPdXRwdXRzID0gcGFyc2VkVHJhbnNhY3Rpb24ub3V0cHV0cztcbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZC50eEhleCBub3Qgc2V0YCk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25DYWNoZSA9IHt9O1xuICAgIGNvbnN0IGlucHV0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHJhbnNhY3Rpb24uaW5zLm1hcChhc3luYyAoY3VycmVudElucHV0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSAoQnVmZmVyLmZyb20oY3VycmVudElucHV0Lmhhc2gpLnJldmVyc2UoKSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgY29uc3QgdHhIZXggPSB0eFByZWJ1aWxkLnR4SW5mbz8udHhIZXhlcz8uW3RyYW5zYWN0aW9uSWRdO1xuICAgICAgICBpZiAodHhIZXgpIHtcbiAgICAgICAgICBjb25zdCBsb2NhbFR4ID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhIZXgpO1xuICAgICAgICAgIGlmIChsb2NhbFR4LmdldElkKCkgIT09IHRyYW5zYWN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXQgdHJhbnNhY3Rpb24gaGV4IGRvZXMgbm90IG1hdGNoIGlkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRPdXRwdXQgPSBsb2NhbFR4Lm91dHNbY3VycmVudElucHV0LmluZGV4XTtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoY3VycmVudE91dHB1dC5zY3JpcHQsIHRoaXMubmV0d29yayk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogY3VycmVudE91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3RyaW5nOiBjdXJyZW50T3V0cHV0LnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdHJhbnNhY3Rpb25DYWNoZVt0cmFuc2FjdGlvbklkXSkge1xuICAgICAgICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRyYW5zYWN0aW9uIGRldGFpbHMgZXh0ZXJuYWxseSB3aXRoIG5ldHdvcmtpbmcgZGlzYWJsZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcUlkKSB7XG4gICAgICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc2FjdGlvbkNhY2hlW3RyYW5zYWN0aW9uSWRdID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoYC9wdWJsaWMvdHgvJHt0cmFuc2FjdGlvbklkfWApKS5yZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbkRldGFpbHMgPSB0cmFuc2FjdGlvbkNhY2hlW3RyYW5zYWN0aW9uSWRdO1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25EZXRhaWxzLm91dHB1dHNbY3VycmVudElucHV0LmluZGV4XTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGNvaW5zIChkb2dlKSB0aGF0IGNhbiBleGNlZWQgbnVtYmVyIGxpbWl0cyAoYW5kIHRodXMgd2lsbCB1c2UgYmlnaW50KSB3aWxsIGhhdmUgdGhlIGB2YWx1ZVN0cmluZ2AgZmllbGRcbiAgICBjb25zdCBpbnB1dEFtb3VudCA9IGlucHV0cy5yZWR1Y2UoXG4gICAgICAoc3VtOiBiaWdpbnQsIGkpID0+IHN1bSArIEJpZ0ludCh0aGlzLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gaS52YWx1ZVN0cmluZyA6IGkudmFsdWUpLFxuICAgICAgQmlnSW50KDApXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBhbGxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBmZWUgPSBpbnB1dEFtb3VudCAtIG91dHB1dEFtb3VudDtcblxuICAgIGlmIChmZWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhdHRlbXB0aW5nIHRvIHNwZW5kICR7b3V0cHV0QW1vdW50fSBzYXRvc2hpcywgd2hpY2ggZXhjZWVkcyB0aGUgaW5wdXQgYW1vdW50ICgke2lucHV0QW1vdW50fSBzYXRvc2hpcykgYnkgJHstZmVlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBzdXJlIGFuIGFkZHJlc3MgaXMgdmFsaWQgYW5kIHRocm93IGFuIGVycm9yIGlmIGl0J3Mgbm90LlxuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3Mgc3RyaW5nIG9uIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgS2V5Y2hhaW4gb2JqZWN0cyB3aXRoIHhwdWJzXG4gICAqIEBwYXJhbSBwYXJhbXMuY29pblNwZWNpZmljIENvaW4tc3BlY2lmaWMgZGV0YWlscyBmb3IgdGhlIGFkZHJlc3Mgc3VjaCBhcyBhIHdpdG5lc3Mgc2NyaXB0XG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhaW4gRGVyaXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zLmluZGV4IERlcml2YXRpb24gaW5kZXhcbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NFcnJvcn1cbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcn1cbiAgICogQHRocm93cyB7VW5leHBlY3RlZEFkZHJlc3NFcnJvcn1cbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBhZGRyZXNzVHlwZSwga2V5Y2hhaW5zLCBjb2luU3BlY2lmaWMsIGNoYWluLCBpbmRleCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgaWYgKChfLmlzVW5kZWZpbmVkKGNoYWluKSAmJiBfLmlzVW5kZWZpbmVkKGluZGV4KSkgfHwgIShfLmlzRmluaXRlKGNoYWluKSAmJiBfLmlzRmluaXRlKGluZGV4KSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IGludmFsaWQgY2hhaW4gKCR7Y2hhaW59KSBvciBpbmRleCAoJHtpbmRleH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QoY29pblNwZWNpZmljKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzVmVyaWZpY2F0aW9uT2JqZWN0UHJvcGVydHlFcnJvcihcbiAgICAgICAgJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBjb2luU3BlY2lmaWMgZmllbGQgbXVzdCBiZSBhbiBvYmplY3QnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gdGhpcy5nZW5lcmF0ZUFkZHJlc3Moe1xuICAgICAgYWRkcmVzc1R5cGU6IGFkZHJlc3NUeXBlIGFzIFNjcmlwdFR5cGUyT2YzLFxuICAgICAga2V5Y2hhaW5zLFxuICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgY2hhaW4sXG4gICAgICBpbmRleCxcbiAgICB9KTtcblxuICAgIGlmIChleHBlY3RlZEFkZHJlc3MuYWRkcmVzcyAhPT0gYWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogZXhwZWN0ZWQgJHtleHBlY3RlZEFkZHJlc3MuYWRkcmVzc30gYnV0IGdvdCAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBjb2luIHN1cHBvcnRzIGEgYmxvY2sgdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3VwcG9ydHNCbG9ja1RhcmdldCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIHVuc3BlbnRUeXBlXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuaXNTdXBwb3J0ZWRTY3JpcHRUeXBlKHRoaXMubmV0d29yaywgYWRkcmVzc1R5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcmV0dXJuIHRydWUgaWZmIGNvaW4gc3VwcG9ydHMgc3BlbmRpbmcgZnJvbSBjaGFpblxuICAgKi9cbiAgc3VwcG9ydHNBZGRyZXNzQ2hhaW4oY2hhaW46IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShjaGFpbikgJiYgdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSk7XG4gIH1cblxuICBrZXlJZHNGb3JTaWduaW5nKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRPRE8oQkctMTE0ODcpOiBSZW1vdmUgYWRkcmVzc1R5cGUsIHNlZ3dpdCwgYW5kIGJlY2gzMiBwYXJhbXMgaW4gU0RLdjZcbiAgICogR2VuZXJhdGUgYW4gYWRkcmVzcyBmb3IgYSB3YWxsZXQgYmFzZWQgb24gYSBzZXQgb2YgY29uZmlndXJhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzVHlwZSB7c3RyaW5nfSAgIERlcHJlY2F0ZWRcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgICB7W29iamVjdF19IEFycmF5IG9mIG9iamVjdHMgd2l0aCB4cHVic1xuICAgKiBAcGFyYW0gcGFyYW1zLnRocmVzaG9sZCAgIHtudW1iZXJ9ICAgTWluaW11bSBudW1iZXIgb2Ygc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNoYWluICAgICAgIHtudW1iZXJ9ICAgRGVyaXZhdGlvbiBjaGFpbiAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9CaXRHby91bnNwZW50cy9ibG9iL21hc3Rlci9zcmMvY29kZXMudHMgZm9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGFkZHJlc3MgdHlwZSBvZiBhIGdpdmVuIGNoYWluIGNvZGUpXG4gICAqIEBwYXJhbSBwYXJhbXMuaW5kZXggICAgICAge251bWJlcn0gICBEZXJpdmF0aW9uIGluZGV4XG4gICAqIEBwYXJhbSBwYXJhbXMuc2Vnd2l0ICAgICAge2Jvb2xlYW59ICBEZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXMuYmVjaDMyICAgICAge2Jvb2xlYW59ICBEZXByZWNhdGVkXG4gICAqIEByZXR1cm5zIHt7Y2hhaW46IG51bWJlciwgaW5kZXg6IG51bWJlciwgY29pbjogbnVtYmVyLCBjb2luU3BlY2lmaWM6IHtvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdH19fVxuICAgKi9cbiAgZ2VuZXJhdGVBZGRyZXNzKHBhcmFtczogR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyk6IEFkZHJlc3NEZXRhaWxzIHtcbiAgICBjb25zdCB7IGtleWNoYWlucywgdGhyZXNob2xkLCBjaGFpbiwgaW5kZXgsIHNlZ3dpdCA9IGZhbHNlLCBiZWNoMzIgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICAgIGxldCBkZXJpdmF0aW9uQ2hhaW4gPSBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xuICAgIGlmIChfLmlzTnVtYmVyKGNoYWluKSAmJiBfLmlzSW50ZWdlcihjaGFpbikgJiYgaXNDaGFpbkNvZGUoY2hhaW4pKSB7XG4gICAgICBkZXJpdmF0aW9uQ2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0RmxhZ3NUb0FkZHJlc3NUeXBlKCk6IFNjcmlwdFR5cGUyT2YzIHtcbiAgICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikpIHtcbiAgICAgICAgcmV0dXJuIHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQm9vbGVhbihzZWd3aXQpICYmIHNlZ3dpdCkge1xuICAgICAgICByZXR1cm4gJ3Ayc2hQMndzaCc7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKGJlY2gzMikgJiYgYmVjaDMyKSB7XG4gICAgICAgIHJldHVybiAncDJ3c2gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdwMnNoJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzVHlwZSA9IHBhcmFtcy5hZGRyZXNzVHlwZSB8fCBjb252ZXJ0RmxhZ3NUb0FkZHJlc3NUeXBlKCk7XG5cbiAgICBpZiAoYWRkcmVzc1R5cGUgIT09IHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGRlcml2YXRpb25DaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBBZGRyZXNzVHlwZUNoYWluTWlzbWF0Y2hFcnJvcihhZGRyZXNzVHlwZSwgZGVyaXZhdGlvbkNoYWluKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNBZGRyZXNzVHlwZShhZGRyZXNzVHlwZSkpIHtcbiAgICAgIHN3aXRjaCAoYWRkcmVzc1R5cGUpIHtcbiAgICAgICAgY2FzZSAncDJzaCc6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnRlcm5hbCBlcnJvcjogcDJzaCBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZGApO1xuICAgICAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgICAgIHRocm93IG5ldyBQMnNoUDJ3c2hVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ3c2hVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3AydHInOlxuICAgICAgICAgIHRocm93IG5ldyBQMnRyVW5zdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICBjYXNlICdwMnRyTXVzaWcyJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ0ck11c2lnMlVuc3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKHRocmVzaG9sZCkpIHtcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZCBhcyBudW1iZXI7XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkID4ga2V5Y2hhaW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBjYW5ub3QgZXhjZWVkIG51bWJlciBvZiBrZXlzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25JbmRleCA9IDA7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKGluZGV4KSAmJiAoaW5kZXggYXMgbnVtYmVyKSA+IDApIHtcbiAgICAgIGRlcml2YXRpb25JbmRleCA9IGluZGV4IGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gJzAvMC8nICsgZGVyaXZhdGlvbkNoYWluICsgJy8nICsgZGVyaXZhdGlvbkluZGV4O1xuICAgIGNvbnN0IGhkTm9kZXMgPSBrZXljaGFpbnMubWFwKCh7IHB1YiB9KSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpO1xuICAgIGNvbnN0IGRlcml2ZWRLZXlzID0gaGROb2Rlcy5tYXAoKGhkTm9kZSkgPT4gaGROb2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhdGgpKS5wdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgeyBvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgYWRkcmVzcyB9ID0gdGhpcy5jcmVhdGVNdWx0aVNpZ0FkZHJlc3MoXG4gICAgICBhZGRyZXNzVHlwZSxcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCxcbiAgICAgIGRlcml2ZWRLZXlzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzLFxuICAgICAgY2hhaW46IGRlcml2YXRpb25DaGFpbixcbiAgICAgIGluZGV4OiBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgb3V0cHV0U2NyaXB0OiBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICByZWRlZW1TY3JpcHQ6IHJlZGVlbVNjcmlwdCAmJiByZWRlZW1TY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB3aXRuZXNzU2NyaXB0OiB3aXRuZXNzU2NyaXB0ICYmIHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGFkZHJlc3NUeXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cy5cbiAgICogQHBhcmFtIHBzYnRIZXggYWxsIE11U2lnMiBpbnB1dHMgc2hvdWxkIGNvbnRhaW4gdXNlciBNdVNpZzIgbm9uY2VcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidChwc2J0SGV4OiBzdHJpbmcsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25Qc2J0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwYXJhbXM6IFNpZ25Qc2J0UmVxdWVzdCA9IHsgcHNidDogcHNidEhleCB9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dhbGxldC8nICsgd2FsbGV0SWQgKyAnL3R4L3NpZ25wc2J0JykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgU2lnblRyYW5zYWN0aW9uT3B0aW9uc31cbiAgICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eFByZWJ1aWxkID0gcGFyYW1zLnR4UHJlYnVpbGQ7XG4gICAgY29uc3QgdXNlclBydiA9IHBhcmFtcy5wcnY7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkKSB8fCAhXy5pc09iamVjdCh0eFByZWJ1aWxkKSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpICYmICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhQcmVidWlsZH1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGxldCB0eDogYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgYml0Z28uVXR4b1BzYnQ7XG4gICAgaWYgKGJpdGdvLmlzUHNidCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgICAgdHggPSBiaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eFByZWJ1aWxkLnR4SGV4LCB0aGlzLm5ldHdvcmspO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eCA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KHR4UHJlYnVpbGQudHhIZXgpO1xuXG4gICAgICBpZiAodHguaW5zLmxlbmd0aCAhPT0gdHhQcmVidWlsZC50eEluZm8udW5zcGVudHM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xlbmd0aCBvZiB1bnNwZW50cyBhcnJheSBzaG91bGQgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiBpbnB1dHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0ID1cbiAgICAgIHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQgJiYgYml0Z28ubXVzaWcyLmlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQodHgpO1xuXG4gICAgbGV0IGlzTGFzdFNpZ25hdHVyZSA9IGZhbHNlO1xuICAgIGlmIChfLmlzQm9vbGVhbihwYXJhbXMuaXNMYXN0U2lnbmF0dXJlKSkge1xuICAgICAgLy8gV2UgY2FuIG9ubHkgYmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIHRyYW5zYWN0aW9uIHdpdGggdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMgYmVjYXVzZVxuICAgICAgLy8gd2UgcmVxdWlyZSB0aGUgc2VjcmV0IG5vbmNlIGluIHRoZSBjYWNoZSBvZiB0aGUgZmlyc3Qgc2lnbmVyLCB3aGljaCBpcyBpbXBvc3NpYmxlIHRvIHJldHJpZXZlIGlmXG4gICAgICAvLyBkZXNlcmlhbGl6ZWQgZnJvbSBhIGhleC5cbiAgICAgIGlmIChpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJlIGxhc3Qgc2lnbmF0dXJlIG9uIGEgdHJhbnNhY3Rpb24gd2l0aCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMnKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYnVpbGQgaXMgY2FsbGVkIGluc3RlYWQgb2YgYnVpbGRJbmNvbXBsZXRlLCBubyBzaWduYXR1cmUgcGxhY2Vob2xkZXJzIGFyZSBsZWZ0IGluIHRoZSBzaWcgc2NyaXB0XG4gICAgICBpc0xhc3RTaWduYXR1cmUgPSBwYXJhbXMuaXNMYXN0U2lnbmF0dXJlO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHVzZXJQcnYpIHx8ICFfLmlzU3RyaW5nKHVzZXJQcnYpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodXNlclBydikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcnYgbXVzdCBiZSBhIHN0cmluZywgZ290IHR5cGUgJHt0eXBlb2YgdXNlclBydn1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wdWJzIHx8IHBhcmFtcy5wdWJzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgeHB1YiBhcnJheWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lcktleWNoYWluID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGlmIChzaWduZXJLZXljaGFpbi5pc05ldXRlcmVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgdXNlciBwcml2YXRlIGtleSBidXQgcmVjZWl2ZWQgcHVibGljIGtleScpO1xuICAgIH1cbiAgICBkZWJ1ZyhgSGVyZSBpcyB0aGUgcHVibGljIGtleSBvZiB0aGUgeHBydiB5b3UgdXNlZCB0byBzaWduOiAke3NpZ25lcktleWNoYWluLm5ldXRlcmVkKCkudG9CYXNlNTgoKX1gKTtcblxuICAgIGNvbnN0IGNvc2lnbmVyUHViID0gcGFyYW1zLmNvc2lnbmVyUHViID8/IHBhcmFtcy5wdWJzWzJdO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5wdWJzLm1hcCgocHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT47XG4gICAgY29uc3QgY29zaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgoY29zaWduZXJQdWIpO1xuXG4gICAgaWYgKHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQgJiYgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCkge1xuICAgICAgdHguc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChzaWduZXJLZXljaGFpbik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2lnblBzYnQodHgudG9IZXgoKSwgdHhQcmVidWlsZC53YWxsZXRJZCk7XG4gICAgICBjb25zdCBwc2J0ID0gYml0Z28uY3JlYXRlUHNidEZyb21IZXgocmVzcG9uc2UucHNidCwgdGhpcy5uZXR3b3JrKTtcbiAgICAgIHR4LmNvbWJpbmUocHNidCk7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBiaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PiB8IGJpdGdvLlV0eG9Qc2J0O1xuICAgIGlmICh0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0KSB7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlQc2J0KHR4LCBzaWduZXJLZXljaGFpbiwgeyBpc0xhc3RTaWduYXR1cmUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eFByZWJ1aWxkLnR4SW5mby51bnNwZW50cywgJ3Vuc3BlbnRzIGFyZSByZXF1aXJlZCcpO1xuICAgICAgY29uc3Qgd2FsbGV0U2lnbmVyID0gbmV3IGJpdGdvLldhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+KGtleWNoYWlucywgc2lnbmVyS2V5Y2hhaW4sIGNvc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24odHgsIHR4UHJlYnVpbGQudHhJbmZvLnVuc3BlbnRzLCB3YWxsZXRTaWduZXIsIHtcbiAgICAgICAgaXNMYXN0U2lnbmF0dXJlLFxuICAgICAgfSkgYXMgYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBzaWduZWRUcmFuc2FjdGlvbi50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB1bnNwZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNCaXRHb1RhaW50ZWRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHVuc3BlbnQ6IFVuc3BlbnQ8VE51bWJlcj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNSZXBsYXlQcm90ZWN0aW9uVW5zcGVudDxUTnVtYmVyPih1bnNwZW50LCB0aGlzLm5ldHdvcmspO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2gobmV0d29yaykgaW5zdGVhZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRlZmF1bHRTaWdIYXNoVHlwZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdXR4b2xpYi5iaXRjb2luLnZlcmlmeVNpZ25hdHVyZSgpIGluc3RlYWRcbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShcbiAgICB0cmFuc2FjdGlvbjogYW55LFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBhbW91bnQ6IG51bWJlcixcbiAgICB2ZXJpZmljYXRpb25TZXR0aW5nczoge1xuICAgICAgc2lnbmF0dXJlSW5kZXg/OiBudW1iZXI7XG4gICAgICBwdWJsaWNLZXk/OiBzdHJpbmc7XG4gICAgfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh0cmFuc2FjdGlvbi5uZXR3b3JrICE9PSB0aGlzLm5ldHdvcmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbmV0d29yayBtaXNtYXRjaGApO1xuICAgIH1cbiAgICByZXR1cm4gdXR4b2xpYi5iaXRnby52ZXJpZnlTaWduYXR1cmUodHJhbnNhY3Rpb24sIGlucHV0SW5kZXgsIGFtb3VudCwge1xuICAgICAgc2lnbmF0dXJlSW5kZXg6IHZlcmlmaWNhdGlvblNldHRpbmdzLnNpZ25hdHVyZUluZGV4LFxuICAgICAgcHVibGljS2V5OiB2ZXJpZmljYXRpb25TZXR0aW5ncy5wdWJsaWNLZXkgPyBCdWZmZXIuZnJvbSh2ZXJpZmljYXRpb25TZXR0aW5ncy5wdWJsaWNLZXksICdoZXgnKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXBvc2UgYSByYXcgdHJhbnNhY3Rpb24gaW50byB1c2VmdWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRvdGFsIGFtb3VudHMsXG4gICAqIGNoYW5nZSBhbW91bnRzLCBhbmQgdHJhbnNhY3Rpb24gb3V0cHV0cy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCB0eEhleCA9IF8uZ2V0KHBhcmFtcywgJ3R4SGV4Jyk7XG4gICAgaWYgKCF0eEhleCB8fCAhXy5pc1N0cmluZyh0eEhleCkgfHwgIXR4SGV4Lm1hdGNoKC9eKFthLWYwLTldezJ9KSskL2kpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHJhbnNhY3Rpb24gaGV4LCBtdXN0IGJlIGEgdmFsaWQgaGV4IHN0cmluZycpO1xuICAgIH1cblxuICAgIGxldCB0cmFuc2FjdGlvbjtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh0eEhleCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gcGFyc2UgdHJhbnNhY3Rpb24gaGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSB0cmFuc2FjdGlvbi5nZXRJZCgpO1xuICAgIGxldCBzcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KDAsIHRoaXMuYW1vdW50VHlwZSk7XG4gICAgbGV0IGNoYW5nZUFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KDAsIHRoaXMuYW1vdW50VHlwZSk7XG4gICAgY29uc3QgZXhwbGFuYXRpb24gPSB7XG4gICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnXSxcbiAgICAgIGlkOiBpZCxcbiAgICAgIG91dHB1dHM6IFtdIGFzIE91dHB1dFtdLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10gYXMgT3V0cHV0W10sXG4gICAgfSBhcyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uO1xuXG4gICAgY29uc3QgeyBjaGFuZ2VBZGRyZXNzZXMgPSBbXSwgdW5zcGVudHMgPSBbXSB9ID0gcGFyYW1zLnR4SW5mbyA/PyB7fTtcblxuICAgIHRyYW5zYWN0aW9uLm91dHMuZm9yRWFjaCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChjdXJyZW50T3V0cHV0LnNjcmlwdCwgdGhpcy5uZXR3b3JrKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbW91bnQgPSBjdXJyZW50T3V0cHV0LnZhbHVlO1xuXG4gICAgICBpZiAoY2hhbmdlQWRkcmVzc2VzLmluY2x1ZGVzKGN1cnJlbnRBZGRyZXNzKSkge1xuICAgICAgICAvLyB0aGlzIGlzIGNoYW5nZVxuICAgICAgICBjaGFuZ2VBbW91bnQgKz0gY3VycmVudEFtb3VudDtcbiAgICAgICAgZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IGN1cnJlbnRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3BlbmRBbW91bnQgKz0gY3VycmVudEFtb3VudDtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGN1cnJlbnRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCA9IHNwZW5kQW1vdW50LnRvU3RyaW5nKCk7XG4gICAgZXhwbGFuYXRpb24uY2hhbmdlQW1vdW50ID0gY2hhbmdlQW1vdW50LnRvU3RyaW5nKCk7XG5cbiAgICAvLyBhZGQgZmVlIGluZm8gaWYgYXZhaWxhYmxlXG4gICAgaWYgKHBhcmFtcy5mZWVJbmZvKSB7XG4gICAgICBleHBsYW5hdGlvbi5kaXNwbGF5T3JkZXIucHVzaCgnZmVlJyk7XG4gICAgICBleHBsYW5hdGlvbi5mZWUgPSBwYXJhbXMuZmVlSW5mbztcbiAgICB9XG5cbiAgICBpZiAoXy5pc0ludGVnZXIodHJhbnNhY3Rpb24ubG9ja3RpbWUpICYmIHRyYW5zYWN0aW9uLmxvY2t0aW1lID4gMCkge1xuICAgICAgZXhwbGFuYXRpb24ubG9ja3RpbWUgPSB0cmFuc2FjdGlvbi5sb2NrdGltZTtcbiAgICAgIGV4cGxhbmF0aW9uLmRpc3BsYXlPcmRlci5wdXNoKCdsb2NrdGltZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZPdXRwdXRzID0gcGFyYW1zLnR4SW5mbz8udW5zcGVudHM/Lm1hcCgodSkgPT4gdG9PdXRwdXQ8VE51bWJlcj4odSwgdGhpcy5uZXR3b3JrKSk7XG5cbiAgICAvLyBpZiBrZXlzIGFyZSBwcm92aWRlZCwgcHJlcGFyZSB0aGUga2V5cyBmb3IgaW5wdXQgc2lnbmF0dXJlIGNoZWNraW5nXG4gICAgY29uc3Qga2V5cyA9IHBhcmFtcy5wdWJzPy5tYXAoKHhwdWIpID0+IGJpcDMyLmZyb21CYXNlNTgoeHB1YikpO1xuICAgIGNvbnN0IHdhbGxldEtleXMgPSBrZXlzICYmIGtleXMubGVuZ3RoID09PSAzID8gbmV3IGJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleXMgYXMgVHJpcGxlPEJJUDMySW50ZXJmYWNlPikgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBnZXQgdGhlIG51bWJlciBvZiBzaWduYXR1cmVzIHBlciBpbnB1dFxuICAgIGNvbnN0IGlucHV0U2lnbmF0dXJlQ291bnRzID0gdHJhbnNhY3Rpb24uaW5zLm1hcCgoaW5wdXQsIGlkeCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAodW5zcGVudHMubGVuZ3RoICE9PSB0cmFuc2FjdGlvbi5pbnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByZXZPdXRwdXRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzdGF0ZWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXdhbGxldEtleXMpIHtcbiAgICAgICAgLy8gbm8gcHViIGtleXMgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBwdWIga2V5c1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHZlcmlmeVNpZ25hdHVyZVdpdGhVbnNwZW50PFROdW1iZXI+KHRyYW5zYWN0aW9uLCBpZHgsIHVuc3BlbnRzLCB3YWxsZXRLZXlzKS5maWx0ZXIoKHYpID0+IHYpLmxlbmd0aDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc29tZSBvdGhlciBlcnJvciBvY2N1cnJlZCBhbmQgd2UgY2FuJ3QgdmFsaWRhdGUgdGhlIHNpZ25hdHVyZXNcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBsYW5hdGlvbi5pbnB1dFNpZ25hdHVyZXMgPSBpbnB1dFNpZ25hdHVyZUNvdW50cztcbiAgICBleHBsYW5hdGlvbi5zaWduYXR1cmVzID0gXy5tYXgoaW5wdXRTaWduYXR1cmVDb3VudHMpIGFzIG51bWJlcjtcbiAgICByZXR1cm4gZXhwbGFuYXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbXVsdGlzaWcgYWRkcmVzcyBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxpc3Qgb2Yga2V5Y2hhaW5zIGFuZCBhIHNpZ25pbmcgdGhyZXNob2xkXG4gICAqIEBwYXJhbSBhZGRyZXNzVHlwZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlVGhyZXNob2xkXG4gICAqIEBwYXJhbSBrZXlzXG4gICAqL1xuICBjcmVhdGVNdWx0aVNpZ0FkZHJlc3MoYWRkcmVzc1R5cGU6IFNjcmlwdFR5cGUyT2YzLCBzaWduYXR1cmVUaHJlc2hvbGQ6IG51bWJlciwga2V5czogQnVmZmVyW10pOiBNdWx0aVNpZ0FkZHJlc3Mge1xuICAgIGNvbnN0IHtcbiAgICAgIHNjcmlwdFB1YktleTogb3V0cHV0U2NyaXB0LFxuICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoa2V5cywgYWRkcmVzc1R5cGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dHB1dFNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICBhZGRyZXNzOiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIHRoaXMubmV0d29yayksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QHNlZSBiYWNrdXBLZXlSZWNvdmVyeX1cbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3ZlclBhcmFtcyk6IFJldHVyblR5cGU8dHlwZW9mIGJhY2t1cEtleVJlY292ZXJ5PiB7XG4gICAgcmV0dXJuIGJhY2t1cEtleVJlY292ZXJ5KHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBjb2luIHRoYXQgd2FzIHNlbnQgdG8gd3JvbmcgY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4aWQgVGhlIHR4aWQgb2YgdGhlIGZhdWx0eSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY292ZXJ5QWRkcmVzcyBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0IHRoZSB3YWxsZXQgdGhhdCByZWNlaXZlZCB0aGUgZnVuZHNcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUNvaW4gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2lnbmVkIHJldHVybiBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIChkZWZhdWx0PXRydWUpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy54cHJ2IHRoZSB1bmVuY3J5cHRlZCB4cHJ2ICh1c2VkIGluc3RlYWQgb2Ygd2FsbGV0IHBhc3NwaHJhc2UpXG4gICAqIEBwYXJhbSBwYXJhbXMuYXBpS2V5IGZvciB1dHhvIGNvaW5zIG90aGVyIHRoYW4gW0JUQyxUQlRDXSB0aGlzIGlzIGEgQmxvY2sgQ2hhaXIgYXBpIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlY292ZXJGcm9tV3JvbmdDaGFpbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICAgIGNvbnN0IHsgdHhpZCwgcmVjb3ZlcnlBZGRyZXNzLCB3YWxsZXQsIHdhbGxldFBhc3NwaHJhc2UsIHhwcnYsIGFwaUtleSB9ID0gcGFyYW1zO1xuXG4gICAgLy8gcGFyYW1zLnJlY292ZXJ5Q29pbiB1c2VkIHRvIGJlIHBhcmFtcy5jb2luLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHJlY292ZXJ5Q29pbiA9IHBhcmFtcy5jb2luIHx8IHBhcmFtcy5yZWNvdmVyeUNvaW47XG4gICAgaWYgKCFyZWNvdmVyeUNvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBvYmplY3QgcmVjb3ZlcnlDb2luJyk7XG4gICAgfVxuICAgIC8vIHNpZ25lZCBzaG91bGQgZGVmYXVsdCB0byB0cnVlLCBhbmQgb25seSBiZSBkaXNhYmxlZCBpZiBleHBsaWNpdGx5IHNldCB0byBmYWxzZSAobm90IHVuZGVmaW5lZClcbiAgICBjb25zdCBzaWduZWQgPSBwYXJhbXMuc2lnbmVkICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IHNvdXJjZUNvaW5GYW1pbHkgPSB0aGlzLmdldEZhbWlseSgpO1xuICAgIGNvbnN0IHJlY292ZXJ5Q29pbkZhbWlseSA9IHJlY292ZXJ5Q29pbi5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zID0gc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXNbc291cmNlQ29pbkZhbWlseV07XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zKSB8fCAhc3VwcG9ydGVkUmVjb3ZlcnlDb2lucy5pbmNsdWRlcyhyZWNvdmVyeUNvaW5GYW1pbHkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY292ZXJ5IG9mICR7c291cmNlQ29pbkZhbWlseX0gYmFsYW5jZXMgZnJvbSAke3JlY292ZXJ5Q29pbkZhbWlseX0gd2FsbGV0cyBpcyBub3Qgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZWNvdmVyQ3Jvc3NDaGFpbjxUTnVtYmVyPih0aGlzLmJpdGdvLCB7XG4gICAgICBzb3VyY2VDb2luOiB0aGlzLFxuICAgICAgcmVjb3ZlcnlDb2luLFxuICAgICAgd2FsbGV0SWQ6IHdhbGxldCxcbiAgICAgIHR4aWQsXG4gICAgICByZWNvdmVyeUFkZHJlc3MsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBzaWduZWQgPyB3YWxsZXRQYXNzcGhyYXNlIDogdW5kZWZpbmVkLFxuICAgICAgeHBydjogc2lnbmVkID8geHBydiA6IHVuZGVmaW5lZCxcbiAgICAgIGFwaUtleSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiaXAzMiBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViIGFuZCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkOiBCdWZmZXIpOiB7IHB1Yjogc3RyaW5nOyBwcnY6IHN0cmluZyB9IHtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgICAvLyBiaXQgY2hhaW4gY29kZSwgYm90aCBvZiB3aGljaCBtdXN0IGJlIHJhbmRvbS4gNTEyIGJpdHMgaXMgdGhlcmVmb3JlIHRoZVxuICAgICAgLy8gbWF4aW11bSBlbnRyb3B5IGFuZCBnaXZlcyB1cyBtYXhpbXVtIHNlY3VyaXR5IGFnYWluc3QgY3JhY2tpbmcuXG4gICAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gYmlwMzIuZnJvbVNlZWQoc2VlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogZXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgcHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRFeHRyYVByZWJ1aWxkUGFyYW1zKGJ1aWxkUGFyYW1zOiBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHJlQ3JlYXRlQml0R28ocGFyYW1zOiBQcmVjcmVhdGVCaXRHb09wdGlvbnMpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhc3luYyBwcmVzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgYXN5bmMgc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KFxuICAgIHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgICBrZXljaGFpbnM6IEtleWNoYWluc1RyaXBsZXRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gd2FsbGV0UGFyYW1zO1xuICB9XG5cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0UmVjb3ZlcnlQcm92aWRlcihhcGlUb2tlbj86IHN0cmluZyk6IFJlY292ZXJ5UHJvdmlkZXIge1xuICAgIHJldHVybiBmb3JDb2luKHRoaXMuZ2V0Q2hhaW4oKSwgYXBpVG9rZW4pO1xuICB9XG59XG4iXX0=
|