@bitgo-beta/sdk-api 1.10.1-beta.1796 → 1.10.1-beta.1797
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +8 -8
- package/dist/src/encrypt.d.ts +1 -1
- package/dist/src/encrypt.js +5 -5
- package/dist/src/v1/keychains.js +8 -5
- package/dist/src/v1/travelRule.js +5 -5
- package/dist/src/v1/wallets.js +21 -17
- package/dist/test/unit/encrypt.js +26 -20
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
package/dist/src/v1/wallets.js
CHANGED
|
@@ -244,25 +244,28 @@ Wallets.prototype.acceptShare = function (params, callback) {
|
|
|
244
244
|
if (!params.userPassword) {
|
|
245
245
|
throw new Error('userPassword param must be provided to decrypt shared key');
|
|
246
246
|
}
|
|
247
|
-
return self.bitgo.getECDHKeychain().then(function (sharingKeychain) {
|
|
247
|
+
return self.bitgo.getECDHKeychain().then(async function (sharingKeychain) {
|
|
248
248
|
if (!sharingKeychain.encryptedXprv) {
|
|
249
249
|
throw new Error('EncryptedXprv was not found on sharing keychain');
|
|
250
250
|
}
|
|
251
251
|
// Now we have the sharing keychain, we can work out the secret used for sharing the wallet with us
|
|
252
|
-
sharingKeychain.xprv = self.bitgo.
|
|
252
|
+
sharingKeychain.xprv = await self.bitgo.decryptAsync({
|
|
253
253
|
password: params.userPassword,
|
|
254
254
|
input: sharingKeychain.encryptedXprv,
|
|
255
255
|
});
|
|
256
256
|
// Derive key by path (which is used between these 2 users only)
|
|
257
257
|
const secret = (0, sdk_core_1.getSharedSecret)(utxo_lib_1.bip32.fromBase58(sharingKeychain.xprv).derivePath((0, sdk_core_1.sanitizeLegacyPath)(walletShare.keychain.path)), Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
|
|
258
258
|
// Yes! We got the secret successfully here, now decrypt the shared wallet xprv
|
|
259
|
-
const decryptedSharedWalletXprv = self.bitgo.
|
|
259
|
+
const decryptedSharedWalletXprv = await self.bitgo.decryptAsync({
|
|
260
260
|
password: secret,
|
|
261
261
|
input: walletShare.keychain.encryptedXprv,
|
|
262
262
|
});
|
|
263
263
|
// We will now re-encrypt the wallet with our own password
|
|
264
264
|
const newWalletPassphrase = params.newWalletPassphrase || params.userPassword;
|
|
265
|
-
encryptedXprv = self.bitgo.
|
|
265
|
+
encryptedXprv = await self.bitgo.encryptAsync({
|
|
266
|
+
password: newWalletPassphrase,
|
|
267
|
+
input: decryptedSharedWalletXprv,
|
|
268
|
+
});
|
|
266
269
|
// Carry on to the next block where we will post the acceptance of the share with the encrypted xprv
|
|
267
270
|
return walletShare;
|
|
268
271
|
});
|
|
@@ -329,14 +332,6 @@ Wallets.prototype.createWalletWithKeychains = function (params, callback) {
|
|
|
329
332
|
const label = params.label;
|
|
330
333
|
// Create the user and backup key.
|
|
331
334
|
const userKeychain = this.bitgo.keychains().create();
|
|
332
|
-
userKeychain.encryptedXprv = this.bitgo.encrypt({ password: params.passphrase, input: userKeychain.xprv });
|
|
333
|
-
const keychainData = {
|
|
334
|
-
xpub: userKeychain.xpub,
|
|
335
|
-
encryptedXprv: userKeychain.encryptedXprv,
|
|
336
|
-
};
|
|
337
|
-
if (params.passcodeEncryptionCode) {
|
|
338
|
-
keychainData.originalPasscodeEncryptionCode = params.passcodeEncryptionCode;
|
|
339
|
-
}
|
|
340
335
|
const hasBackupXpub = !!params.backupXpub;
|
|
341
336
|
const hasBackupXpubProvider = !!params.backupXpubProvider;
|
|
342
337
|
if (hasBackupXpub && hasBackupXpubProvider) {
|
|
@@ -347,10 +342,19 @@ Wallets.prototype.createWalletWithKeychains = function (params, callback) {
|
|
|
347
342
|
}
|
|
348
343
|
let backupKeychain;
|
|
349
344
|
let bitgoKeychain;
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
.
|
|
353
|
-
.
|
|
345
|
+
return Promise.resolve()
|
|
346
|
+
.then(() => self.bitgo.encryptAsync({ password: params.passphrase, input: userKeychain.xprv }))
|
|
347
|
+
.then(function (encryptedXprv) {
|
|
348
|
+
userKeychain.encryptedXprv = encryptedXprv;
|
|
349
|
+
const keychainData = {
|
|
350
|
+
xpub: userKeychain.xpub,
|
|
351
|
+
encryptedXprv: userKeychain.encryptedXprv,
|
|
352
|
+
};
|
|
353
|
+
if (params.passcodeEncryptionCode) {
|
|
354
|
+
keychainData.originalPasscodeEncryptionCode = params.passcodeEncryptionCode;
|
|
355
|
+
}
|
|
356
|
+
return self.bitgo.keychains().add(keychainData);
|
|
357
|
+
})
|
|
354
358
|
.then(function () {
|
|
355
359
|
// Add the backup keychain
|
|
356
360
|
if (params.backupXpubProvider) {
|
|
@@ -525,4 +529,4 @@ Wallets.prototype.remove = function (params, callback) {
|
|
|
525
529
|
.catch(callback);
|
|
526
530
|
};
|
|
527
531
|
module.exports = Wallets;
|
|
528
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS93YWxsZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQixzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsbURBTzhCO0FBQzlCLG1EQUE2QztBQUM3Qyw4REFBZ0Q7QUFDaEQsb0RBQXVCO0FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVuQyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUs7SUFDN0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixPQUFPO0FBQ1AsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2pELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUUxQixJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENB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QUFDTix5QkFBeUI7QUFDekIsc0JBQXNCO0FBQ3RCLDZCQUE2QjtBQUM3QixFQUFFO0FBQ0YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNoRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixTQUFTO0FBQ1QsNkJBQTZCO0FBQzdCLHNCQUFzQjtBQUN0Qiw2QkFBNkI7QUFDN0IsRUFBRTtBQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXBELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gV2FsbGV0cyBPYmplY3Rcbi8vIEJpdEdvIGFjY2Vzc29yIHRvIGEgdXNlcidzIHdhbGxldHMuXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cbmltcG9ydCB7XG4gIGNvbW1vbixcbiAgZ2V0QWRkcmVzc1AyUEtILFxuICBnZXROZXR3b3JrLFxuICBnZXRTaGFyZWRTZWNyZXQsXG4gIG1ha2VSYW5kb21LZXksXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5jb25zdCBXYWxsZXQgPSByZXF1aXJlKCcuL3dhbGxldCcpO1xuXG4vL1xuLy8gQ29uc3RydWN0b3Jcbi8vXG5jb25zdCBXYWxsZXRzID0gZnVuY3Rpb24gKGJpdGdvKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMuYml0Z28gPSBiaXRnbztcbn07XG5cbi8vXG4vLyBsaXN0XG4vLyBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0c1xuLy9cbldhbGxldHMucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggc2tpcCBhbmQgcHJldklkJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGlmIChwYXJhbXMuZ2V0YmFsYW5jZXMpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5nZXRiYWxhbmNlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnZXRiYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdnZXRiYWxhbmNlcz0nICsgcGFyYW1zLmdldGJhbGFuY2VzKTtcbiAgfVxuICBpZiAocGFyYW1zLnNraXApIHtcbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ3NraXA9JyArIHBhcmFtcy5za2lwKTtcbiAgfSBlbHNlIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgYXJncy5wdXNoKCdwcmV2SWQ9JyArIHBhcmFtcy5wcmV2SWQpO1xuICB9XG5cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldCcgKyBxdWVyeSkpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICBib2R5LndhbGxldHMgPSBib2R5LndhbGxldHMubWFwKGZ1bmN0aW9uICh3KSB7XG4gICAgICAgIHJldHVybiBuZXcgV2FsbGV0KHNlbGYuYml0Z28sIHcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYm9keTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXRzLnByb3RvdHlwZS5nZXRXYWxsZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBsZXQgcXVlcnkgPSAnJztcbiAgaWYgKHBhcmFtcy5ncGspIHtcbiAgICBxdWVyeSA9ICc/Z3BrPTEnO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkICsgcXVlcnkpKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAod2FsbGV0KSB7XG4gICAgICByZXR1cm4gbmV3IFdhbGxldChzZWxmLmJpdGdvLCB3YWxsZXQpO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBsaXN0SW52aXRlc1xuLy8gTGlzdCB0aGUgaW52aXRlcyBvbiBhIHVzZXJcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5saXN0SW52aXRlcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldGludml0ZScpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNhbmNlbEludml0ZVxuLy8gY2FuY2VsIGEgd2FsbGV0IGludml0ZSB0aGF0IGEgdXNlciBpbml0aWF0ZWRcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5jYW5jZWxJbnZpdGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0SW52aXRlSWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMuYml0Z28udXJsKCcvd2FsbGV0aW52aXRlLycgKyBwYXJhbXMud2FsbGV0SW52aXRlSWQpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGxpc3RTaGFyZXNcbi8vIExpc3QgdGhlIHVzZXIncyB3YWxsZXQgc2hhcmVzXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUubGlzdFNoYXJlcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlJykpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gcmVzZW5kU2hhcmVJbnZpdGVcbi8vIFJlc2VuZCB0aGUgaW52aXRhdGlvbiBlbWFpbCB3aGljaCBzaGFyZXMgYSB3YWxsZXQgd2l0aCBhbm90aGVyIHVzZXJcbi8vIFBhcmFtczpcbi8vICAgIHdhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGdldCBpbmZvcm1hdGlvbiBvblxuLy9cbldhbGxldHMucHJvdG90eXBlLnJlc2VuZFNoYXJlSW52aXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgICBjb25zdCB1cmxQYXJ0cyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkICsgJy9yZXNlbmRlbWFpbCc7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmUvJyArIHVybFBhcnRzKSkucmVzdWx0KCk7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0U2hhcmVcbi8vIEdldHMgYSB3YWxsZXQgc2hhcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4uIHJlcXVpcmVzIHVubG9jayBpZiBrZXljaGFpbiBpcyBwcmVzZW50LlxuLy8gUGFyYW1zOlxuLy8gICAgd2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gZ2V0IGluZm9ybWF0aW9uIG9uXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuZ2V0U2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVwZGF0ZVNoYXJlXG4vLyB1cGRhdGVzIGEgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbi8vICAgIHN0YXRlIC0gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd2FsbGV0IHNoYXJlXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUudXBkYXRlU2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNhbmNlbFNoYXJlXG4vLyBjYW5jZWxzIGEgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5jYW5jZWxTaGFyZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBhY2NlcHRTaGFyZVxuLy8gQWNjZXB0cyBhIHdhbGxldCBzaGFyZSwgYWRkaW5nIHRoZSB3YWxsZXQgdG8gdGhlIHVzZXIncyBsaXN0XG4vLyBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBhY2NlcHRcbi8vICAgIHVzZXJQYXNzd29yZCAtIChyZXF1aXJlZCBpZiBtb3JlIGEga2V5Y2hhaW4gd2FzIHNoYXJlZCkgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXRcbi8vICAgIG5ld1dhbGxldFBhc3NwaHJhc2UgLSBuZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHNhdmluZyB0aGUgc2hhcmVkIHdhbGxldCB4cHJ2LlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgIElmIGxlZnQgYmxhbmsgYW5kIGEgd2FsbGV0IHdpdGggbW9yZSB0aGFuIHZpZXcgcGVybWlzc2lvbnMgd2FzIHNoYXJlZCwgdGhlbiB0aGUgdXNlcnBhc3N3b3JkIGlzIHVzZWQuXG4vLyAgICBvdmVycmlkZUVuY3J5cHRlZFhwcnYgLSBzZXQgb25seSBpZiB0aGUgeHBydiB3YXMgcmVjZWl2ZWQgb3V0LW9mLWJhbmQuXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuYWNjZXB0U2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbJ292ZXJyaWRlRW5jcnlwdGVkWHBydiddLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBlbmNyeXB0ZWRYcHJ2ID0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkWHBydjtcblxuICByZXR1cm4gdGhpcy5nZXRTaGFyZSh7IHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHdhbGxldFNoYXJlKSB7XG4gICAgICAvLyBSZXR1cm4gcmlnaHQgYXdheSBpZiB0aGVyZSBpcyBubyBrZXljaGFpbiB0byBkZWNyeXB0LCBvciBpZiBleHBsaWNpdCBlbmNyeXB0ZWRYcHJ2IHdhcyBwcm92aWRlZFxuICAgICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbiB8fCAhd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB8fCBlbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgIHJldHVybiB3YWxsZXRTaGFyZTtcbiAgICAgIH1cblxuICAgICAgLy8gTW9yZSB0aGFuIHZpZXdpbmcgd2FzIHJlcXVlc3RlZCwgc28gd2UgbmVlZCB0byBwcm9jZXNzIHRoZSB3YWxsZXQga2V5cyB1c2luZyB0aGUgc2hhcmVkIGVjZGggc2NoZW1lXG4gICAgICBpZiAoIXBhcmFtcy51c2VyUGFzc3dvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuYml0Z28uZ2V0RUNESEtleWNoYWluKCkudGhlbihmdW5jdGlvbiAoc2hhcmluZ0tleWNoYWluKSB7XG4gICAgICAgIGlmICghc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3cgd2UgaGF2ZSB0aGUgc2hhcmluZyBrZXljaGFpbiwgd2UgY2FuIHdvcmsgb3V0IHRoZSBzZWNyZXQgdXNlZCBmb3Igc2hhcmluZyB0aGUgd2FsbGV0IHdpdGggdXNcbiAgICAgICAgc2hhcmluZ0tleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVyaXZlIGtleSBieSBwYXRoICh3aGljaCBpcyB1c2VkIGJldHdlZW4gdGhlc2UgMiB1c2VycyBvbmx5KVxuICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAgICAgYmlwMzIuZnJvbUJhc2U1OChzaGFyaW5nS2V5Y2hhaW4ueHBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKHdhbGxldFNoYXJlLmtleWNoYWluLmZyb21QdWJLZXksICdoZXgnKVxuICAgICAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgICAvLyBZZXMhIFdlIGdvdCB0aGUgc2VjcmV0IHN1Y2Nlc3NmdWxseSBoZXJlLCBub3cgZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCB4cHJ2XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZFNoYXJlZFdhbGxldFhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICAgICAgaW5wdXQ6IHdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdlIHdpbGwgbm93IHJlLWVuY3J5cHQgdGhlIHdhbGxldCB3aXRoIG91ciBvd24gcGFzc3dvcmRcbiAgICAgICAgY29uc3QgbmV3V2FsbGV0UGFzc3BocmFzZSA9IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQ7XG4gICAgICAgIGVuY3J5cHRlZFhwcnYgPSBzZWxmLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFhwcnYgfSk7XG5cbiAgICAgICAgLy8gQ2Fycnkgb24gdG8gdGhlIG5leHQgYmxvY2sgd2hlcmUgd2Ugd2lsbCBwb3N0IHRoZSBhY2NlcHRhbmNlIG9mIHRoZSBzaGFyZSB3aXRoIHRoZSBlbmNyeXB0ZWQgeHBydlxuICAgICAgICByZXR1cm4gd2FsbGV0U2hhcmU7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICh3YWxsZXRTaGFyZSkge1xuICAgICAgY29uc3QgdXBkYXRlUGFyYW1zOiBhbnkgPSB7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChlbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgIHVwZGF0ZVBhcmFtcy5lbmNyeXB0ZWRYcHJ2ID0gZW5jcnlwdGVkWHBydjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYudXBkYXRlU2hhcmUodXBkYXRlUGFyYW1zKTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlS2V5XG4vLyBDcmVhdGUgYSBzaW5nbGUgYml0Y29pbiBrZXkuICBUaGlzIHJ1bnMgbG9jYWxseS5cbi8vIFJldHVybnM6IHtcbi8vICAgYWRkcmVzczogPGFkZHJlc3M+XG4vLyAgIGtleTogPGtleSwgaW4gV0lGIGZvcm1hdD5cbi8vIH1cbldhbGxldHMucHJvdG90eXBlLmNyZWF0ZUtleSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29uc3Qga2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICByZXR1cm4ge1xuICAgIGFkZHJlc3M6IGdldEFkZHJlc3NQMlBLSChrZXkpLFxuICAgIGtleToga2V5LnRvV0lGKCksXG4gIH07XG59O1xuXG4vL1xuLy8gY3JlYXRlV2FsbGV0V2l0aEtleWNoYWluc1xuLy8gQ3JlYXRlIGEgbmV3IDItb2YtMyB3YWxsZXQgYW5kIGl0J3MgYXNzb2NpYXRlZCBrZXljaGFpbnMuXG4vLyBSZXR1cm5zIHRoZSBsb2NhbGx5IGNyZWF0ZWQga2V5cyB3aXRoIHRoZWlyIGVuY3J5cHRlZCB4cHJ2cy5cbi8vICoqV0FSTklORzogQkUgU1VSRSBUTyBCQUNLVVAhIE5PVCBET0lORyBTTyBDQU4gUkVTVUxUIElOIExPU1MgT0YgRlVORFMhKipcbi8vXG4vLyAxLiBDcmVhdGVzIHRoZSB1c2VyIGtleWNoYWluIGxvY2FsbHkgb24gdGhlIGNsaWVudCwgYW5kIGVuY3J5cHRzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2Vcbi8vIDIuIElmIG5vIHhwdWIgd2FzIHByb3ZpZGVkLCBjcmVhdGVzIHRoZSBiYWNrdXAga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuLy8gMy4gVXBsb2FkcyB0aGUgZW5jcnlwdGVkIHVzZXIgYW5kIGJhY2t1cCBrZXljaGFpbnMgdG8gQml0R29cbi8vIDQuIENyZWF0ZXMgdGhlIEJpdEdvIGtleSBvbiB0aGUgc2VydmljZVxuLy8gNS4gQ3JlYXRlcyB0aGUgd2FsbGV0IG9uIEJpdEdvIHdpdGggdGhlIDMgcHVibGljIGtleXMgYWJvdmVcbi8vXG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIFwicGFzc3BocmFzZVwiOiB3YWxsZXQgcGFzc3BocmFzZSB0byBlbmNyeXB0IHVzZXIgYW5kIGJhY2t1cCBrZXlzIHdpdGhcbi8vICAgXCJsYWJlbFwiOiB3YWxsZXQgbGFiZWwsIGlzIHNob3duIGluIEJpdEdvIFVJXG4vLyAgIFwiYmFja3VwWHB1YlwiOiBiYWNrdXAga2V5Y2hhaW4geHB1YiwgaXQgaXMgSElHSExZIFJFQ09NTUVOREVEIHlvdSBnZW5lcmF0ZSB0aGlzIG9uIGEgc2VwYXJhdGUgbWFjaGluZSFcbi8vICAgICAgICAgICAgICAgICBCSVRHTyBET0VTIE5PVCBHVUFSQU5URUUgU0FGRVRZIE9GIFdBTExFVFMgV0lUSCBNVUxUSVBMRSBLRVlTIENSRUFURUQgT04gVEhFIFNBTUUgTUFDSElORSAqKlxuLy8gICBcImJhY2t1cFhwdWJQcm92aWRlclwiOiBQcm92aXNpb24gYmFja3VwIGtleSBmcm9tIHRoaXMgcHJvdmlkZXIgKEtSUyksIGUuZy4gXCJrZXl0ZXJuYWxcIi5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGNyZWF0ZSBhbiBpbnN0YW50LWNhcGFibGUgd2FsbGV0LlxuLy8gICBcInBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcIjogdGhlIGNvZGUgdXNlZCB0byBlbmNyeXB0IHRoZSB3YWxsZXQgcGFzc2NvZGUgdXNlZCBpbiB0aGUgcmVjb3ZlcnkgcHJvY2Vzc1xuLy8gUmV0dXJuczoge1xuLy8gICB3YWxsZXQ6IG5ld2x5IGNyZWF0ZWQgd2FsbGV0IG1vZGVsIG9iamVjdFxuLy8gICB1c2VyS2V5Y2hhaW46IHRoZSBuZXdseSBjcmVhdGVkIHVzZXIga2V5Y2hhaW4sIHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgeHBydiBzdG9yZWQgb24gQml0R29cbi8vICAgYmFja3VwS2V5Y2hhaW46IHRoZSBuZXdseSBjcmVhdGVkIGJhY2t1cCBrZXljaGFpblxuLy9cbi8vICoqIEJFIFNVUkUgVE8gQkFDSyBVUCBUSEUgRU5DUllQVEVEIFVTRVIgQU5EIEJBQ0tVUCBLRVlDSEFJTlMhKipcbi8vXG4vLyB9XG5XYWxsZXRzLnByb3RvdHlwZS5jcmVhdGVXYWxsZXRXaXRoS2V5Y2hhaW5zID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMoXG4gICAgcGFyYW1zLFxuICAgIFsncGFzc3BocmFzZSddLFxuICAgIFsnbGFiZWwnLCAnYmFja3VwWHB1YicsICdlbnRlcnByaXNlJywgJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUnXSxcbiAgICBjYWxsYmFja1xuICApO1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgY29uc3QgbGFiZWwgPSBwYXJhbXMubGFiZWw7XG5cbiAgLy8gQ3JlYXRlIHRoZSB1c2VyIGFuZCBiYWNrdXAga2V5LlxuICBjb25zdCB1c2VyS2V5Y2hhaW4gPSB0aGlzLmJpdGdvLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkWHBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMucGFzc3BocmFzZSwgaW5wdXQ6IHVzZXJLZXljaGFpbi54cHJ2IH0pO1xuXG4gIGNvbnN0IGtleWNoYWluRGF0YTogYW55ID0ge1xuICAgIHhwdWI6IHVzZXJLZXljaGFpbi54cHViLFxuICAgIGVuY3J5cHRlZFhwcnY6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICB9O1xuXG4gIGlmIChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgIGtleWNoYWluRGF0YS5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgPSBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZTtcbiAgfVxuXG4gIGNvbnN0IGhhc0JhY2t1cFhwdWIgPSAhIXBhcmFtcy5iYWNrdXBYcHViO1xuICBjb25zdCBoYXNCYWNrdXBYcHViUHJvdmlkZXIgPSAhIXBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXI7XG4gIGlmIChoYXNCYWNrdXBYcHViICYmIGhhc0JhY2t1cFhwdWJQcm92aWRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb3ZpZGUgbW9yZSB0aGFuIG9uZSBiYWNrdXBYcHViIG9yIGJhY2t1cFhwdWJQcm92aWRlciBmbGFnJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gIH1cblxuICBsZXQgYmFja3VwS2V5Y2hhaW47XG4gIGxldCBiaXRnb0tleWNoYWluO1xuXG4gIC8vIEFkZCB0aGUgdXNlciBrZXljaGFpblxuICByZXR1cm4gc2VsZi5iaXRnb1xuICAgIC5rZXljaGFpbnMoKVxuICAgIC5hZGQoa2V5Y2hhaW5EYXRhKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEFkZCB0aGUgYmFja3VwIGtleWNoYWluXG4gICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgICAvLyBJZiByZXF1ZXN0ZWQsIHVzZSBhIEtSUyBvciBiYWNrdXAga2V5IHByb3ZpZGVyXG4gICAgICAgIHJldHVybiBzZWxmLmJpdGdvXG4gICAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgICAgLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgICBwcm92aWRlcjogcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcixcbiAgICAgICAgICAgIGRpc2FibGVLUlNFbWFpbDogcGFyYW1zLmRpc2FibGVLUlNFbWFpbCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgICAgICAgYmFja3VwS2V5Y2hhaW4gPSBrZXljaGFpbjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViKSB7XG4gICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgYmFja3VwIHhwdWJcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4gPSB7IHhwdWI6IHBhcmFtcy5iYWNrdXBYcHViIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBubyBwcm92aWRlZCB4cHViLCBzbyBkZWZhdWx0IHRvIGNyZWF0aW5nIG9uZSBoZXJlXG4gICAgICAgIGJhY2t1cEtleWNoYWluID0gc2VsZi5iaXRnby5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuYml0Z28ua2V5Y2hhaW5zKCkuYWRkKGJhY2t1cEtleWNoYWluKTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLmJpdGdvLmtleWNoYWlucygpLmNyZWF0ZUJpdEdvKCk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGJpdGdvS2V5Y2hhaW4gPSBrZXljaGFpbjtcbiAgICAgIGNvbnN0IHdhbGxldFBhcmFtczogYW55ID0ge1xuICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgIG06IDIsXG4gICAgICAgIG46IDMsXG4gICAgICAgIGtleWNoYWluczogW3sgeHB1YjogdXNlcktleWNoYWluLnhwdWIgfSwgeyB4cHViOiBiYWNrdXBLZXljaGFpbi54cHViIH0sIHsgeHB1YjogYml0Z29LZXljaGFpbi54cHViIH1dLFxuICAgICAgfTtcblxuICAgICAgaWYgKHBhcmFtcy5lbnRlcnByaXNlKSB7XG4gICAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gcGFyYW1zLmVudGVycHJpc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykge1xuICAgICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5hZGQod2FsbGV0UGFyYW1zKTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChuZXdXYWxsZXQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICB3YWxsZXQ6IG5ld1dhbGxldCxcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbjogYml0Z29LZXljaGFpbixcbiAgICAgIH07XG5cbiAgICAgIGlmIChiYWNrdXBLZXljaGFpbi54cHJ2KSB7XG4gICAgICAgIHJlc3VsdC53YXJuaW5nID0gJ0JlIHN1cmUgdG8gYmFja3VwIHRoZSBiYWNrdXAga2V5Y2hhaW4gLS0gaXQgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSBlbHNlISc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUZvcndhcmRXYWxsZXRcbi8vIENyZWF0ZXMgYSBmb3J3YXJkIHdhbGxldCBmcm9tIGEgc2luZ2xlIHByaXZhdGUga2V5LlxuLy8gQml0R28gd2lsbCB3YXRjaCB0aGUgd2FsbGV0IGFuZCBzZW5kIGFueSBpbmNvbWluZyB0cmFuc2FjdGlvbnMgdG8gYSBkZXN0aW5hdGlvbiBtdWx0aS1zaWcgd2FsbGV0XG4vLyBXQVJOSU5HOiBUSEUgUFJJVkFURSBLRVkgV0lMTCBCRSBTRU5UIFRPIEJJVEdPLiBZT1UgTVVTVCBDT05UQUNUIEJJVEdPIEJFRk9SRSBVU0lORyBUSElTIEZFQVRVUkUhXG4vLyBXRSBDQU5OT1QgR1VBUkFOVEVFIFRIRSBTRUNVUklUWSBPRiBTSU5HTEUtU0lHIFdBTExFVFMgQVMgQ1VTVE9EWSBJUyBVTkNMRUFSLlxuLy9cbi8vIFBhcmFtczpcbi8vICAgIHByaXZLZXkgLSB0aGUgcHJpdmF0ZSBrZXkgb24gYSBsZWdhY3kgc2luZ2xlLXNpZ25hdHVyZSB3YWxsZXQgdG8gYmUgd2F0Y2hlZCAoV0lGIGZvcm1hdClcbi8vICAgIHNvdXJjZUFkZHJlc3MgLSB0aGUgYml0Y29pbiBhZGRyZXNzIHRvIGZvcndhcmQgZnJvbSAoY29ycmVzcG9uZHMgdG8gdGhlIHByaXZhdGUga2V5KVxuLy8gICAgZGVzdGluYXRpb25XYWxsZXQgLSB0aGUgd2FsbGV0IG9iamVjdCB0byBzZW5kIHRoZSBkZXN0aW5hdGlvbiBjb2lucyB0byAod2hlbiBpbmNvbWluZyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkKVxuLy8gICAgbGFiZWwgLSBsYWJlbCBmb3IgdGhlIHdhbGxldFxuLy9cbldhbGxldHMucHJvdG90eXBlLmNyZWF0ZUZvcndhcmRXYWxsZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncHJpdktleScsICdzb3VyY2VBZGRyZXNzJ10sIFsnbGFiZWwnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuZGVzdGluYXRpb25XYWxsZXQpIHx8ICFwYXJhbXMuZGVzdGluYXRpb25XYWxsZXQuaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBkZXN0aW5hdGlvbldhbGxldCBvYmplY3QnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGxldCBuZXdEZXN0aW5hdGlvbkFkZHJlc3M7XG4gIGxldCBhZGRyZXNzRnJvbVByaXZLZXk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5wcml2S2V5LCBnZXROZXR3b3JrKCkgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgICBhZGRyZXNzRnJvbVByaXZLZXkgPSBnZXRBZGRyZXNzUDJQS0goa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIGEgdmFsaWQgcHJpdktleScpO1xuICB9XG5cbiAgaWYgKGFkZHJlc3NGcm9tUHJpdktleSAhPT0gcGFyYW1zLnNvdXJjZUFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAncHJpdktleSBkb2VzIG5vdCBtYXRjaCBzb3VyY2UgYWRkcmVzcyAtIGdvdCAnICsgYWRkcmVzc0Zyb21Qcml2S2V5ICsgJyBleHBlY3RlZCAnICsgcGFyYW1zLnNvdXJjZUFkZHJlc3NcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5kZXN0aW5hdGlvbldhbGxldC5jcmVhdGVBZGRyZXNzKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgLy8gQ3JlYXRlIG5ldyBhZGRyZXNzIG9uIHRoZSBkZXN0aW5hdGlvbiB3YWxsZXQgdG8gcmVjZWl2ZSBjb2luc1xuICAgIG5ld0Rlc3RpbmF0aW9uQWRkcmVzcyA9IHJlc3VsdC5hZGRyZXNzO1xuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBhbnkgPSB7XG4gICAgICB0eXBlOiAnZm9yd2FyZCcsXG4gICAgICBzb3VyY2VBZGRyZXNzOiBwYXJhbXMuc291cmNlQWRkcmVzcyxcbiAgICAgIGRlc3RpbmF0aW9uQWRkcmVzczogbmV3RGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgcHJpdktleTogcGFyYW1zLnByaXZLZXksXG4gICAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgIH07XG5cbiAgICBpZiAocGFyYW1zLmVudGVycHJpc2UpIHtcbiAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gcGFyYW1zLmVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzZWxmLmJpdGdvLnBvc3Qoc2VsZi5iaXRnby51cmwoJy93YWxsZXQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpKVxuICAgICAgLnRoZW4oY2FsbGJhY2spXG4gICAgICAuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcbn07XG5cbi8qKlxuICogQWRkIGEgbmV3IHdhbGxldCAoYWR2YW5jZWQgbW9kZSkuXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gbWFudWFsbHkgc3VibWl0IHRoZSBrZXljaGFpbnMsIHR5cGUsIG0gYW5kIG4gb2YgdGhlIHdhbGxldFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIGxhYmVsIG9mIHRoZSB3YWxsZXQgdG8gYmUgc2hvd24gaW4gVUlcbiAqIEBwYXJhbSB7bnVtYmVyfSBtIG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9jayB3YWxsZXQgKDIpXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2Yga2V5cyBhdmFpbGFibGUgb24gdGhlIHdhbGxldCAoMylcbiAqIEBwYXJhbSB7YXJyYXl9IGtleWNoYWlucyBhcnJheSBvZiBrZXljaGFpbiB4cHVic1xuICogQHBhcmFtIHtzdHJpbmd9IGVudGVycHJpc2UgSUQgb2YgdGhlIGVudGVycHJpc2UgZW50aXR5IHRvIGNyZWF0ZSB0aGlzIHdhbGxldCB1bmRlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyBXaGVuIHNldCB0byB0cnVlIGRpc2FibGVzIG5vdGlmaWNhdGlvbnMgZm9yIHRyYW5zYWN0aW9ucyBvbiB0aGlzIHdhbGxldC5cbiAqL1xuV2FsbGV0cy5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydsYWJlbCcsICdlbnRlcnByaXNlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMua2V5Y2hhaW5zKSA9PT0gZmFsc2UgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm0pIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIHR5cGVzIG9mIG11bHRpc2lnXG4gIGlmIChwYXJhbXMubSAhPT0gMiB8fCBwYXJhbXMubiAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgbXVsdGktc2lnIHR5cGUnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBjb25zdCBrZXljaGFpbnMgPSBwYXJhbXMua2V5Y2hhaW5zLm1hcChmdW5jdGlvbiAoaykge1xuICAgIHJldHVybiB7IHhwdWI6IGsueHB1YiB9O1xuICB9KTtcbiAgY29uc3Qgd2FsbGV0UGFyYW1zOiBhbnkgPSB7XG4gICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICBtOiBwYXJhbXMubSxcbiAgICBuOiBwYXJhbXMubixcbiAgICBrZXljaGFpbnM6IGtleWNoYWlucyxcbiAgfTtcblxuICBpZiAocGFyYW1zLmVudGVycHJpc2UpIHtcbiAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IHBhcmFtcy5lbnRlcnByaXNlO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSB7XG4gICAgd2FsbGV0UGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgPSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucztcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0JykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAoYm9keSkge1xuICAgICAgcmV0dXJuIG5ldyBXYWxsZXQoc2VsZi5iaXRnbywgYm9keSk7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldFxuLy8gU2hvcnRoYW5kIHRvIGdldFdhbGxldFxuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBpZDogdGhlIGlkIG9mIHRoZSB3YWxsZXRcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5nZXRXYWxsZXQocGFyYW1zLCBjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gcmVtb3ZlXG4vLyBSZW1vdmUgYW4gZXhpc3Rpbmcgd2FsbGV0LlxuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBpZDogdGhlIGlkIG9mIHRoZSB3YWxsZXRcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyBwYXJhbXMuaWQpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBXYWxsZXRzO1xuIl19
|
|
532
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS93YWxsZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQixzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsbURBTzhCO0FBQzlCLG1EQUE2QztBQUM3Qyw4REFBZ0Q7QUFDaEQsb0RBQXVCO0FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVuQyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUs7SUFDN0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixPQUFPO0FBQ1AsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2pELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUUxQixJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENB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SyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLE1BQU07QUFDTix5QkFBeUI7QUFDekIsc0JBQXNCO0FBQ3RCLDZCQUE2QjtBQUM3QixFQUFFO0FBQ0YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNoRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixTQUFTO0FBQ1QsNkJBQTZCO0FBQzdCLHNCQUFzQjtBQUN0Qiw2QkFBNkI7QUFDN0IsRUFBRTtBQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXBELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gV2FsbGV0cyBPYmplY3Rcbi8vIEJpdEdvIGFjY2Vzc29yIHRvIGEgdXNlcidzIHdhbGxldHMuXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cbmltcG9ydCB7XG4gIGNvbW1vbixcbiAgZ2V0QWRkcmVzc1AyUEtILFxuICBnZXROZXR3b3JrLFxuICBnZXRTaGFyZWRTZWNyZXQsXG4gIG1ha2VSYW5kb21LZXksXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5jb25zdCBXYWxsZXQgPSByZXF1aXJlKCcuL3dhbGxldCcpO1xuXG4vL1xuLy8gQ29uc3RydWN0b3Jcbi8vXG5jb25zdCBXYWxsZXRzID0gZnVuY3Rpb24gKGJpdGdvKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMuYml0Z28gPSBiaXRnbztcbn07XG5cbi8vXG4vLyBsaXN0XG4vLyBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0c1xuLy9cbldhbGxldHMucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggc2tpcCBhbmQgcHJldklkJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGlmIChwYXJhbXMuZ2V0YmFsYW5jZXMpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5nZXRiYWxhbmNlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnZXRiYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdnZXRiYWxhbmNlcz0nICsgcGFyYW1zLmdldGJhbGFuY2VzKTtcbiAgfVxuICBpZiAocGFyYW1zLnNraXApIHtcbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ3NraXA9JyArIHBhcmFtcy5za2lwKTtcbiAgfSBlbHNlIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgYXJncy5wdXNoKCdwcmV2SWQ9JyArIHBhcmFtcy5wcmV2SWQpO1xuICB9XG5cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldCcgKyBxdWVyeSkpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICBib2R5LndhbGxldHMgPSBib2R5LndhbGxldHMubWFwKGZ1bmN0aW9uICh3KSB7XG4gICAgICAgIHJldHVybiBuZXcgV2FsbGV0KHNlbGYuYml0Z28sIHcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYm9keTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXRzLnByb3RvdHlwZS5nZXRXYWxsZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBsZXQgcXVlcnkgPSAnJztcbiAgaWYgKHBhcmFtcy5ncGspIHtcbiAgICBxdWVyeSA9ICc/Z3BrPTEnO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkICsgcXVlcnkpKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAod2FsbGV0KSB7XG4gICAgICByZXR1cm4gbmV3IFdhbGxldChzZWxmLmJpdGdvLCB3YWxsZXQpO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBsaXN0SW52aXRlc1xuLy8gTGlzdCB0aGUgaW52aXRlcyBvbiBhIHVzZXJcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5saXN0SW52aXRlcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldGludml0ZScpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNhbmNlbEludml0ZVxuLy8gY2FuY2VsIGEgd2FsbGV0IGludml0ZSB0aGF0IGEgdXNlciBpbml0aWF0ZWRcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5jYW5jZWxJbnZpdGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0SW52aXRlSWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMuYml0Z28udXJsKCcvd2FsbGV0aW52aXRlLycgKyBwYXJhbXMud2FsbGV0SW52aXRlSWQpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGxpc3RTaGFyZXNcbi8vIExpc3QgdGhlIHVzZXIncyB3YWxsZXQgc2hhcmVzXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUubGlzdFNoYXJlcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlJykpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gcmVzZW5kU2hhcmVJbnZpdGVcbi8vIFJlc2VuZCB0aGUgaW52aXRhdGlvbiBlbWFpbCB3aGljaCBzaGFyZXMgYSB3YWxsZXQgd2l0aCBhbm90aGVyIHVzZXJcbi8vIFBhcmFtczpcbi8vICAgIHdhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGdldCBpbmZvcm1hdGlvbiBvblxuLy9cbldhbGxldHMucHJvdG90eXBlLnJlc2VuZFNoYXJlSW52aXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgICBjb25zdCB1cmxQYXJ0cyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkICsgJy9yZXNlbmRlbWFpbCc7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmUvJyArIHVybFBhcnRzKSkucmVzdWx0KCk7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0U2hhcmVcbi8vIEdldHMgYSB3YWxsZXQgc2hhcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4uIHJlcXVpcmVzIHVubG9jayBpZiBrZXljaGFpbiBpcyBwcmVzZW50LlxuLy8gUGFyYW1zOlxuLy8gICAgd2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gZ2V0IGluZm9ybWF0aW9uIG9uXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuZ2V0U2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVwZGF0ZVNoYXJlXG4vLyB1cGRhdGVzIGEgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbi8vICAgIHN0YXRlIC0gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd2FsbGV0IHNoYXJlXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUudXBkYXRlU2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNhbmNlbFNoYXJlXG4vLyBjYW5jZWxzIGEgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5jYW5jZWxTaGFyZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBhY2NlcHRTaGFyZVxuLy8gQWNjZXB0cyBhIHdhbGxldCBzaGFyZSwgYWRkaW5nIHRoZSB3YWxsZXQgdG8gdGhlIHVzZXIncyBsaXN0XG4vLyBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBhY2NlcHRcbi8vICAgIHVzZXJQYXNzd29yZCAtIChyZXF1aXJlZCBpZiBtb3JlIGEga2V5Y2hhaW4gd2FzIHNoYXJlZCkgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXRcbi8vICAgIG5ld1dhbGxldFBhc3NwaHJhc2UgLSBuZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHNhdmluZyB0aGUgc2hhcmVkIHdhbGxldCB4cHJ2LlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgIElmIGxlZnQgYmxhbmsgYW5kIGEgd2FsbGV0IHdpdGggbW9yZSB0aGFuIHZpZXcgcGVybWlzc2lvbnMgd2FzIHNoYXJlZCwgdGhlbiB0aGUgdXNlcnBhc3N3b3JkIGlzIHVzZWQuXG4vLyAgICBvdmVycmlkZUVuY3J5cHRlZFhwcnYgLSBzZXQgb25seSBpZiB0aGUgeHBydiB3YXMgcmVjZWl2ZWQgb3V0LW9mLWJhbmQuXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuYWNjZXB0U2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbJ292ZXJyaWRlRW5jcnlwdGVkWHBydiddLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBlbmNyeXB0ZWRYcHJ2ID0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkWHBydjtcblxuICByZXR1cm4gdGhpcy5nZXRTaGFyZSh7IHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHdhbGxldFNoYXJlKSB7XG4gICAgICAvLyBSZXR1cm4gcmlnaHQgYXdheSBpZiB0aGVyZSBpcyBubyBrZXljaGFpbiB0byBkZWNyeXB0LCBvciBpZiBleHBsaWNpdCBlbmNyeXB0ZWRYcHJ2IHdhcyBwcm92aWRlZFxuICAgICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbiB8fCAhd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB8fCBlbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgIHJldHVybiB3YWxsZXRTaGFyZTtcbiAgICAgIH1cblxuICAgICAgLy8gTW9yZSB0aGFuIHZpZXdpbmcgd2FzIHJlcXVlc3RlZCwgc28gd2UgbmVlZCB0byBwcm9jZXNzIHRoZSB3YWxsZXQga2V5cyB1c2luZyB0aGUgc2hhcmVkIGVjZGggc2NoZW1lXG4gICAgICBpZiAoIXBhcmFtcy51c2VyUGFzc3dvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuYml0Z28uZ2V0RUNESEtleWNoYWluKCkudGhlbihhc3luYyBmdW5jdGlvbiAoc2hhcmluZ0tleWNoYWluKSB7XG4gICAgICAgIGlmICghc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3cgd2UgaGF2ZSB0aGUgc2hhcmluZyBrZXljaGFpbiwgd2UgY2FuIHdvcmsgb3V0IHRoZSBzZWNyZXQgdXNlZCBmb3Igc2hhcmluZyB0aGUgd2FsbGV0IHdpdGggdXNcbiAgICAgICAgc2hhcmluZ0tleWNoYWluLnhwcnYgPSBhd2FpdCBzZWxmLmJpdGdvLmRlY3J5cHRBc3luYyh7XG4gICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZXJpdmUga2V5IGJ5IHBhdGggKHdoaWNoIGlzIHVzZWQgYmV0d2VlbiB0aGVzZSAyIHVzZXJzIG9ubHkpXG4gICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChcbiAgICAgICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi54cHJ2KS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aCh3YWxsZXRTaGFyZS5rZXljaGFpbi5wYXRoKSksXG4gICAgICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICAgIC8vIFllcyEgV2UgZ290IHRoZSBzZWNyZXQgc3VjY2Vzc2Z1bGx5IGhlcmUsIG5vdyBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0IHhwcnZcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0WHBydiA9IGF3YWl0IHNlbGYuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkO1xuICAgICAgICBlbmNyeXB0ZWRYcHJ2ID0gYXdhaXQgc2VsZi5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRYcHJ2LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDYXJyeSBvbiB0byB0aGUgbmV4dCBibG9jayB3aGVyZSB3ZSB3aWxsIHBvc3QgdGhlIGFjY2VwdGFuY2Ugb2YgdGhlIHNoYXJlIHdpdGggdGhlIGVuY3J5cHRlZCB4cHJ2XG4gICAgICAgIHJldHVybiB3YWxsZXRTaGFyZTtcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHdhbGxldFNoYXJlKSB7XG4gICAgICBjb25zdCB1cGRhdGVQYXJhbXM6IGFueSA9IHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgfTtcblxuICAgICAgaWYgKGVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgdXBkYXRlUGFyYW1zLmVuY3J5cHRlZFhwcnYgPSBlbmNyeXB0ZWRYcHJ2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVLZXlcbi8vIENyZWF0ZSBhIHNpbmdsZSBiaXRjb2luIGtleS4gIFRoaXMgcnVucyBsb2NhbGx5LlxuLy8gUmV0dXJuczoge1xuLy8gICBhZGRyZXNzOiA8YWRkcmVzcz5cbi8vICAga2V5OiA8a2V5LCBpbiBXSUYgZm9ybWF0PlxuLy8gfVxuV2FsbGV0cy5wcm90b3R5cGUuY3JlYXRlS2V5ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb25zdCBrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gIHJldHVybiB7XG4gICAgYWRkcmVzczogZ2V0QWRkcmVzc1AyUEtIKGtleSksXG4gICAga2V5OiBrZXkudG9XSUYoKSxcbiAgfTtcbn07XG5cbi8vXG4vLyBjcmVhdGVXYWxsZXRXaXRoS2V5Y2hhaW5zXG4vLyBDcmVhdGUgYSBuZXcgMi1vZi0zIHdhbGxldCBhbmQgaXQncyBhc3NvY2lhdGVkIGtleWNoYWlucy5cbi8vIFJldHVybnMgdGhlIGxvY2FsbHkgY3JlYXRlZCBrZXlzIHdpdGggdGhlaXIgZW5jcnlwdGVkIHhwcnZzLlxuLy8gKipXQVJOSU5HOiBCRSBTVVJFIFRPIEJBQ0tVUCEgTk9UIERPSU5HIFNPIENBTiBSRVNVTFQgSU4gTE9TUyBPRiBGVU5EUyEqKlxuLy9cbi8vIDEuIENyZWF0ZXMgdGhlIHVzZXIga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuLy8gMi4gSWYgbm8geHB1YiB3YXMgcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIGJhY2t1cCBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4vLyAzLiBVcGxvYWRzIHRoZSBlbmNyeXB0ZWQgdXNlciBhbmQgYmFja3VwIGtleWNoYWlucyB0byBCaXRHb1xuLy8gNC4gQ3JlYXRlcyB0aGUgQml0R28ga2V5IG9uIHRoZSBzZXJ2aWNlXG4vLyA1LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5cyBhYm92ZVxuLy9cbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgXCJwYXNzcGhyYXNlXCI6IHdhbGxldCBwYXNzcGhyYXNlIHRvIGVuY3J5cHQgdXNlciBhbmQgYmFja3VwIGtleXMgd2l0aFxuLy8gICBcImxhYmVsXCI6IHdhbGxldCBsYWJlbCwgaXMgc2hvd24gaW4gQml0R28gVUlcbi8vICAgXCJiYWNrdXBYcHViXCI6IGJhY2t1cCBrZXljaGFpbiB4cHViLCBpdCBpcyBISUdITFkgUkVDT01NRU5ERUQgeW91IGdlbmVyYXRlIHRoaXMgb24gYSBzZXBhcmF0ZSBtYWNoaW5lIVxuLy8gICAgICAgICAgICAgICAgIEJJVEdPIERPRVMgTk9UIEdVQVJBTlRFRSBTQUZFVFkgT0YgV0FMTEVUUyBXSVRIIE1VTFRJUExFIEtFWVMgQ1JFQVRFRCBPTiBUSEUgU0FNRSBNQUNISU5FICoqXG4vLyAgIFwiYmFja3VwWHB1YlByb3ZpZGVyXCI6IFByb3Zpc2lvbiBiYWNrdXAga2V5IGZyb20gdGhpcyBwcm92aWRlciAoS1JTKSwgZS5nLiBcImtleXRlcm5hbFwiLlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHZhbHVlIHdpbGwgY3JlYXRlIGFuIGluc3RhbnQtY2FwYWJsZSB3YWxsZXQuXG4vLyAgIFwicGFzc2NvZGVFbmNyeXB0aW9uQ29kZVwiOiB0aGUgY29kZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHdhbGxldCBwYXNzY29kZSB1c2VkIGluIHRoZSByZWNvdmVyeSBwcm9jZXNzXG4vLyBSZXR1cm5zOiB7XG4vLyAgIHdhbGxldDogbmV3bHkgY3JlYXRlZCB3YWxsZXQgbW9kZWwgb2JqZWN0XG4vLyAgIHVzZXJLZXljaGFpbjogdGhlIG5ld2x5IGNyZWF0ZWQgdXNlciBrZXljaGFpbiwgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJ2IHN0b3JlZCBvbiBCaXRHb1xuLy8gICBiYWNrdXBLZXljaGFpbjogdGhlIG5ld2x5IGNyZWF0ZWQgYmFja3VwIGtleWNoYWluXG4vL1xuLy8gKiogQkUgU1VSRSBUTyBCQUNLIFVQIFRIRSBFTkNSWVBURUQgVVNFUiBBTkQgQkFDS1VQIEtFWUNIQUlOUyEqKlxuLy9cbi8vIH1cbldhbGxldHMucHJvdG90eXBlLmNyZWF0ZVdhbGxldFdpdGhLZXljaGFpbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhcbiAgICBwYXJhbXMsXG4gICAgWydwYXNzcGhyYXNlJ10sXG4gICAgWydsYWJlbCcsICdiYWNrdXBYcHViJywgJ2VudGVycHJpc2UnLCAncGFzc2NvZGVFbmNyeXB0aW9uQ29kZSddLFxuICAgIGNhbGxiYWNrXG4gICk7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBjb25zdCBsYWJlbCA9IHBhcmFtcy5sYWJlbDtcblxuICAvLyBDcmVhdGUgdGhlIHVzZXIgYW5kIGJhY2t1cCBrZXkuXG4gIGNvbnN0IHVzZXJLZXljaGFpbiA9IHRoaXMuYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG5cbiAgY29uc3QgaGFzQmFja3VwWHB1YiA9ICEhcGFyYW1zLmJhY2t1cFhwdWI7XG4gIGNvbnN0IGhhc0JhY2t1cFhwdWJQcm92aWRlciA9ICEhcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcjtcbiAgaWYgKGhhc0JhY2t1cFhwdWIgJiYgaGFzQmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGJhY2t1cFhwdWIgb3IgYmFja3VwWHB1YlByb3ZpZGVyIGZsYWcnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgfVxuXG4gIGxldCBiYWNrdXBLZXljaGFpbjtcbiAgbGV0IGJpdGdvS2V5Y2hhaW47XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4gc2VsZi5iaXRnby5lbmNyeXB0QXN5bmMoeyBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UsIGlucHV0OiB1c2VyS2V5Y2hhaW4ueHBydiB9KSlcbiAgICAudGhlbihmdW5jdGlvbiAoZW5jcnlwdGVkWHBydikge1xuICAgICAgdXNlcktleWNoYWluLmVuY3J5cHRlZFhwcnYgPSBlbmNyeXB0ZWRYcHJ2O1xuXG4gICAgICBjb25zdCBrZXljaGFpbkRhdGE6IGFueSA9IHtcbiAgICAgICAgeHB1YjogdXNlcktleWNoYWluLnhwdWIsXG4gICAgICAgIGVuY3J5cHRlZFhwcnY6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgfTtcblxuICAgICAgaWYgKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSB7XG4gICAgICAgIGtleWNoYWluRGF0YS5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgPSBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuYml0Z28ua2V5Y2hhaW5zKCkuYWRkKGtleWNoYWluRGF0YSk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBBZGQgdGhlIGJhY2t1cCBrZXljaGFpblxuICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIpIHtcbiAgICAgICAgLy8gSWYgcmVxdWVzdGVkLCB1c2UgYSBLUlMgb3IgYmFja3VwIGtleSBwcm92aWRlclxuICAgICAgICByZXR1cm4gc2VsZi5iaXRnb1xuICAgICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAgIC5jcmVhdGVCYWNrdXAoe1xuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIsXG4gICAgICAgICAgICBkaXNhYmxlS1JTRW1haWw6IHBhcmFtcy5kaXNhYmxlS1JTRW1haWwsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgICAgICAgIGJhY2t1cEtleWNoYWluID0ga2V5Y2hhaW47XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuYmFja3VwWHB1Yikge1xuICAgICAgICAvLyB1c2VyIHByb3ZpZGVkIGJhY2t1cCB4cHViXG4gICAgICAgIGJhY2t1cEtleWNoYWluID0geyB4cHViOiBwYXJhbXMuYmFja3VwWHB1YiB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm8gcHJvdmlkZWQgeHB1Yiwgc28gZGVmYXVsdCB0byBjcmVhdGluZyBvbmUgaGVyZVxuICAgICAgICBiYWNrdXBLZXljaGFpbiA9IHNlbGYuYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmJpdGdvLmtleWNoYWlucygpLmFkZChiYWNrdXBLZXljaGFpbik7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2VsZi5iaXRnby5rZXljaGFpbnMoKS5jcmVhdGVCaXRHbygpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBiaXRnb0tleWNoYWluID0ga2V5Y2hhaW47XG4gICAgICBjb25zdCB3YWxsZXRQYXJhbXM6IGFueSA9IHtcbiAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICBtOiAyLFxuICAgICAgICBuOiAzLFxuICAgICAgICBrZXljaGFpbnM6IFt7IHhwdWI6IHVzZXJLZXljaGFpbi54cHViIH0sIHsgeHB1YjogYmFja3VwS2V5Y2hhaW4ueHB1YiB9LCB7IHhwdWI6IGJpdGdvS2V5Y2hhaW4ueHB1YiB9XSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwYXJhbXMuZW50ZXJwcmlzZSkge1xuICAgICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IHBhcmFtcy5lbnRlcnByaXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgPSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuYWRkKHdhbGxldFBhcmFtcyk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAobmV3V2FsbGV0KSB7XG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgd2FsbGV0OiBuZXdXYWxsZXQsXG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4sXG4gICAgICB9O1xuXG4gICAgICBpZiAoYmFja3VwS2V5Y2hhaW4ueHBydikge1xuICAgICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVGb3J3YXJkV2FsbGV0XG4vLyBDcmVhdGVzIGEgZm9yd2FyZCB3YWxsZXQgZnJvbSBhIHNpbmdsZSBwcml2YXRlIGtleS5cbi8vIEJpdEdvIHdpbGwgd2F0Y2ggdGhlIHdhbGxldCBhbmQgc2VuZCBhbnkgaW5jb21pbmcgdHJhbnNhY3Rpb25zIHRvIGEgZGVzdGluYXRpb24gbXVsdGktc2lnIHdhbGxldFxuLy8gV0FSTklORzogVEhFIFBSSVZBVEUgS0VZIFdJTEwgQkUgU0VOVCBUTyBCSVRHTy4gWU9VIE1VU1QgQ09OVEFDVCBCSVRHTyBCRUZPUkUgVVNJTkcgVEhJUyBGRUFUVVJFIVxuLy8gV0UgQ0FOTk9UIEdVQVJBTlRFRSBUSEUgU0VDVVJJVFkgT0YgU0lOR0xFLVNJRyBXQUxMRVRTIEFTIENVU1RPRFkgSVMgVU5DTEVBUi5cbi8vXG4vLyBQYXJhbXM6XG4vLyAgICBwcml2S2V5IC0gdGhlIHByaXZhdGUga2V5IG9uIGEgbGVnYWN5IHNpbmdsZS1zaWduYXR1cmUgd2FsbGV0IHRvIGJlIHdhdGNoZWQgKFdJRiBmb3JtYXQpXG4vLyAgICBzb3VyY2VBZGRyZXNzIC0gdGhlIGJpdGNvaW4gYWRkcmVzcyB0byBmb3J3YXJkIGZyb20gKGNvcnJlc3BvbmRzIHRvIHRoZSBwcml2YXRlIGtleSlcbi8vICAgIGRlc3RpbmF0aW9uV2FsbGV0IC0gdGhlIHdhbGxldCBvYmplY3QgdG8gc2VuZCB0aGUgZGVzdGluYXRpb24gY29pbnMgdG8gKHdoZW4gaW5jb21pbmcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZClcbi8vICAgIGxhYmVsIC0gbGFiZWwgZm9yIHRoZSB3YWxsZXRcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5jcmVhdGVGb3J3YXJkV2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3ByaXZLZXknLCAnc291cmNlQWRkcmVzcyddLCBbJ2xhYmVsJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmRlc3RpbmF0aW9uV2FsbGV0KSB8fCAhcGFyYW1zLmRlc3RpbmF0aW9uV2FsbGV0LmlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgZGVzdGluYXRpb25XYWxsZXQgb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBsZXQgbmV3RGVzdGluYXRpb25BZGRyZXNzO1xuICBsZXQgYWRkcmVzc0Zyb21Qcml2S2V5O1xuXG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMucHJpdktleSwgZ2V0TmV0d29yaygpIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29yayk7XG4gICAgYWRkcmVzc0Zyb21Qcml2S2V5ID0gZ2V0QWRkcmVzc1AyUEtIKGtleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBhIHZhbGlkIHByaXZLZXknKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzRnJvbVByaXZLZXkgIT09IHBhcmFtcy5zb3VyY2VBZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3ByaXZLZXkgZG9lcyBub3QgbWF0Y2ggc291cmNlIGFkZHJlc3MgLSBnb3QgJyArIGFkZHJlc3NGcm9tUHJpdktleSArICcgZXhwZWN0ZWQgJyArIHBhcmFtcy5zb3VyY2VBZGRyZXNzXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMuZGVzdGluYXRpb25XYWxsZXQuY3JlYXRlQWRkcmVzcygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIC8vIENyZWF0ZSBuZXcgYWRkcmVzcyBvbiB0aGUgZGVzdGluYXRpb24gd2FsbGV0IHRvIHJlY2VpdmUgY29pbnNcbiAgICBuZXdEZXN0aW5hdGlvbkFkZHJlc3MgPSByZXN1bHQuYWRkcmVzcztcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogYW55ID0ge1xuICAgICAgdHlwZTogJ2ZvcndhcmQnLFxuICAgICAgc291cmNlQWRkcmVzczogcGFyYW1zLnNvdXJjZUFkZHJlc3MsXG4gICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IG5ld0Rlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgIHByaXZLZXk6IHBhcmFtcy5wcml2S2V5LFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5lbnRlcnByaXNlKSB7XG4gICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IHBhcmFtcy5lbnRlcnByaXNlO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc2VsZi5iaXRnby5wb3N0KHNlbGYuYml0Z28udXJsKCcvd2FsbGV0JykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKSlcbiAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyB3YWxsZXQgKGFkdmFuY2VkIG1vZGUpLlxuICogVGhpcyBhbGxvd3MgeW91IHRvIG1hbnVhbGx5IHN1Ym1pdCB0aGUga2V5Y2hhaW5zLCB0eXBlLCBtIGFuZCBuIG9mIHRoZSB3YWxsZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBsYWJlbCBvZiB0aGUgd2FsbGV0IHRvIGJlIHNob3duIGluIFVJXG4gKiBAcGFyYW0ge251bWJlcn0gbSBudW1iZXIgb2Yga2V5cyByZXF1aXJlZCB0byB1bmxvY2sgd2FsbGV0ICgyKVxuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGtleXMgYXZhaWxhYmxlIG9uIHRoZSB3YWxsZXQgKDMpXG4gKiBAcGFyYW0ge2FycmF5fSBrZXljaGFpbnMgYXJyYXkgb2Yga2V5Y2hhaW4geHB1YnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnRlcnByaXNlIElEIG9mIHRoZSBlbnRlcnByaXNlIGVudGl0eSB0byBjcmVhdGUgdGhpcyB3YWxsZXQgdW5kZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgV2hlbiBzZXQgdG8gdHJ1ZSBkaXNhYmxlcyBub3RpZmljYXRpb25zIGZvciB0cmFuc2FjdGlvbnMgb24gdGhpcyB3YWxsZXQuXG4gKi9cbldhbGxldHMucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLmtleWNoYWlucykgPT09IGZhbHNlIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5tKSB8fCAhXy5pc051bWJlcihwYXJhbXMubikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIC8vIFRPRE86IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBtdWx0aXNpZ1xuICBpZiAocGFyYW1zLm0gIT09IDIgfHwgcGFyYW1zLm4gIT09IDMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG11bHRpLXNpZyB0eXBlJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgY29uc3Qga2V5Y2hhaW5zID0gcGFyYW1zLmtleWNoYWlucy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICByZXR1cm4geyB4cHViOiBrLnhwdWIgfTtcbiAgfSk7XG4gIGNvbnN0IHdhbGxldFBhcmFtczogYW55ID0ge1xuICAgIGxhYmVsOiBwYXJhbXMubGFiZWwsXG4gICAgbTogcGFyYW1zLm0sXG4gICAgbjogcGFyYW1zLm4sXG4gICAga2V5Y2hhaW5zOiBrZXljaGFpbnMsXG4gIH07XG5cbiAgaWYgKHBhcmFtcy5lbnRlcnByaXNlKSB7XG4gICAgd2FsbGV0UGFyYW1zLmVudGVycHJpc2UgPSBwYXJhbXMuZW50ZXJwcmlzZTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykge1xuICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHtcbiAgICAgIHJldHVybiBuZXcgV2FsbGV0KHNlbGYuYml0Z28sIGJvZHkpO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBnZXRcbi8vIFNob3J0aGFuZCB0byBnZXRXYWxsZXRcbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgaWQ6IHRoZSBpZCBvZiB0aGUgd2FsbGV0XG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMuZ2V0V2FsbGV0KHBhcmFtcywgY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHJlbW92ZVxuLy8gUmVtb3ZlIGFuIGV4aXN0aW5nIHdhbGxldC5cbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgaWQ6IHRoZSBpZCBvZiB0aGUgd2FsbGV0XG4vL1xuV2FsbGV0cy5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gV2FsbGV0cztcbiJdfQ==
|