@bitgo/sdk-coin-xrp 3.17.2 → 4.0.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.
@@ -83,7 +83,7 @@ const signWithPrivateKey = function (txHex, privateKey, options) {
83
83
  try {
84
84
  tx = JSON.parse(txHex);
85
85
  }
86
- catch (e) {
86
+ catch (e2) {
87
87
  throw new Error('txHex needs to be either hex or JSON string for XRP');
88
88
  }
89
89
  }
@@ -124,4 +124,4 @@ const signWithPrivateKey = function (txHex, privateKey, options) {
124
124
  };
125
125
  };
126
126
  module.exports = { ...xrpl, signWithPrivateKey };
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JpcHBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsZ0VBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixnREFBMEM7QUFDMUMsZ0VBQXFDO0FBRXJDLDZFQUE2RTtBQUM3RSx1RkFBdUY7QUFDdkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBRXBCOzs7Ozs7R0FNRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBZTtJQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsT0FBTyxJQUFJLHNCQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUM5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQzdELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUss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QUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuaW1wb3J0ICogYXMgcmlwcGxlS2V5cGFpcnMgZnJvbSAncmlwcGxlLWtleXBhaXJzJztcbmltcG9ydCAqIGFzIHhycGwgZnJvbSAneHJwbCc7XG5pbXBvcnQgeyBFQ1BhaXIgfSBmcm9tICdAYml0Z28vc2VjcDI1NmsxJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuLy8geHJwbCByZS1leHBvcnRzIHJpcHBsZS1iaW5hcnktY29kZWNAMi43LjAgd2hpY2ggc3VwcG9ydHMgTVBUb2tlbkF1dGhvcml6ZS5cbi8vIFRoZSBzdGFuZGFsb25lIHJpcHBsZS1iaW5hcnktY29kZWMgZGVwIGlzIDIuMS4wIChwcmUtTVBUKSwgc28gdXNlIHhycGwgYXMgdGhlIGNvZGVjLlxuY29uc3QgYmluYXJ5ID0geHJwbDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIFhSUCBhZGRyZXNzIHRvIGEgQmlnTnVtYmVyIGZvciBudW1lcmljIGNvbXBhcmlzb24uXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHNvcnRpbmcgb2Ygc2lnbmVycyBhcyByZXF1aXJlZCBieSB0aGUgWFJQIHByb3RvY29sLlxuICpcbiAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIFhSUCBhZGRyZXNzIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIEJpZ051bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICovXG5mdW5jdGlvbiBhZGRyZXNzVG9CaWdOdW1iZXIoYWRkcmVzczogc3RyaW5nKTogQmlnTnVtYmVyIHtcbiAgY29uc3QgaGV4ID0gQnVmZmVyLmZyb20oeHJwbC5kZWNvZGVBY2NvdW50SUQoYWRkcmVzcykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoaGV4LCAxNik7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTaWduYXR1cmUodHgsIHByaXZhdGVLZXksIHNpZ25Bcykge1xuICBjb25zdCBzaWduaW5nRGF0YSA9IHNpZ25BcyA/IGJpbmFyeS5lbmNvZGVGb3JNdWx0aVNpZ25pbmcodHgsIHNpZ25BcykgOiBiaW5hcnkuZW5jb2RlRm9yU2lnbmluZyh0eCk7XG4gIHJldHVybiByaXBwbGVLZXlwYWlycy5zaWduKHNpZ25pbmdEYXRhLCBwcml2YXRlS2V5KTtcbn1cblxuLyoqXG4gKiBTaWduIFJpcHBsZSB0cmFuc2FjdGlvbiB3aXRoIGEgc2VjcDI1NmsxIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gdHhIZXhcbiAqIEBwYXJhbSBwcml2YXRlS2V5XG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge3tzaWduZWRUcmFuc2FjdGlvbjogKiwgaWR9fVxuICovXG5jb25zdCBzaWduV2l0aFByaXZhdGVLZXkgPSBmdW5jdGlvbiAodHhIZXgsIHByaXZhdGVLZXksIG9wdGlvbnMpIHtcbiAgbGV0IHByaXZhdGVLZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG4gIGlmIChwcml2YXRlS2V5QnVmZmVyLmxlbmd0aCA9PT0gMzMgJiYgcHJpdmF0ZUtleUJ1ZmZlclswXSA9PT0gMCkge1xuICAgIHByaXZhdGVLZXlCdWZmZXIgPSBwcml2YXRlS2V5QnVmZmVyLnNsaWNlKDEsIDMzKTtcbiAgfVxuICBjb25zdCBwdWJsaWNLZXkgPSBFQ1BhaXIuZnJvbVByaXZhdGVLZXkocHJpdmF0ZUtleUJ1ZmZlcikucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKS50b1VwcGVyQ2FzZSgpO1xuXG4gIGxldCB0eDtcbiAgdHJ5IHtcbiAgICB0eCA9IGJpbmFyeS5kZWNvZGUodHhIZXgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHR4ID0gSlNPTi5wYXJzZSh0eEhleCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eEhleCBuZWVkcyB0byBiZSBlaXRoZXIgaGV4IG9yIEpTT04gc3RyaW5nIGZvciBYUlAnKTtcbiAgICB9XG4gIH1cblxuICB0eC5TaWduaW5nUHViS2V5ID0gb3B0aW9ucyAmJiBvcHRpb25zLnNpZ25BcyA/ICcnIDogcHVibGljS2V5O1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2lnbkFzKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRTaWduZXIgPSByaXBwbGVLZXlwYWlycy5kZXJpdmVBZGRyZXNzKHB1YmxpY0tleSk7XG4gICAgaWYgKG9wdGlvbnMuc2lnbkFzICE9PSBleHBlY3RlZFNpZ25lcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduQXMgZG9lcyBub3QgbWF0Y2ggcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVyID0ge1xuICAgICAgQWNjb3VudDogb3B0aW9ucy5zaWduQXMsXG4gICAgICBTaWduaW5nUHViS2V5OiBwdWJsaWNLZXksXG4gICAgICBUeG5TaWduYXR1cmU6IGNvbXB1dGVTaWduYXR1cmUodHgsIHByaXZhdGVLZXksIG9wdGlvbnMuc2lnbkFzKSxcbiAgICB9O1xuICAgIC8vIE9yZGVyaW5nIG9mIHByaXZhdGUga2V5IHNpZ25pbmcgbWF0dGVycywgb3IgdGhlIFJpcHBsZSBmdWxsbm9kZSB3aWxsIHRocm93IGFuICdVbnNvcnRlZCBTaWduZXJzIGFycmF5JyBlcnJvci5cbiAgICAvLyBYUlAgcmVxdWlyZXMgU2lnbmVycyBhcnJheSB0byBiZSBzb3J0ZWQgYmFzZWQgb24gbnVtZXJpYyB2YWx1ZSBvZiBzaWduZXIgYWRkcmVzc2VzIChsb3dlc3QgZmlyc3QpXG4gICAgaWYgKHR4LlNpZ25lcnMpIHtcbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBzaWduZXJcbiAgICAgIHR4LlNpZ25lcnMucHVzaCh7IFNpZ25lcjogc2lnbmVyIH0pO1xuXG4gICAgICAvLyBTb3J0IHRoZSBTaWduZXJzIGFycmF5IGJ5IG51bWVyaWMgdmFsdWUgb2YgQWNjb3VudCAoYWRkcmVzcykgdG8gZW5zdXJlIHByb3BlciBvcmRlcmluZ1xuICAgICAgdHguU2lnbmVycy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NCTjEgPSBhZGRyZXNzVG9CaWdOdW1iZXIoYS5TaWduZXIuQWNjb3VudCk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NCTjIgPSBhZGRyZXNzVG9CaWdOdW1iZXIoYi5TaWduZXIuQWNjb3VudCk7XG4gICAgICAgIHJldHVybiBhZGRyZXNzQk4xLmNvbXBhcmVkVG8oYWRkcmVzc0JOMik7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHguU2lnbmVycyA9IFt7IFNpZ25lcjogc2lnbmVyIH1dO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0eC5UeG5TaWduYXR1cmUgPSBjb21wdXRlU2lnbmF0dXJlKHR4LCBwcml2YXRlS2V5LCB1bmRlZmluZWQpO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZCA9IGJpbmFyeS5lbmNvZGUodHgpO1xuICByZXR1cm4ge1xuICAgIHNpZ25lZFRyYW5zYWN0aW9uOiBzZXJpYWxpemVkLFxuICAgIGlkOiB4cnBsLmhhc2hlcy5oYXNoU2lnbmVkVHgoc2VyaWFsaXplZCksXG4gIH07XG59O1xuXG5leHBvcnQgPSB7IC4uLnhycGwsIHNpZ25XaXRoUHJpdmF0ZUtleSB9O1xuIl19
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JpcHBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsZ0VBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixnREFBMEM7QUFDMUMsZ0VBQXFDO0FBRXJDLDZFQUE2RTtBQUM3RSx1RkFBdUY7QUFDdkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBRXBCOzs7Ozs7R0FNRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBZTtJQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsT0FBTyxJQUFJLHNCQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUM5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQzdELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUss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QUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuaW1wb3J0ICogYXMgcmlwcGxlS2V5cGFpcnMgZnJvbSAncmlwcGxlLWtleXBhaXJzJztcbmltcG9ydCAqIGFzIHhycGwgZnJvbSAneHJwbCc7XG5pbXBvcnQgeyBFQ1BhaXIgfSBmcm9tICdAYml0Z28vc2VjcDI1NmsxJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuLy8geHJwbCByZS1leHBvcnRzIHJpcHBsZS1iaW5hcnktY29kZWNAMi43LjAgd2hpY2ggc3VwcG9ydHMgTVBUb2tlbkF1dGhvcml6ZS5cbi8vIFRoZSBzdGFuZGFsb25lIHJpcHBsZS1iaW5hcnktY29kZWMgZGVwIGlzIDIuMS4wIChwcmUtTVBUKSwgc28gdXNlIHhycGwgYXMgdGhlIGNvZGVjLlxuY29uc3QgYmluYXJ5ID0geHJwbDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIFhSUCBhZGRyZXNzIHRvIGEgQmlnTnVtYmVyIGZvciBudW1lcmljIGNvbXBhcmlzb24uXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHNvcnRpbmcgb2Ygc2lnbmVycyBhcyByZXF1aXJlZCBieSB0aGUgWFJQIHByb3RvY29sLlxuICpcbiAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIFhSUCBhZGRyZXNzIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIEJpZ051bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICovXG5mdW5jdGlvbiBhZGRyZXNzVG9CaWdOdW1iZXIoYWRkcmVzczogc3RyaW5nKTogQmlnTnVtYmVyIHtcbiAgY29uc3QgaGV4ID0gQnVmZmVyLmZyb20oeHJwbC5kZWNvZGVBY2NvdW50SUQoYWRkcmVzcykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoaGV4LCAxNik7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTaWduYXR1cmUodHgsIHByaXZhdGVLZXksIHNpZ25Bcykge1xuICBjb25zdCBzaWduaW5nRGF0YSA9IHNpZ25BcyA/IGJpbmFyeS5lbmNvZGVGb3JNdWx0aVNpZ25pbmcodHgsIHNpZ25BcykgOiBiaW5hcnkuZW5jb2RlRm9yU2lnbmluZyh0eCk7XG4gIHJldHVybiByaXBwbGVLZXlwYWlycy5zaWduKHNpZ25pbmdEYXRhLCBwcml2YXRlS2V5KTtcbn1cblxuLyoqXG4gKiBTaWduIFJpcHBsZSB0cmFuc2FjdGlvbiB3aXRoIGEgc2VjcDI1NmsxIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gdHhIZXhcbiAqIEBwYXJhbSBwcml2YXRlS2V5XG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge3tzaWduZWRUcmFuc2FjdGlvbjogKiwgaWR9fVxuICovXG5jb25zdCBzaWduV2l0aFByaXZhdGVLZXkgPSBmdW5jdGlvbiAodHhIZXgsIHByaXZhdGVLZXksIG9wdGlvbnMpIHtcbiAgbGV0IHByaXZhdGVLZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG4gIGlmIChwcml2YXRlS2V5QnVmZmVyLmxlbmd0aCA9PT0gMzMgJiYgcHJpdmF0ZUtleUJ1ZmZlclswXSA9PT0gMCkge1xuICAgIHByaXZhdGVLZXlCdWZmZXIgPSBwcml2YXRlS2V5QnVmZmVyLnNsaWNlKDEsIDMzKTtcbiAgfVxuICBjb25zdCBwdWJsaWNLZXkgPSBFQ1BhaXIuZnJvbVByaXZhdGVLZXkocHJpdmF0ZUtleUJ1ZmZlcikucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKS50b1VwcGVyQ2FzZSgpO1xuXG4gIGxldCB0eDtcbiAgdHJ5IHtcbiAgICB0eCA9IGJpbmFyeS5kZWNvZGUodHhIZXgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHR4ID0gSlNPTi5wYXJzZSh0eEhleCk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbmVlZHMgdG8gYmUgZWl0aGVyIGhleCBvciBKU09OIHN0cmluZyBmb3IgWFJQJyk7XG4gICAgfVxuICB9XG5cbiAgdHguU2lnbmluZ1B1YktleSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zaWduQXMgPyAnJyA6IHB1YmxpY0tleTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNpZ25Bcykge1xuICAgIGNvbnN0IGV4cGVjdGVkU2lnbmVyID0gcmlwcGxlS2V5cGFpcnMuZGVyaXZlQWRkcmVzcyhwdWJsaWNLZXkpO1xuICAgIGlmIChvcHRpb25zLnNpZ25BcyAhPT0gZXhwZWN0ZWRTaWduZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbkFzIGRvZXMgbm90IG1hdGNoIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lciA9IHtcbiAgICAgIEFjY291bnQ6IG9wdGlvbnMuc2lnbkFzLFxuICAgICAgU2lnbmluZ1B1YktleTogcHVibGljS2V5LFxuICAgICAgVHhuU2lnbmF0dXJlOiBjb21wdXRlU2lnbmF0dXJlKHR4LCBwcml2YXRlS2V5LCBvcHRpb25zLnNpZ25BcyksXG4gICAgfTtcbiAgICAvLyBPcmRlcmluZyBvZiBwcml2YXRlIGtleSBzaWduaW5nIG1hdHRlcnMsIG9yIHRoZSBSaXBwbGUgZnVsbG5vZGUgd2lsbCB0aHJvdyBhbiAnVW5zb3J0ZWQgU2lnbmVycyBhcnJheScgZXJyb3IuXG4gICAgLy8gWFJQIHJlcXVpcmVzIFNpZ25lcnMgYXJyYXkgdG8gYmUgc29ydGVkIGJhc2VkIG9uIG51bWVyaWMgdmFsdWUgb2Ygc2lnbmVyIGFkZHJlc3NlcyAobG93ZXN0IGZpcnN0KVxuICAgIGlmICh0eC5TaWduZXJzKSB7XG4gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgc2lnbmVyXG4gICAgICB0eC5TaWduZXJzLnB1c2goeyBTaWduZXI6IHNpZ25lciB9KTtcblxuICAgICAgLy8gU29ydCB0aGUgU2lnbmVycyBhcnJheSBieSBudW1lcmljIHZhbHVlIG9mIEFjY291bnQgKGFkZHJlc3MpIHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmdcbiAgICAgIHR4LlNpZ25lcnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzQk4xID0gYWRkcmVzc1RvQmlnTnVtYmVyKGEuU2lnbmVyLkFjY291bnQpO1xuICAgICAgICBjb25zdCBhZGRyZXNzQk4yID0gYWRkcmVzc1RvQmlnTnVtYmVyKGIuU2lnbmVyLkFjY291bnQpO1xuICAgICAgICByZXR1cm4gYWRkcmVzc0JOMS5jb21wYXJlZFRvKGFkZHJlc3NCTjIpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4LlNpZ25lcnMgPSBbeyBTaWduZXI6IHNpZ25lciB9XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHguVHhuU2lnbmF0dXJlID0gY29tcHV0ZVNpZ25hdHVyZSh0eCwgcHJpdmF0ZUtleSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBiaW5hcnkuZW5jb2RlKHR4KTtcbiAgcmV0dXJuIHtcbiAgICBzaWduZWRUcmFuc2FjdGlvbjogc2VyaWFsaXplZCxcbiAgICBpZDogeHJwbC5oYXNoZXMuaGFzaFNpZ25lZFR4KHNlcmlhbGl6ZWQpLFxuICB9O1xufTtcblxuZXhwb3J0ID0geyAuLi54cnBsLCBzaWduV2l0aFByaXZhdGVLZXkgfTtcbiJdfQ==
package/dist/src/xrp.d.ts CHANGED
@@ -63,7 +63,7 @@ export declare class Xrp extends BaseCoin {
63
63
  */
64
64
  explainTransaction(params?: ExplainTransactionOptions): Promise<TransactionExplanation>;
65
65
  getTransactionTypeRawTxHex(txHex: string): XrpTransactionType | undefined;
66
- verifyTxType(txPrebuildDecoded: TransactionExplanation, txHexPrebuild: string | undefined): void;
66
+ verifyTxType(txPrebuildDecoded: TransactionExplanation, txHexPrebuild: string | undefined, isMpt?: boolean): void;
67
67
  verifyMptTxType(txPrebuildDecoded: TransactionExplanation, txHexPrebuild: string | undefined): void;
68
68
  verifyTokenName(txParams: TransactionParams, txPrebuildDecoded: TransactionExplanation, txHexPrebuild: string | undefined, coinConfig: XrpCoin): void;
69
69
  verifyActivationAddress(txParams: TransactionParams, txPrebuildDecoded: TransactionExplanation): void;
@@ -1 +1 @@
1
- {"version":3,"file":"xrp.d.ts","sourceRoot":"","sources":["../../src/xrp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xrp.d.ts","sourceRoot":"","sources":["../../src/xrp.ts"],"names":[],"mappings":"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"}
package/dist/src/xrp.js CHANGED
@@ -125,6 +125,7 @@ class Xrp extends sdk_core_1.BaseCoin {
125
125
  return {
126
126
  requiresTokenEnablement: true,
127
127
  supportsMultipleTokenEnablements: false,
128
+ getEnableTokenType: (tokenName) => statics_1.coins.has(tokenName) && statics_1.coins.get(tokenName) instanceof statics_1.XrpMptCoin ? 'enableMpt' : 'enabletoken',
128
129
  };
129
130
  }
130
131
  /**
@@ -202,7 +203,7 @@ class Xrp extends sdk_core_1.BaseCoin {
202
203
  transaction = JSON.parse(txHex);
203
204
  txHex = rippleBinaryCodec.encode(transaction);
204
205
  }
205
- catch (e) {
206
+ catch (e2) {
206
207
  throw new Error('txHex needs to be either hex or JSON string for XRP');
207
208
  }
208
209
  }
@@ -313,18 +314,23 @@ class Xrp extends sdk_core_1.BaseCoin {
313
314
  try {
314
315
  transaction = JSON.parse(txHex);
315
316
  }
316
- catch (e) {
317
+ catch (e2) {
317
318
  throw new Error('txHex needs to be either hex or JSON string for XRP');
318
319
  }
319
320
  }
320
321
  return transaction.TransactionType;
321
322
  }
322
- verifyTxType(txPrebuildDecoded, txHexPrebuild) {
323
+ verifyTxType(txPrebuildDecoded, txHexPrebuild, isMpt = false) {
323
324
  if (!txHexPrebuild)
324
325
  throw new Error('Missing txHexPrebuild to verify token type for enabletoken tx');
325
326
  const transactionType = this.getTransactionTypeRawTxHex(txHexPrebuild);
326
327
  if (transactionType === undefined)
327
328
  throw new Error('Missing TransactionType on token enablement tx');
329
+ if (isMpt) {
330
+ if (transactionType !== iface_1.XrpTransactionType.MPTokenAuthorize)
331
+ throw new Error(`tx type ${transactionType} does not match expected type MPTokenAuthorize`);
332
+ return;
333
+ }
328
334
  if (transactionType !== iface_1.XrpTransactionType.TrustSet)
329
335
  throw new Error(`tx type ${transactionType} does not match expected type TrustSet`);
330
336
  // decoded payload type could come as undefined or any of the enabletoken like types but never as something else like Send, etc
@@ -404,6 +410,12 @@ class Xrp extends sdk_core_1.BaseCoin {
404
410
  });
405
411
  // Explaining a tx strips out certain data, for extra measurement we're checking vs the explained tx
406
412
  // but also vs the tx pre explained.
413
+ if (txParams.type === 'enableMpt') {
414
+ if (verification?.verifyTokenEnablement) {
415
+ this.verifyTxType(explanation, txPrebuild.txHex, true);
416
+ }
417
+ return true;
418
+ }
407
419
  if (txParams.type === 'enabletoken' && verification?.verifyTokenEnablement) {
408
420
  this.verifyTxType(explanation, txPrebuild.txHex);
409
421
  this.verifyActivationAddress(txParams, explanation);
@@ -532,7 +544,7 @@ class Xrp extends sdk_core_1.BaseCoin {
532
544
  if (!this.isValidAddress(params.recoveryDestination)) {
533
545
  throw new Error('Invalid destination address!');
534
546
  }
535
- const keys = await (0, sdk_core_1.getBip32KeysAsync)(this.bitgo, params, { requireBitGoXpub: false });
547
+ const keys = await (0, sdk_core_1.getBip32Keys)(this.bitgo, params, { requireBitGoXpub: false });
536
548
  const { addressDetails, feeDetails, serverDetails, accountLines } = await (0, sdk_core_1.promiseProps)({
537
549
  addressDetails: this.bitgo.post(rippledUrl).send(accountInfoParams),
538
550
  feeDetails: this.bitgo.post(rippledUrl).send({ method: 'fee' }),
@@ -849,4 +861,4 @@ class Xrp extends sdk_core_1.BaseCoin {
849
861
  }
850
862
  }
851
863
  exports.Xrp = Xrp;
852
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3hycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLHlDQUEyQjtBQUUzQiw4Q0FrQnlCO0FBQ3pCLDRDQUE2RTtBQUM3RSxnRUFBa0Q7QUFDbEQsMkNBQTZCO0FBRTdCLDZFQUE2RTtBQUM3RSx1RkFBdUY7QUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFL0IsK0JBQStHO0FBQy9HLHVDQVlxQjtBQUNyQiwyQ0FBc0Q7QUFDdEQsd0RBQWdDO0FBQ2hDLHNEQUE4QjtBQUU5QixNQUFhLEdBQUksU0FBUSxtQkFBUTtJQUUvQixZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNiLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztR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QWdDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNkLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxNQUErQjtRQUMvQyxNQUFNLElBQUksb0NBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUE1NUJELGtCQTQ1QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5cbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBjaGVja0tyc1Byb3ZpZGVyLFxuICBnZXRCaXAzMktleXNBc3luYyxcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgS2V5UGFpcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIHByb21pc2VQcm9wcyxcbiAgVG9rZW5FbmFibGVtZW50Q29uZmlnLFxuICBUcmFuc2FjdGlvblBhcmFtcyxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgWHJwQ29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCAqIGFzIHJpcHBsZUtleXBhaXJzIGZyb20gJ3JpcHBsZS1rZXlwYWlycyc7XG5pbXBvcnQgKiBhcyB4cnBsIGZyb20gJ3hycGwnO1xuXG4vLyB4cnBsIHJlLWV4cG9ydHMgcmlwcGxlLWJpbmFyeS1jb2RlY0AyLjcuMCB3aGljaCBzdXBwb3J0cyBNUFRva2VuQXV0aG9yaXplLlxuLy8gVGhlIHN0YW5kYWxvbmUgcmlwcGxlLWJpbmFyeS1jb2RlYyBkZXAgaXMgMi4xLjAgKHByZS1NUFQpLCBzbyB1c2UgeHJwbCBhcyB0aGUgY29kZWMuXG5jb25zdCByaXBwbGVCaW5hcnlDb2RlYyA9IHhycGw7XG5cbmltcG9ydCB7IEFjY291bnREZWxldGVCdWlsZGVyLCBUb2tlblRyYW5zZmVyQnVpbGRlciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRmVlSW5mbyxcbiAgSGFsZlNpZ25lZFRyYW5zYWN0aW9uLFxuICBSZWNvdmVyeUluZm8sXG4gIFJlY292ZXJ5T3B0aW9ucyxcbiAgUmVjb3ZlcnlUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFhycFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBYcnBLZXlQYWlyIH0gZnJvbSAnLi9saWIva2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHJpcHBsZSBmcm9tICcuL3JpcHBsZSc7XG5cbmV4cG9ydCBjbGFzcyBYcnAgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFhycChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvciBiZXR3ZWVuIHRoZSBjb2luJ3MgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKi9cbiAgcHVibGljIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoZSBibG9ja2NoYWluIHdoaWNoIHN1cHBvcnRzIHRoaXMgY29pblxuICAgKi9cbiAgcHVibGljIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhlIGNvaW4gZmFtaWx5XG4gICAqL1xuICBwdWJsaWMgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoaXMgY29pblxuICAgKi9cbiAgcHVibGljIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyB3aGV0aGVyIGFuIGFkZHJlc3Mgc3RyaW5nIGlzIHZhbGlkIGZvciB0aGlzIGNvaW5cbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZlZSBpbmZvIGZyb20gc2VydmVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RmVlSW5mbygpOiBQcm9taXNlPEZlZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wdWJsaWMvZmVlaW5mbycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTogVG9rZW5FbmFibGVtZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eFByZWJ1aWxkXG4gICAqIC0gcHJ2XG4gICAqIEByZXR1cm5zIEJsdWViaXJkPEhhbGZTaWduZWRUcmFuc2FjdGlvbj5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduVHJhbnNhY3Rpb24oe1xuICAgIHR4UHJlYnVpbGQsXG4gICAgcHJ2LFxuICAgIGlzTGFzdFNpZ25hdHVyZSxcbiAgfTogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8SGFsZlNpZ25lZFRyYW5zYWN0aW9uIHwgUmVjb3ZlcnlUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpIHx8ICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodHhQcmVidWlsZCkgJiYgIV8uaXNPYmplY3QodHhQcmVidWlsZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgdHlwZSAke3R5cGVvZiB0eFByZWJ1aWxkfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJ2KSB8fCAhXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocHJ2KSAmJiAhXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcHJ2IG11c3QgYmUgYSBzdHJpbmcsIGdvdCB0eXBlICR7dHlwZW9mIHBydn1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkYCk7XG4gICAgfVxuICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgWHJwS2V5UGFpcih7IHBydiB9KTtcbiAgICBjb25zdCBhZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IChrZXlQYWlyLmdldFByaXZhdGVLZXkoKSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHR4ID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleSh0eFByZWJ1aWxkLnR4SGV4LCBwcml2YXRlS2V5LCB7XG4gICAgICBzaWduQXM6IGFkZHJlc3MsXG4gICAgfSk7XG5cbiAgICAvLyBOb3JtYWxseSB0aGUgU0RLIHByb3ZpZGVzIHRoZSBmaXJzdCBzaWduYXR1cmUgZm9yIGFuIFhSUCB0eCwgYnV0IG9jY2FzaW9uYWxseSBpdCBwcm92aWRlcyB0aGUgZmluYWwgb25lIGFzIHdlbGxcbiAgICAvLyAocmVjb3ZlcmllcylcbiAgICBpZiAoaXNMYXN0U2lnbmF0dXJlKSB7XG4gICAgICByZXR1cm4geyB0eEhleDogdHguc2lnbmVkVHJhbnNhY3Rpb24gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaGFsZlNpZ25lZDogeyB0eEhleDogdHguc2lnbmVkVHJhbnNhY3Rpb24gfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJpcHBsZSByZXF1aXJlcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHdhbGxldCBnZW5lcmF0aW9uIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmVcbiAgICogdGhlIHJvb3QgcHVibGljIGtleSwgd2hpY2ggaXMgdGhlIGJhc2lzIG9mIHRoZSByb290IGFkZHJlc3MsIHR3byBzaWduZWQsIGFuZCBvbmUgaGFsZi1zaWduZWQgaW5pdGlhbGl6YXRpb24gdHhzXG4gICAqIEBwYXJhbSB3YWxsZXRQYXJhbXNcbiAgICogLSByb290UHJpdmF0ZUtleTogb3B0aW9uYWwgaGV4LWVuY29kZWQgUmlwcGxlIHByaXZhdGUga2V5XG4gICAqL1xuICBhc3luYyBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQoXG4gICAgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zXG4gICk6IFByb21pc2U8U3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucz4ge1xuICAgIGlmICh3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkpIHtcbiAgICAgIGlmICh3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkubGVuZ3RoICE9PSA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jvb3RQcml2YXRlS2V5IG5lZWRzIHRvIGJlIGEgaGV4YWRlY2ltYWwgcHJpdmF0ZSBrZXkgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgWHJwS2V5UGFpcigpLmdldEtleXMoKTtcbiAgICAgIGlmICgha2V5UGFpci5wcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwcml2YXRlS2V5Jyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBrZXlQYWlyLnBydjtcbiAgICB9XG4gICAgcmV0dXJuIHdhbGxldFBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluL3BhcnNlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGxldCB0cmFuc2FjdGlvbjtcbiAgICBsZXQgdHhIZXg6IHN0cmluZyA9IHBhcmFtcy50eEhleCB8fCAoKHBhcmFtcy5oYWxmU2lnbmVkICYmIHBhcmFtcy5oYWxmU2lnbmVkLnR4SGV4KSBhcyBzdHJpbmcpO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB0eEhleCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSByaXBwbGVCaW5hcnlDb2RlYy5kZWNvZGUodHhIZXgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRyYW5zYWN0aW9uID0gSlNPTi5wYXJzZSh0eEhleCk7XG4gICAgICAgIHR4SGV4ID0gcmlwcGxlQmluYXJ5Q29kZWMuZW5jb2RlKHRyYW5zYWN0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eEhleCBuZWVkcyB0byBiZSBlaXRoZXIgaGV4IG9yIEpTT04gc3RyaW5nIGZvciBYUlAnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgLy8gaGFzaGVzIGlkcyBhcmUgZGlmZmVyZW50IGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIHR4XG4gICAgLy8gZmlyc3Qgd2UgdHJ5IHRvIGdldCB0aGUgaGFzaCBpZCBhcyBpZiBpdCBpcyBzaWduZWQsIHdpbGwgdGhyb3cgaWYgaXRzIG5vdFxuICAgIHRyeSB7XG4gICAgICBpZCA9IHhycGwuaGFzaGVzLmhhc2hTaWduZWRUeCh0eEhleCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWQgPSB4cnBsLmhhc2hlcy5oYXNoVHgodHhIZXgpO1xuICAgIH1cblxuICAgIGlmICh0cmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUgPT09ICdBY2NvdW50U2V0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICdhY2NvdW50U2V0J10sXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiB0cmFuc2FjdGlvbi5GZWUsXG4gICAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpemU6IHR4SGV4Lmxlbmd0aCAvIDIsXG4gICAgICAgIH0sXG4gICAgICAgIGFjY291bnRTZXQ6IHtcbiAgICAgICAgICBtZXNzYWdlS2V5OiB0cmFuc2FjdGlvbi5NZXNzYWdlS2V5LFxuICAgICAgICAgIHNldEZsYWc6IHRyYW5zYWN0aW9uLlNldEZsYWcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlID09PSAnVHJ1c3RTZXQnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ2FjY291bnQnLFxuICAgICAgICAgICdsaW1pdEFtb3VudCcsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiB0cmFuc2FjdGlvbi5GZWUsXG4gICAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpemU6IHR4SGV4Lmxlbmd0aCAvIDIsXG4gICAgICAgIH0sXG4gICAgICAgIGFjY291bnQ6IHRyYW5zYWN0aW9uLkFjY291bnQsXG4gICAgICAgIGxpbWl0QW1vdW50OiB7XG4gICAgICAgICAgY3VycmVuY3k6IHRyYW5zYWN0aW9uLkxpbWl0QW1vdW50LmN1cnJlbmN5LFxuICAgICAgICAgIGlzc3VlcjogdHJhbnNhY3Rpb24uTGltaXRBbW91bnQuaXNzdWVyLFxuICAgICAgICAgIHZhbHVlOiB0cmFuc2FjdGlvbi5MaW1pdEFtb3VudC52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0cmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUgPT09ICdNUFRva2VuQXV0aG9yaXplJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICdtcHRJc3N1YW5jZUlkJ10sXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiB0cmFuc2FjdGlvbi5GZWUsXG4gICAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpemU6IHR4SGV4Lmxlbmd0aCAvIDIsXG4gICAgICAgIH0sXG4gICAgICAgIG1wdElzc3VhbmNlSWQ6IHRyYW5zYWN0aW9uLk1QVG9rZW5Jc3N1YW5jZUlELFxuICAgICAgICAuLi4odHJhbnNhY3Rpb24uTVBUSG9sZGVyICE9PSB1bmRlZmluZWQgJiYgeyBtcHRIb2xkZXI6IHRyYW5zYWN0aW9uLk1QVEhvbGRlciB9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzcyA9XG4gICAgICB0cmFuc2FjdGlvbi5EZXN0aW5hdGlvbiArICh0cmFuc2FjdGlvbi5EZXN0aW5hdGlvblRhZyA+PSAwID8gJz9kdD0nICsgdHJhbnNhY3Rpb24uRGVzdGluYXRpb25UYWcgOiAnJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnXSxcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0QW1vdW50OiB0cmFuc2FjdGlvbi5BbW91bnQsXG4gICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdHJhbnNhY3Rpb24uQW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IHRyYW5zYWN0aW9uLkZlZSxcbiAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiB0eEhleC5sZW5ndGggLyAyLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlUmF3VHhIZXgodHhIZXg6IHN0cmluZyk6IFhycFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHRyYW5zYWN0aW9uO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB0eEhleCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSByaXBwbGVCaW5hcnlDb2RlYy5kZWNvZGUodHhIZXgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRyYW5zYWN0aW9uID0gSlNPTi5wYXJzZSh0eEhleCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbmVlZHMgdG8gYmUgZWl0aGVyIGhleCBvciBKU09OIHN0cmluZyBmb3IgWFJQJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgdHhIZXhQcmVidWlsZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0eEhleFByZWJ1aWxkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdHhIZXhQcmVidWlsZCB0byB2ZXJpZnkgdG9rZW4gdHlwZSBmb3IgZW5hYmxldG9rZW4gdHgnKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZVJhd1R4SGV4KHR4SGV4UHJlYnVpbGQpO1xuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIFRyYW5zYWN0aW9uVHlwZSBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG4gICAgaWYgKHRyYW5zYWN0aW9uVHlwZSAhPT0gWHJwVHJhbnNhY3Rpb25UeXBlLlRydXN0U2V0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eCB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIFRydXN0U2V0YCk7XG4gICAgLy8gZGVjb2RlZCBwYXlsb2FkIHR5cGUgY291bGQgY29tZSBhcyB1bmRlZmluZWQgb3IgYW55IG9mIHRoZSBlbmFibGV0b2tlbiBsaWtlIHR5cGVzIGJ1dCBuZXZlciBhcyBzb21ldGhpbmcgZWxzZSBsaWtlIFNlbmQsIGV0Y1xuICAgIGNvbnN0IGFjdHVhbFR5cGVGcm9tRGVjb2RlZCA9XG4gICAgICAndHlwZScgaW4gdHhQcmVidWlsZERlY29kZWQgJiYgdHlwZW9mIHR4UHJlYnVpbGREZWNvZGVkLnR5cGUgPT09ICdzdHJpbmcnID8gdHhQcmVidWlsZERlY29kZWQudHlwZSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICAhYWN0dWFsVHlwZUZyb21EZWNvZGVkIHx8XG4gICAgICBhY3R1YWxUeXBlRnJvbURlY29kZWQgPT09ICdlbmFibGV0b2tlbicgfHxcbiAgICAgIGFjdHVhbFR5cGVGcm9tRGVjb2RlZCA9PT0gJ0Fzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbidcbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHR4IHR5cGUgJHthY3R1YWxUeXBlRnJvbURlY29kZWR9IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlIGVuYWJsZXRva2VuYCk7XG4gIH1cblxuICB2ZXJpZnlNcHRUeFR5cGUodHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIHR4SGV4UHJlYnVpbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghdHhIZXhQcmVidWlsZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHR4SGV4UHJlYnVpbGQgdG8gdmVyaWZ5IHRva2VuIHR5cGUgZm9yIGVuYWJsZU1wdCB0eCcpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uVHlwZSA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlUmF3VHhIZXgodHhIZXhQcmVidWlsZCk7XG4gICAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgVHJhbnNhY3Rpb25UeXBlIG9uIE1QVCBlbmFibGVtZW50IHR4Jyk7XG4gICAgaWYgKHRyYW5zYWN0aW9uVHlwZSAhPT0gWHJwVHJhbnNhY3Rpb25UeXBlLk1QVG9rZW5BdXRob3JpemUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR4IHR5cGUgJHt0cmFuc2FjdGlvblR5cGV9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgTVBUb2tlbkF1dGhvcml6ZWApO1xuICAgIGNvbnN0IGFjdHVhbFR5cGVGcm9tRGVjb2RlZCA9XG4gICAgICAndHlwZScgaW4gdHhQcmVidWlsZERlY29kZWQgJiYgdHlwZW9mIHR4UHJlYnVpbGREZWNvZGVkLnR5cGUgPT09ICdzdHJpbmcnID8gdHhQcmVidWlsZERlY29kZWQudHlwZSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFjdHVhbFR5cGVGcm9tRGVjb2RlZCB8fCBhY3R1YWxUeXBlRnJvbURlY29kZWQgPT09ICdlbmFibGVNcHQnKSByZXR1cm47XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0eCB0eXBlICR7YWN0dWFsVHlwZUZyb21EZWNvZGVkfSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZSBlbmFibGVNcHRgKTtcbiAgfVxuXG4gIHZlcmlmeVRva2VuTmFtZShcbiAgICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgdHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gICAgdHhIZXhQcmVidWlsZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvaW5Db25maWc6IFhycENvaW5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0eEhleFByZWJ1aWxkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdHhIZXhQcmVidWlsZCBwYXJhbSByZXF1aXJlZCBmb3IgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICBpZiAoIXR4UGFyYW1zLnJlY2lwaWVudHMgfHwgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVjaXBpZW50cyBwYXJhbSBmb3IgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICBjb25zdCBmdWxsVG9rZW5OYW1lID0gdHhQYXJhbXMucmVjaXBpZW50c1swXS50b2tlbk5hbWU7XG4gICAgaWYgKGZ1bGxUb2tlbk5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW0gdG9rZW5OYW1lIGlzIHJlcXVpcmVkIGZvciB0b2tlbiBlbmFibGVtZW50LiBSZWNpcGllbnQgbXVzdCBpbmNsdWRlIGEgdG9rZW4gbmFtZS4nKTtcblxuICAgIGlmICghKCdsaW1pdEFtb3VudCcgaW4gdHhQcmVidWlsZERlY29kZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgbGltaXRBbW91bnQgcGFyYW0gZm9yIHRva2VuIGVuYWJsZW1lbnQuJyk7XG5cbiAgICAvLyB3ZSBjaGVjayBjdXJyZW5jeSBvbiBib3RoIHRoZSB0eEhleCBidXQgYWxzbyB0aGUgZXhwbGFpbmVkIHBheWxvYWRcbiAgICBjb25zdCBleHBlY3RlZEN1cnJlbmN5ID0gdXRpbHMuZ2V0WHJwQ3VycmVuY3lGcm9tVG9rZW5OYW1lKGZ1bGxUb2tlbk5hbWUpLmN1cnJlbmN5O1xuICAgIGlmIChjb2luQ29uZmlnLmlzVG9rZW4gJiYgZXhwZWN0ZWRDdXJyZW5jeSAhPT0gdHhQcmVidWlsZERlY29kZWQubGltaXRBbW91bnQuY3VycmVuY3kpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdG9rZW4gaXNzdWVyIG9yIGN1cnJlbmN5IG9uIHRva2VuIGVuYWJsZW1lbnQgdHgnKTtcbiAgfVxuXG4gIHZlcmlmeUFjdGl2YXRpb25BZGRyZXNzKHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcywgdHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiB2b2lkIHtcbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyA9PT0gdW5kZWZpbmVkIHx8IHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlY2lwaWVudHMgcGFyYW0gZm9yIHRva2VuIGVuYWJsZW1lbnQuJyk7XG5cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMuZ2V0Q2hhaW4oKX0gZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcgdG8gbW9yZSB0aGFuIDEgZGVzdGluYXRpb24gYWRkcmVzcyB3aXRoaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uIFRyeSBhZ2FpbiwgdXNpbmcgb25seSBhIHNpbmdsZSByZWNpcGllbnQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEoJ2FjY291bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSkgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGFjY291bnQgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuXG4gICAgY29uc3QgYWN0aXZhdGlvbkFkZHJlc3MgPSB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3QgYWNjb3VudEFkZHJlc3MgPSB0eFByZWJ1aWxkRGVjb2RlZC5hY2NvdW50O1xuICAgIGlmIChhY3RpdmF0aW9uQWRkcmVzcyAhPT0gYWNjb3VudEFkZHJlc3MpIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIHdpdGggYWN0aXZhdGlvbiBhZGRyZXNzLlwiKTtcbiAgfVxuXG4gIHZlcmlmeVRva2VuSXNzdWVyKHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcywgdHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiB2b2lkIHtcbiAgICBpZiAodHhQcmVidWlsZERlY29kZWQgPT09IHVuZGVmaW5lZCB8fCAhKCdsaW1pdEFtb3VudCcgaW4gdHhQcmVidWlsZERlY29kZWQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHRva2VuIGlzc3VlciBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG4gICAgY29uc3QgeyBpc3N1ZXIsIGN1cnJlbmN5IH0gPSB0eFByZWJ1aWxkRGVjb2RlZC5saW1pdEFtb3VudDtcbiAgICBpZiAoIXV0aWxzLmdldFhycFRva2VuKGlzc3VlciwgY3VycmVuY3kpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuIGlzc3VlciBvciBjdXJyZW5jeSBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG4gIH1cblxuICB2ZXJpZnlSZXF1aXJlZEtleXModHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zLCB0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICEoJ2FjY291bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSB8fFxuICAgICAgISgnbGltaXRBbW91bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSB8fFxuICAgICAgIXR4UHJlYnVpbGREZWNvZGVkLmxpbWl0QW1vdW50LmN1cnJlbmN5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGxhbmF0aW9uIGlzIG1pc3NpbmcgcmVxdWlyZWQga2V5cyAoYWNjb3VudCBvciBsaW1pdEFtb3VudCB3aXRoIGN1cnJlbmN5KScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsIGludGVudGlvblxuICAgKiBAcGFyYW0gdHhQYXJhbXMgcGFyYW1zIG9iamVjdCBwYXNzZWQgdG8gc2VuZFxuICAgKiBAcGFyYW0gdHhQcmVidWlsZCBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgc2VydmVyXG4gICAqIEBwYXJhbSB3YWxsZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgdmVyaWZpY2F0aW9uIH06IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSBhcyBYcnBDb2luO1xuICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgfSk7XG5cbiAgICAvLyBFeHBsYWluaW5nIGEgdHggc3RyaXBzIG91dCBjZXJ0YWluIGRhdGEsIGZvciBleHRyYSBtZWFzdXJlbWVudCB3ZSdyZSBjaGVja2luZyB2cyB0aGUgZXhwbGFpbmVkIHR4XG4gICAgLy8gYnV0IGFsc28gdnMgdGhlIHR4IHByZSBleHBsYWluZWQuXG4gICAgaWYgKHR4UGFyYW1zLnR5cGUgPT09ICdlbmFibGV0b2tlbicgJiYgdmVyaWZpY2F0aW9uPy52ZXJpZnlUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRoaXMudmVyaWZ5VHhUeXBlKGV4cGxhbmF0aW9uLCB0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICAgIHRoaXMudmVyaWZ5QWN0aXZhdGlvbkFkZHJlc3ModHhQYXJhbXMsIGV4cGxhbmF0aW9uKTtcbiAgICAgIHRoaXMudmVyaWZ5VG9rZW5Jc3N1ZXIodHhQYXJhbXMsIGV4cGxhbmF0aW9uKTtcbiAgICAgIHRoaXMudmVyaWZ5VG9rZW5OYW1lKHR4UGFyYW1zLCBleHBsYW5hdGlvbiwgdHhQcmVidWlsZC50eEhleCwgY29pbkNvbmZpZyk7XG4gICAgICB0aGlzLnZlcmlmeVJlcXVpcmVkS2V5cyh0eFBhcmFtcywgZXhwbGFuYXRpb24pO1xuICAgIH1cblxuICAgIGlmICh0eFBhcmFtcy50eXBlID09PSAnZW5hYmxlTXB0Jykge1xuICAgICAgaWYgKHZlcmlmaWNhdGlvbj8udmVyaWZ5VG9rZW5FbmFibGVtZW50KSB7XG4gICAgICAgIHRoaXMudmVyaWZ5TXB0VHhUeXBlKGV4cGxhbmF0aW9uLCB0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICAgIH1cbiAgICAgIC8vIE1QVG9rZW5BdXRob3JpemUgdHJhbnNhY3Rpb25zIGhhdmUgbm8gZGVzdGluYXRpb24gb3IgYW1vdW50O1xuICAgICAgLy8gdGhlIG91dHB1dCBjb21wYXJhdG9yIGJlbG93IGRvZXMgbm90IGFwcGx5LlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gWy4uLmV4cGxhbmF0aW9uLm91dHB1dHMsIC4uLmV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHNdWzBdO1xuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gdHhQYXJhbXMucmVjaXBpZW50cyAmJiB0eFBhcmFtcy5yZWNpcGllbnRzWzBdO1xuXG4gICAgY29uc3QgY29tcGFyYXRvciA9IChyZWNpcGllbnQxLCByZWNpcGllbnQyKSA9PiB7XG4gICAgICBpZiAodXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocmVjaXBpZW50MS5hZGRyZXNzKS5hZGRyZXNzICE9PSB1dGlscy5nZXRBZGRyZXNzRGV0YWlscyhyZWNpcGllbnQyLmFkZHJlc3MpLmFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50MSA9IG5ldyBCaWdOdW1iZXIocmVjaXBpZW50MS5hbW91bnQpO1xuICAgICAgY29uc3QgYW1vdW50MiA9IG5ldyBCaWdOdW1iZXIocmVjaXBpZW50Mi5hbW91bnQpO1xuICAgICAgcmV0dXJuIGFtb3VudDEudG9GaXhlZCgpID09PSBhbW91bnQyLnRvRml4ZWQoKTtcbiAgICB9O1xuXG4gICAgaWYgKFxuICAgICAgKHR4UGFyYW1zLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eFBhcmFtcy50eXBlID09PSAncGF5bWVudCcpICYmXG4gICAgICB0eXBlb2Ygb3V0cHV0LmFtb3VudCAhPT0gJ29iamVjdCcgJiZcbiAgICAgICFjb21wYXJhdG9yKG91dHB1dCwgZXhwZWN0ZWRPdXRwdXQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIG91dHB1dCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgYSB2YWxpZCBYUlAgYWRkcmVzcywgYW5kIHRoZW4gbWFrZSBzdXJlIHRoZSByb290IGFkZHJlc3NlcyBtYXRjaC5cbiAgICogVGhpcyBwcmV2ZW50cyBhdHRhY2tzIHdoZXJlIGFuIGF0dGFjayBtYXkgc3dpdGNoIG91dCB0aGUgbmV3IGFkZHJlc3MgZm9yIG9uZSBvZiB0aGVpciBvd25cbiAgICogQHBhcmFtIGFkZHJlc3Mge1N0cmluZ30gdGhlIGFkZHJlc3MgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSByb290QWRkcmVzcyB7U3RyaW5nfSB0aGUgd2FsbGV0J3Mgcm9vdCBhZGRyZXNzXG4gICAqIEByZXR1cm4gdHJ1ZSBpZmYgYWRkcmVzcyBpcyBhIHdhbGxldCBhZGRyZXNzIChiYXNlZCBvbiByb290QWRkcmVzcylcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc1dhbGxldEFkZHJlc3MoeyBhZGRyZXNzLCByb290QWRkcmVzcyB9OiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIGZhaWx1cmU6IGFkZHJlc3MgXCIke2FkZHJlc3N9XCIgaXMgbm90IHZhbGlkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudEluZm9QYXJhbXMgPSB7XG4gICAgICBtZXRob2Q6ICdhY2NvdW50X2luZm8nLFxuICAgICAgcGFyYW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiBhZGRyZXNzLFxuICAgICAgICAgIGxlZGdlcl9pbmRleDogJ2N1cnJlbnQnLFxuICAgICAgICAgIHF1ZXVlOiB0cnVlLFxuICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICBzaWduZXJfbGlzdHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCBhY2NvdW50SW5mbyA9IChhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5nZXRSaXBwbGVkVXJsKCkpLnNlbmQoYWNjb3VudEluZm9QYXJhbXMpKS5ib2R5O1xuXG4gICAgaWYgKGFjY291bnRJbmZvPy5yZXN1bHQ/LmFjY291bnRfZGF0YT8uRmxhZ3MgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFjY291bnQgaW5mb3JtYXRpb246IEZsYWdzIGZpZWxkIGlzIG1pc3NpbmcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxhZ3MgPSB4cnBsLnBhcnNlQWNjb3VudFJvb3RGbGFncyhhY2NvdW50SW5mby5yZXN1bHQuYWNjb3VudF9kYXRhLkZsYWdzKTtcblxuICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gdXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcyk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3NEZXRhaWxzID0gdXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocm9vdEFkZHJlc3MpO1xuXG4gICAgaWYgKGZsYWdzLmxzZlJlcXVpcmVEZXN0VGFnICYmIGFkZHJlc3NEZXRhaWxzLmRlc3RpbmF0aW9uVGFnID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBJbnZhbGlkIEFkZHJlc3M6IERlc3RpbmF0aW9uIFRhZyBpcyByZXF1aXJlZCBmb3IgYWRkcmVzcyBcIiR7YWRkcmVzc31cIi5gKTtcbiAgICB9XG5cbiAgICBpZiAoYWRkcmVzc0RldGFpbHMuYWRkcmVzcyAhPT0gcm9vdEFkZHJlc3NEZXRhaWxzLmFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICR7YWRkcmVzc0RldGFpbHMuYWRkcmVzc30gdnMuICR7cm9vdEFkZHJlc3NEZXRhaWxzLmFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVUkwgb2YgYSB3ZWxsLWtub3duLCBwdWJsaWMgZmFjaW5nIChub24tYml0Z28pIHJpcHBsZWQgaW5zdGFuY2Ugd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHJlY292ZXJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0UmlwcGxlZFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnaHR0cHM6Ly9zMS5yaXBwbGUuY29tOjUxMjM0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSByb290QWRkcmVzczogcm9vdCBYUlAgd2FsbGV0IGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyBmcm9tXG4gICAqIC0gdXNlcktleTogW2VuY3J5cHRlZF0geHBydlxuICAgKiAtIGJhY2t1cEtleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YiBpZiB0aGUgeHBydiBpcyBoZWxkIGJ5IGEgS1JTIHByb3ZpZGVyXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZTogbmVjZXNzYXJ5IGlmIG9uZSBvZiB0aGUgeHBydnMgaXMgZW5jcnlwdGVkXG4gICAqIC0gYml0Z29LZXk6IHhwdWJcbiAgICogLSBrcnNQcm92aWRlcjogbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAgICogLSByZWNvdmVyeURlc3RpbmF0aW9uOiB0YXJnZXQgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IFJlY292ZXJ5VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCByaXBwbGVkVXJsID0gdGhpcy5nZXRSaXBwbGVkVXJsKCk7XG4gICAgY29uc3QgaXNLcnNSZWNvdmVyeSA9IHBhcmFtcy5iYWNrdXBLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJyk7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gcGFyYW1zLmJhY2t1cEtleS5zdGFydHNXaXRoKCd4cHViJykgJiYgcGFyYW1zLnVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpO1xuXG4gICAgLy8gU3RyaXAgYW55ID9kdD08dGFnPiBxdWVyeSBzdHJpbmcgZnJvbSB0aGUgcm9vdCBhZGRyZXNzIGJlZm9yZSBzZW5kaW5nIHRvIHRoZSBYUlBMIFJQQy5cbiAgICAvLyBCaXRHbyBlbmNvZGVzIGRlc3RpbmF0aW9uIHRhZ3MgYXMgYHJYWFhYP2R0PU5gIGluIGl0cyBVSS9BUEksIGJ1dCB0aGUgcmlwcGxlZCBKU09OLVJQQ1xuICAgIC8vIG9ubHkgYWNjZXB0cyB0aGUgYmFyZSByLWFkZHJlc3MuXG4gICAgY29uc3Qgcm9vdEFkZHJlc3NEZXRhaWxzID0gdXJsLnBhcnNlKHBhcmFtcy5yb290QWRkcmVzcyk7XG4gICAgY29uc3Qgcm9vdEFjY291bnQgPSByb290QWRkcmVzc0RldGFpbHMucGF0aG5hbWUgYXMgc3RyaW5nO1xuXG4gICAgY29uc3QgYWNjb3VudEluZm9QYXJhbXMgPSB7XG4gICAgICBtZXRob2Q6ICdhY2NvdW50X2luZm8nLFxuICAgICAgcGFyYW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiByb290QWNjb3VudCxcbiAgICAgICAgICBsZWRnZXJfaW5kZXg6ICdjdXJyZW50JyxcbiAgICAgICAgICBxdWV1ZTogdHJ1ZSxcbiAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgc2lnbmVyX2xpc3RzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWNjb3VudExpbmVzUGFyYW1zID0ge1xuICAgICAgbWV0aG9kOiAnYWNjb3VudF9saW5lcycsXG4gICAgICBwYXJhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHJvb3RBY2NvdW50LFxuICAgICAgICAgIGxlZGdlcl9pbmRleDogJ3ZhbGlkYXRlZCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICAvLyBGb3IgQWNjb3VudERlbGV0ZSAocmVzZXJ2ZVdpdGhkcmF3YWwpIHRoZSBLUlMgcHJvdmlkZXIgY29pbi1mYW1pbHkgY2hlY2sgaXMgc2tpcHBlZCBiZWNhdXNlOlxuICAgIC8vIDEuIEFjY291bnREZWxldGUgaXMgYW4gZW1lcmdlbmN5IHJlY292ZXJ5OyBLUlMgY29pbi1mYW1pbHkgbGlzdHMgYXJlIGlycmVsZXZhbnQgaGVyZS5cbiAgICAvLyAyLiBUaGUgc2lnbmluZyBwYXRoIGluc2lkZSB0aGUgcmVzZXJ2ZVdpdGhkcmF3YWwgYmxvY2sgYWxyZWFkeSBoYW5kbGVzIGlzS3JzUmVjb3ZlcnkgY29ycmVjdGx5XG4gICAgLy8gICAgKHVzZXIgc2lnbnMsIGJhY2t1cCBzaWduYXR1cmUgY29tZXMgZnJvbSBLUlMgb3IgaXMgb21pdHRlZCBmb3IgYW4gdW5zaWduZWQgc3dlZXApLlxuICAgIGlmIChpc0tyc1JlY292ZXJ5ICYmICFwYXJhbXMucmVzZXJ2ZVdpdGhkcmF3YWwpIHtcbiAgICAgIGNoZWNrS3JzUHJvdmlkZXIodGhpcywgcGFyYW1zLmtyc1Byb3ZpZGVyKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzIScpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBnZXRCaXAzMktleXNBc3luYyh0aGlzLmJpdGdvLCBwYXJhbXMsIHsgcmVxdWlyZUJpdEdvWHB1YjogZmFsc2UgfSk7XG5cbiAgICBjb25zdCB7IGFkZHJlc3NEZXRhaWxzLCBmZWVEZXRhaWxzLCBzZXJ2ZXJEZXRhaWxzLCBhY2NvdW50TGluZXMgfSA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICBhZGRyZXNzRGV0YWlsczogdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoYWNjb3VudEluZm9QYXJhbXMpLFxuICAgICAgZmVlRGV0YWlsczogdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoeyBtZXRob2Q6ICdmZWUnIH0pLFxuICAgICAgc2VydmVyRGV0YWlsczogdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoeyBtZXRob2Q6ICdzZXJ2ZXJfaW5mbycgfSksXG4gICAgICBhY2NvdW50TGluZXM6IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKGFjY291bnRMaW5lc1BhcmFtcyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcGVuTGVkZ2VyRmVlID0gbmV3IEJpZ051bWJlcihmZWVEZXRhaWxzLmJvZHkucmVzdWx0LmRyb3BzLm9wZW5fbGVkZ2VyX2ZlZSk7XG4gICAgY29uc3QgYmFzZVJlc2VydmUgPSBuZXcgQmlnTnVtYmVyKHNlcnZlckRldGFpbHMuYm9keS5yZXN1bHQuaW5mby52YWxpZGF0ZWRfbGVkZ2VyLnJlc2VydmVfYmFzZV94cnApLnRpbWVzKFxuICAgICAgdGhpcy5nZXRCYXNlRmFjdG9yKClcbiAgICApO1xuICAgIGNvbnN0IHJlc2VydmVEZWx0YSA9IG5ldyBCaWdOdW1iZXIoc2VydmVyRGV0YWlscy5ib2R5LnJlc3VsdC5pbmZvLnZhbGlkYXRlZF9sZWRnZXIucmVzZXJ2ZV9pbmNfeHJwKS50aW1lcyhcbiAgICAgIHRoaXMuZ2V0QmFzZUZhY3RvcigpXG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50TGVkZ2VyID0gc2VydmVyRGV0YWlscy5ib2R5LnJlc3VsdC5pbmZvLnZhbGlkYXRlZF9sZWRnZXIuc2VxO1xuICAgIGNvbnN0IHNlcXVlbmNlSWQgPSBhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuU2VxdWVuY2U7XG4gICAgY29uc3QgYmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIoYWRkcmVzc0RldGFpbHMuYm9keS5yZXN1bHQuYWNjb3VudF9kYXRhLkJhbGFuY2UpO1xuICAgIGNvbnN0IHNpZ25lckxpc3RzID0gYWRkcmVzc0RldGFpbHMuYm9keS5yZXN1bHQuYWNjb3VudF9kYXRhLnNpZ25lcl9saXN0cztcbiAgICBjb25zdCBhY2NvdW50RmxhZ3MgPSBhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuRmxhZ3M7XG4gICAgY29uc3Qgb3duZXJDb3VudCA9IG5ldyBCaWdOdW1iZXIoYWRkcmVzc0RldGFpbHMuYm9keS5yZXN1bHQuYWNjb3VudF9kYXRhLk93bmVyQ291bnQpO1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lIHNpZ25lciBsaXN0IHNldFxuICAgIGlmIChzaWduZXJMaXN0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBzZXQgb2Ygc2lnbmVyIGxpc3RzJyk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBzaWduZXJzIGFyZSB1c2VyLCBiYWNrdXAsIGJpdGdvXG4gICAgY29uc3QgdXNlckFkZHJlc3MgPSByaXBwbGVLZXlwYWlycy5kZXJpdmVBZGRyZXNzKGtleXNbMF0ucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgYmFja3VwQWRkcmVzcyA9IHJpcHBsZUtleXBhaXJzLmRlcml2ZUFkZHJlc3Moa2V5c1sxXS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpKTtcblxuICAgIGNvbnN0IHNpZ25lckxpc3QgPSBzaWduZXJMaXN0c1swXTtcbiAgICBpZiAoc2lnbmVyTGlzdC5TaWduZXJRdW9ydW0gIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5pbXVtIHNpZ25hdHVyZSBjb3VudCcpO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEFkZHJlc3NlcyA9IHt9O1xuXG4gICAgY29uc3Qgc2lnbmVyRW50cmllcyA9IHNpZ25lckxpc3QuU2lnbmVyRW50cmllcztcbiAgICBpZiAoc2lnbmVyRW50cmllcy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduZXIgbGlzdCBsZW5ndGgnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IFNpZ25lckVudHJ5IH0gb2Ygc2lnbmVyRW50cmllcykge1xuICAgICAgY29uc3Qgd2VpZ2h0ID0gU2lnbmVyRW50cnkuU2lnbmVyV2VpZ2h0O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IFNpZ25lckVudHJ5LkFjY291bnQ7XG4gICAgICBpZiAod2VpZ2h0ICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduZXIgd2VpZ2h0Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGl0J3MgYSBkdXBlIG9mIGFuIGFkZHJlc3Mgd2UgYWxyZWFkeSBrbm93LCBibG9ja1xuICAgICAgaWYgKGZvdW5kQWRkcmVzc2VzW2FkZHJlc3NdID49IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXBsaWNhdGUgc2lnbmVyIGFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICAgIGZvdW5kQWRkcmVzc2VzW2FkZHJlc3NdID0gKGZvdW5kQWRkcmVzc2VzW2FkZHJlc3NdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICBpZiAoZm91bmRBZGRyZXNzZXNbdXNlckFkZHJlc3NdICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgaW5jaWRlbmNlIGZyZXF1ZW5jeSBvZiB1c2VyIHNpZ25lciBhZGRyZXNzJyk7XG4gICAgfVxuICAgIGlmIChmb3VuZEFkZHJlc3Nlc1tiYWNrdXBBZGRyZXNzXSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGluY2lkZW5jZSBmcmVxdWVuY3kgb2YgdXNlciBzaWduZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmxhZ3MgZGlzYWJsZSB0aGUgbWFzdGVyIGtleSBhbmQgZW5mb3JjZSBkZXN0aW5hdGlvbiB0YWdzXG4gICAgY29uc3QgVVNFUl9LRVlfU0VUVElOR19GTEFHID0gNjU1MzY7XG4gICAgY29uc3QgTUFTVEVSX0tFWV9ERUFDVElWQVRJT05fRkxBRyA9IDEwNDg1NzY7XG4gICAgY29uc3QgUkVRVUlSRV9ERVNUSU5BVElPTl9UQUdfRkxBRyA9IDEzMTA3MjtcbiAgICBpZiAoKGFjY291bnRGbGFncyAmIFVTRVJfS0VZX1NFVFRJTkdfRkxBRykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYSBjdXN0b20gdXNlciBrZXkgaGFzIGJlZW4gc2V0Jyk7XG4gICAgfVxuICAgIGlmICgoYWNjb3VudEZsYWdzICYgTUFTVEVSX0tFWV9ERUFDVElWQVRJT05fRkxBRykgIT09IE1BU1RFUl9LRVlfREVBQ1RJVkFUSU9OX0ZMQUcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIG1hc3RlciBrZXkgaGFzIG5vdCBiZWVuIGRlYWN0aXZhdGVkJyk7XG4gICAgfVxuICAgIGlmICgoYWNjb3VudEZsYWdzICYgUkVRVUlSRV9ERVNUSU5BVElPTl9UQUdfRkxBRykgIT09IFJFUVVJUkVfREVTVElOQVRJT05fVEFHX0ZMQUcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIGRlc3RpbmF0aW9uIGZsYWcgcmVxdWlyZW1lbnQgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCcpO1xuICAgIH1cblxuICAgIC8vIHJlY292ZXIgdGhlIGZ1bmRzXG4gICAgY29uc3QgdG90YWxSZXNlcnZlRGVsdGEgPSByZXNlcnZlRGVsdGEudGltZXMob3duZXJDb3VudCk7XG4gICAgY29uc3QgcmVzZXJ2ZSA9IGJhc2VSZXNlcnZlLnBsdXModG90YWxSZXNlcnZlRGVsdGEpO1xuICAgIGNvbnN0IHJlY292ZXJhYmxlQmFsYW5jZSA9IGJhbGFuY2UubWludXMocmVzZXJ2ZSk7XG5cbiAgICBjb25zdCByYXdEZXN0aW5hdGlvbiA9IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uRGV0YWlscyA9IHVybC5wYXJzZShyYXdEZXN0aW5hdGlvbik7XG5cbiAgICBpZiAoZGVzdGluYXRpb25EZXRhaWxzLnF1ZXJ5KSB7XG4gICAgICBjb25zdCBxdWVyeURldGFpbHMgPSBxdWVyeXN0cmluZy5wYXJzZShkZXN0aW5hdGlvbkRldGFpbHMucXVlcnkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocXVlcnlEZXRhaWxzLmR0KSkge1xuICAgICAgICAvLyBpZiBxdWVyeURldGFpbHMuZHQgaXMgYW4gYXJyYXksIHRoYXQgbWVhbnMgZHQgd2FzIGdpdmVuIG11bHRpcGxlIHRpbWVzLCB3aGljaCBpcyBub3QgdmFsaWRcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoXG4gICAgICAgICAgYGRlc3RpbmF0aW9uIHRhZyBjYW4gYXBwZWFyIGF0IG1vc3Qgb25jZSwgYnV0ICR7cXVlcnlEZXRhaWxzLmR0Lmxlbmd0aH0gZGVzdGluYXRpb24gdGFncyB3ZXJlIGZvdW5kYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWNvdmVyYWJsZUJhbGFuY2UudG9OdW1iZXIoKSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBRdWFudGl0eSBvZiBYUlAgdG8gcmVjb3ZlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLiBDdXJyZW50IGJhbGFuY2U6ICR7YmFsYW5jZS50b051bWJlcigpfSwgYmxvY2tjaGFpbiByZXNlcnZlOiAke3Jlc2VydmUudG9OdW1iZXIoKX0sIHNwZW5kYWJsZSBiYWxhbmNlOiAke3JlY292ZXJhYmxlQmFsYW5jZS50b051bWJlcigpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNzdWVyID0gcGFyYW1zPy5pc3N1ZXJBZGRyZXNzO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcGFyYW1zPy5jdXJyZW5jeUNvZGU7XG4gICAgaWYgKCEhaXNzdWVyICYmICEhY3VycmVuY3kpIHtcbiAgICAgIGNvbnN0IHRva2VuUGFyYW1zID0ge1xuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgcmVjb3ZlcmFibGVCYWxhbmNlLFxuICAgICAgICBjdXJyZW50TGVkZ2VyLFxuICAgICAgICBvcGVuTGVkZ2VyRmVlLFxuICAgICAgICBzZXF1ZW5jZUlkLFxuICAgICAgICBhY2NvdW50TGluZXMsXG4gICAgICAgIGtleXMsXG4gICAgICAgIGlzS3JzUmVjb3ZlcnksXG4gICAgICAgIGlzVW5zaWduZWRTd2VlcCxcbiAgICAgICAgdXNlckFkZHJlc3MsXG4gICAgICAgIGJhY2t1cEFkZHJlc3MsXG4gICAgICAgIGlzc3VlcixcbiAgICAgICAgY3VycmVuY3ksXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5yZWNvdmVyWHJwVG9rZW4ocGFyYW1zLCB0b2tlblBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcblxuICAgIC8vIC0tLSBBY2NvdW50RGVsZXRlIHBhdGg6IHdpdGhkcmF3IGZ1bGwgYmFsYW5jZSBpbmNsdWRpbmcgdGhlIGJhc2UgcmVzZXJ2ZSAtLS1cbiAgICBpZiAocGFyYW1zLnJlc2VydmVXaXRoZHJhd2FsKSB7XG4gICAgICAvLyAxLiBObyB0cnVzdGxpbmVzIHdpdGggbm9uLXplcm8gYmFsYW5jZXMgbWF5IGV4aXN0LlxuICAgICAgY29uc3QgbGluZXM6IEFycmF5PHsgY3VycmVuY3k6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBiYWxhbmNlOiBzdHJpbmcgfT4gPSBhY2NvdW50TGluZXMuYm9keS5yZXN1bHQubGluZXMgPz8gW107XG4gICAgICBjb25zdCBub25aZXJvTGluZXMgPSBsaW5lcy5maWx0ZXIoKGwpID0+IHBhcnNlRmxvYXQobC5iYWxhbmNlKSAhPT0gMCk7XG4gICAgICBpZiAobm9uWmVyb0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBY2NvdW50IGhhcyAke25vblplcm9MaW5lcy5sZW5ndGh9IHRydXN0bGluZShzKSB3aXRoIG5vbi16ZXJvIGJhbGFuY2VzLiBgICtcbiAgICAgICAgICAgICdDbGVhciBhbGwgdG9rZW4gdHJ1c3RsaW5lcyBiZWZvcmUgdXNpbmcgcmVzZXJ2ZSB3aXRoZHJhd2FsLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gTm8gb3duZWQgb2JqZWN0cyBvdGhlciB0aGFuIFNpZ25lckxpc3QgZW50cmllcy5cbiAgICAgIGNvbnN0IGFjY291bnRPYmplY3RzUGFyYW1zID0ge1xuICAgICAgICBtZXRob2Q6ICdhY2NvdW50X29iamVjdHMnLFxuICAgICAgICBwYXJhbXM6IFt7IGFjY291bnQ6IHJvb3RBY2NvdW50LCBsZWRnZXJfaW5kZXg6ICd2YWxpZGF0ZWQnIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFjY291bnRPYmplY3RzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZChhY2NvdW50T2JqZWN0c1BhcmFtcyk7XG4gICAgICBjb25zdCBvd25lZE9iamVjdHM6IEFycmF5PHsgTGVkZ2VyRW50cnlUeXBlOiBzdHJpbmcgfT4gPSBhY2NvdW50T2JqZWN0c1Jlc3BvbnNlLmJvZHkucmVzdWx0LmFjY291bnRfb2JqZWN0cyA/PyBbXTtcbiAgICAgIGNvbnN0IGJsb2NraW5nT2JqZWN0cyA9IG93bmVkT2JqZWN0cy5maWx0ZXIoKG8pID0+IG8uTGVkZ2VyRW50cnlUeXBlICE9PSAnU2lnbmVyTGlzdCcpO1xuICAgICAgaWYgKGJsb2NraW5nT2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gWy4uLm5ldyBTZXQoYmxvY2tpbmdPYmplY3RzLm1hcCgobykgPT4gby5MZWRnZXJFbnRyeVR5cGUpKV0uam9pbignLCAnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBY2NvdW50IG93bnMgb2JqZWN0cyB0aGF0IG11c3QgYmUgcmVtb3ZlZCBiZWZvcmUgYWNjb3VudCBkZWxldGlvbjogJHt0eXBlc30uIGAgK1xuICAgICAgICAgICAgJ1BsZWFzZSByZXNvbHZlIHRoZXNlIG9iamVjdHMgdXNpbmcgdGhlIHN0YW5kYXJkIHJlY292ZXJ5IGZsb3cgZmlyc3QuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBTZXF1ZW5jZSArIDI1NiBtdXN0IGJlIDw9IGN1cnJlbnQgdmFsaWRhdGVkIGxlZGdlci5cbiAgICAgIGlmIChzZXF1ZW5jZUlkICsgMjU2ID4gY3VycmVudExlZGdlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFjY291bnQgaXMgdG9vIG5ldyBmb3IgQWNjb3VudERlbGV0ZTogU2VxdWVuY2UoJHtzZXF1ZW5jZUlkfSkgKyAyNTYgPiBjdXJyZW50TGVkZ2VyKCR7Y3VycmVudExlZGdlcn0pLiBgICtcbiAgICAgICAgICAgIGBXYWl0IGF0IGxlYXN0ICR7c2VxdWVuY2VJZCArIDI1NiAtIGN1cnJlbnRMZWRnZXJ9IG1vcmUgbGVkZ2VyKHMpLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gRGVzdGluYXRpb24gbXVzdCBiZSBhIGZ1bmRlZCwgZXhpc3RpbmcgWFJQTCBhY2NvdW50LlxuICAgICAgLy8gU3RyaXAgYW55ID9kdD08dGFnPiBzdWZmaXgg4oCUIHRoZSBYUlBMIFJQQyBvbmx5IGFjY2VwdHMgdGhlIGJhcmUgci1hZGRyZXNzLlxuICAgICAgY29uc3QgZGVzdEFjY291bnQgPSB1cmwucGFyc2UocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pLnBhdGhuYW1lIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGRlc3RJbmZvUGFyYW1zID0ge1xuICAgICAgICBtZXRob2Q6ICdhY2NvdW50X2luZm8nLFxuICAgICAgICBwYXJhbXM6IFt7IGFjY291bnQ6IGRlc3RBY2NvdW50LCBsZWRnZXJfaW5kZXg6ICd2YWxpZGF0ZWQnLCBzdHJpY3Q6IHRydWUgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZGVzdEluZm8gPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZChkZXN0SW5mb1BhcmFtcyk7XG4gICAgICBpZiAoZGVzdEluZm8uYm9keS5yZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBSZWNvdmVyeSBkZXN0aW5hdGlvbiBcIiR7ZGVzdEFjY291bnR9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGxlZGdlci4gYCArXG4gICAgICAgICAgICAnQWNjb3VudERlbGV0ZSByZXF1aXJlcyBhIGZ1bmRlZCBkZXN0aW5hdGlvbiBhY2NvdW50LidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWNjb3VudERlbGV0ZSBmZWUgbXVzdCBiZSA+PSBvd25lci1yZXNlcnZlIGluY3JlbWVudCAocmVzZXJ2ZURlbHRhLCBjdXJyZW50bHkgMiBYUlApLlxuICAgICAgLy8gV2UgdXNlIHJlc2VydmVEZWx0YSBkaXJlY3RseSAobm90IG9wZW5MZWRnZXJGZWUgw5cgMykgcGVyIFhSUEwgcHJvdG9jb2wuXG4gICAgICBjb25zdCBhY2NvdW50RGVsZXRlRmVlID0gcmVzZXJ2ZURlbHRhO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEFjY291bnREZWxldGVCdWlsZGVyKCkgYXMgQWNjb3VudERlbGV0ZUJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRvKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIGFzIHN0cmluZylcbiAgICAgICAgLnNlbmRlcihyb290QWNjb3VudClcbiAgICAgICAgLmZsYWdzKDIxNDc0ODM2NDgpXG4gICAgICAgIC5sYXN0TGVkZ2VyU2VxdWVuY2UoY3VycmVudExlZGdlciArIDEwMDAwMDApXG4gICAgICAgIC5mZWUoYWNjb3VudERlbGV0ZUZlZS50b0ZpeGVkKDApKVxuICAgICAgICAuc2VxdWVuY2Uoc2VxdWVuY2VJZCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB7IHR4SGV4OiBzZXJpYWxpemVkVHgsIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWtleXNbMF0ucHJpdmF0ZUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJLZXkgPSBrZXlzWzBdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgdXNlclNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCB1c2VyS2V5LCB7IHNpZ25BczogdXNlckFkZHJlc3MgfSk7XG5cbiAgICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbjogc3RyaW5nO1xuICAgICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSB1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFrZXlzWzFdLnByaXZhdGVLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhY2t1cEtleSBpcyBub3QgYSBwcml2YXRlIGtleScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhY2t1cEtleSA9IGtleXNbMV0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIGNvbnN0IGJhY2t1cFNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCBiYWNrdXBLZXksIHsgc2lnbkFzOiBiYWNrdXBBZGRyZXNzIH0pO1xuICAgICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHJpcHBsZS5tdWx0aXNpZ24oW3VzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb24sIGJhY2t1cFNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbl0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2NvdW50RGVsZXRlRXhwbGFuYXRpb246IFJlY292ZXJ5SW5mbyA9IChhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiBzaWduZWRUcmFuc2FjdGlvbixcbiAgICAgIH0pKSBhcyBSZWNvdmVyeUluZm87XG4gICAgICBhY2NvdW50RGVsZXRlRXhwbGFuYXRpb24udHhIZXggPSBzaWduZWRUcmFuc2FjdGlvbjtcbiAgICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICAgIGFjY291bnREZWxldGVFeHBsYW5hdGlvbi5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgICAgICBhY2NvdW50RGVsZXRlRXhwbGFuYXRpb24uY29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NvdW50RGVsZXRlRXhwbGFuYXRpb247XG4gICAgfVxuICAgIC8vIC0tLSBFbmQgQWNjb3VudERlbGV0ZSBwYXRoIC0tLVxuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKSBhcyBUcmFuc2ZlckJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyXG4gICAgICAudG8ocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gYXMgc3RyaW5nKVxuICAgICAgLmFtb3VudChyZWNvdmVyYWJsZUJhbGFuY2UudG9GaXhlZCgwKSlcbiAgICAgIC5zZW5kZXIocm9vdEFjY291bnQpXG4gICAgICAuZmxhZ3MoMjE0NzQ4MzY0OClcbiAgICAgIC5sYXN0TGVkZ2VyU2VxdWVuY2UoY3VycmVudExlZGdlciArIDEwMDAwMDApIC8vIGdpdmUgaXQgMSBtaWxsaW9uIGxlZGdlcnMnIHRpbWUgKH4xIG1vbnRoLCBzdWl0YWJsZSBmb3IgS1JTKVxuICAgICAgLmZlZShvcGVuTGVkZ2VyRmVlLnRpbWVzKDMpLnRvRml4ZWQoMCkpIC8vIHRoZSBmYWN0b3IgdGhyZWUgaXMgZm9yIHRoZSBtdWx0aXNpZ25pbmdcbiAgICAgIC5zZXF1ZW5jZShzZXF1ZW5jZUlkKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHgsXG4gICAgICAgIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFrZXlzWzBdLnByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXNlcktleSBpcyBub3QgYSBwcml2YXRlIGtleWApO1xuICAgIH1cbiAgICBjb25zdCB1c2VyS2V5ID0ga2V5c1swXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB1c2VyU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIHVzZXJLZXksIHsgc2lnbkFzOiB1c2VyQWRkcmVzcyB9KTtcblxuICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbjogc3RyaW5nO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFrZXlzWzFdLnByaXZhdGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrdXBLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cEtleSA9IGtleXNbMV0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBiYWNrdXBTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgYmFja3VwS2V5LCB7IHNpZ25BczogYmFja3VwQWRkcmVzcyB9KTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gcmlwcGxlLm11bHRpc2lnbihbdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbiwgYmFja3VwU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uXSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjogUmVjb3ZlcnlJbmZvID0gKGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiBzaWduZWRUcmFuc2FjdGlvbixcbiAgICB9KSkgYXMgUmVjb3ZlcnlJbmZvO1xuXG4gICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi50eEhleCA9IHNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleTtcbiAgICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uY29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVjb3ZlclhycFRva2VuKHBhcmFtcywgdG9rZW5QYXJhbXMpIHtcbiAgICBjb25zdCB7IGN1cnJlbmN5LCBpc3N1ZXIgfSA9IHRva2VuUGFyYW1zO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9ICh1dGlscy5nZXRYcnBUb2tlbihpc3N1ZXIsIGN1cnJlbmN5KSBhcyBYcnBDb2luKS5uYW1lO1xuICAgIGNvbnN0IGxpbmVzID0gdG9rZW5QYXJhbXMuYWNjb3VudExpbmVzLmJvZHkucmVzdWx0LmxpbmVzO1xuXG4gICAgbGV0IGFtb3VudDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGlmIChsaW5lLmN1cnJlbmN5ID09PSBjdXJyZW5jeSAmJiBsaW5lLmFjY291bnQgPT09IGlzc3Vlcikge1xuICAgICAgICBhbW91bnQgPSBsaW5lLmJhbGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb2VzIG5vdCBoYXZlIFRydXN0bGluZSB3aXRoICR7aXNzdWVyfWApO1xuICAgIH1cbiAgICBpZiAoYW1vdW50ID09PSAnMCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9lcyBub3QgaGF2ZSBmdW5kcyB0byByZWNvdmVyYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjaW1hbFBsYWNlcyA9IGNvaW5zLmdldCh0b2tlbk5hbWUpLmRlY2ltYWxQbGFjZXM7XG4gICAgYW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpLnNoaWZ0ZWRCeShkZWNpbWFsUGxhY2VzKS50b0ZpeGVkKCk7XG5cbiAgICBjb25zdCBGTEFHX1ZBTFVFID0gMjE0NzQ4MzY0ODtcblxuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodG9rZW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpIGFzIFRva2VuVHJhbnNmZXJCdWlsZGVyO1xuICAgIHR4QnVpbGRlclxuICAgICAgLnRvKHRva2VuUGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC5zZW5kZXIocGFyYW1zLnJvb3RBZGRyZXNzKVxuICAgICAgLmZsYWdzKEZMQUdfVkFMVUUpXG4gICAgICAubGFzdExlZGdlclNlcXVlbmNlKHRva2VuUGFyYW1zLmN1cnJlbnRMZWRnZXIgKyAxMDAwMDAwKSAvLyBnaXZlIGl0IDEgbWlsbGlvbiBsZWRnZXJzJyB0aW1lICh+MSBtb250aCwgc3VpdGFibGUgZm9yIEtSUylcbiAgICAgIC5mZWUodG9rZW5QYXJhbXMub3BlbkxlZGdlckZlZS50aW1lcygzKS50b0ZpeGVkKDApKSAvLyB0aGUgZmFjdG9yIHRocmVlIGlzIGZvciB0aGUgbXVsdGlzaWduaW5nXG4gICAgICAuc2VxdWVuY2UodG9rZW5QYXJhbXMuc2VxdWVuY2VJZCk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICBjb25zdCB7IGtleXMsIGlzS3JzUmVjb3ZlcnksIGlzVW5zaWduZWRTd2VlcCwgdXNlckFkZHJlc3MsIGJhY2t1cEFkZHJlc3MgfSA9IHRva2VuUGFyYW1zO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhIZXg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWtleXNbMF0ucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1c2VyS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleSA9IGtleXNbMF0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdXNlclNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCB1c2VyS2V5LCB7IHNpZ25BczogdXNlckFkZHJlc3MgfSk7XG5cbiAgICBsZXQgc2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZztcblxuICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHVzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgha2V5c1sxXS5wcml2YXRlS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFja3VwS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBLZXkgPSBrZXlzWzFdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgYmFja3VwU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIGJhY2t1cEtleSwgeyBzaWduQXM6IGJhY2t1cEFkZHJlc3MgfSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHJpcHBsZS5tdWx0aXNpZ24oW3VzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb24sIGJhY2t1cFNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbl0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uRXhwbGFuYXRpb246IFJlY292ZXJ5SW5mbyA9IChhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgfSkpIGFzIFJlY292ZXJ5SW5mbztcblxuICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24udHhIZXggPSBzaWduZWRUcmFuc2FjdGlvbjtcblxuICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLmJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXk7XG4gICAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLmNvaW4gPSB0aGlzLmdldENoYWluKCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IGtleXBhaXIgZm9yIHRoaXMgY29pbi5cbiAgICogQHBhcmFtIHNlZWQgU2VlZCBmcm9tIHdoaWNoIHRoZSBuZXcga2V5cGFpciBzaG91bGQgYmUgZ2VuZXJhdGVkLCBvdGhlcndpc2UgYSByYW5kb20gc2VlZCBpcyB1c2VkXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBYcnBLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBYcnBLZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgaWYgKCFrZXlzLnhwcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMueHB1YixcbiAgICAgIHBydjoga2V5cy54cHJ2LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHBhcmFtczogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59XG4iXX0=
864
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3hycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLHlDQUEyQjtBQUUzQiw4Q0FrQnlCO0FBQ3pCLDRDQUF5RjtBQUN6RixnRUFBa0Q7QUFDbEQsMkNBQTZCO0FBRTdCLDZFQUE2RTtBQUM3RSx1RkFBdUY7QUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFL0IsK0JBQStHO0FBQy9HLHVDQVlxQjtBQUNyQiwyQ0FBc0Q7QUFDdEQsd0RBQWdDO0FBQ2hDLHNEQUE4QjtBQUU5QixNQUFhLEdBQUksU0FBUSxtQkFBUTtJQUUvQixZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNiLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztR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QUMxRSxLQUFLLEVBQUUsaUJBQWlCO1NBQ3pCLENBQUMsQ0FBaUIsQ0FBQztRQUVwQixzQkFBc0IsQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUM7UUFFakQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixzQkFBc0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNwRCxzQkFBc0IsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsSUFBYTtRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQVUsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBK0I7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLE1BQStCO1FBQy9DLE1BQU0sSUFBSSxvQ0FBeUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQTU2QkQsa0JBNDZCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBxdWVyeXN0cmluZyBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAndXJsJztcblxuaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIGNoZWNrS3JzUHJvdmlkZXIsXG4gIGdldEJpcDMyS2V5cyxcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgS2V5UGFpcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIHByb21pc2VQcm9wcyxcbiAgVG9rZW5FbmFibGVtZW50Q29uZmlnLFxuICBUcmFuc2FjdGlvblBhcmFtcyxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgWHJwQ29pbiwgWHJwTXB0Q29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCAqIGFzIHJpcHBsZUtleXBhaXJzIGZyb20gJ3JpcHBsZS1rZXlwYWlycyc7XG5pbXBvcnQgKiBhcyB4cnBsIGZyb20gJ3hycGwnO1xuXG4vLyB4cnBsIHJlLWV4cG9ydHMgcmlwcGxlLWJpbmFyeS1jb2RlY0AyLjcuMCB3aGljaCBzdXBwb3J0cyBNUFRva2VuQXV0aG9yaXplLlxuLy8gVGhlIHN0YW5kYWxvbmUgcmlwcGxlLWJpbmFyeS1jb2RlYyBkZXAgaXMgMi4xLjAgKHByZS1NUFQpLCBzbyB1c2UgeHJwbCBhcyB0aGUgY29kZWMuXG5jb25zdCByaXBwbGVCaW5hcnlDb2RlYyA9IHhycGw7XG5cbmltcG9ydCB7IEFjY291bnREZWxldGVCdWlsZGVyLCBUb2tlblRyYW5zZmVyQnVpbGRlciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRmVlSW5mbyxcbiAgSGFsZlNpZ25lZFRyYW5zYWN0aW9uLFxuICBSZWNvdmVyeUluZm8sXG4gIFJlY292ZXJ5T3B0aW9ucyxcbiAgUmVjb3ZlcnlUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFhycFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBYcnBLZXlQYWlyIH0gZnJvbSAnLi9saWIva2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHJpcHBsZSBmcm9tICcuL3JpcHBsZSc7XG5cbmV4cG9ydCBjbGFzcyBYcnAgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFhycChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvciBiZXR3ZWVuIHRoZSBjb2luJ3MgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKi9cbiAgcHVibGljIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoZSBibG9ja2NoYWluIHdoaWNoIHN1cHBvcnRzIHRoaXMgY29pblxuICAgKi9cbiAgcHVibGljIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhlIGNvaW4gZmFtaWx5XG4gICAqL1xuICBwdWJsaWMgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoaXMgY29pblxuICAgKi9cbiAgcHVibGljIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyB3aGV0aGVyIGFuIGFkZHJlc3Mgc3RyaW5nIGlzIHZhbGlkIGZvciB0aGlzIGNvaW5cbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZlZSBpbmZvIGZyb20gc2VydmVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RmVlSW5mbygpOiBQcm9taXNlPEZlZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wdWJsaWMvZmVlaW5mbycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTogVG9rZW5FbmFibGVtZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgICBnZXRFbmFibGVUb2tlblR5cGU6ICh0b2tlbk5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgY29pbnMuaGFzKHRva2VuTmFtZSkgJiYgY29pbnMuZ2V0KHRva2VuTmFtZSkgaW5zdGFuY2VvZiBYcnBNcHRDb2luID8gJ2VuYWJsZU1wdCcgOiAnZW5hYmxldG9rZW4nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIHBydlxuICAgKiBAcmV0dXJucyBCbHVlYmlyZDxIYWxmU2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHtcbiAgICB0eFByZWJ1aWxkLFxuICAgIHBydixcbiAgICBpc0xhc3RTaWduYXR1cmUsXG4gIH06IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEhhbGZTaWduZWRUcmFuc2FjdGlvbiB8IFJlY292ZXJ5VHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkKSB8fCAhXy5pc09iamVjdCh0eFByZWJ1aWxkKSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpICYmICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhQcmVidWlsZH1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBydikgfHwgIV8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBydikgJiYgIV8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBydiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgdHlwZSAke3R5cGVvZiBwcnZ9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHJ2IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZGApO1xuICAgIH1cbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IFhycEtleVBhaXIoeyBwcnYgfSk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSAoa2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgQnVmZmVyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCB0eCA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkodHhQcmVidWlsZC50eEhleCwgcHJpdmF0ZUtleSwge1xuICAgICAgc2lnbkFzOiBhZGRyZXNzLFxuICAgIH0pO1xuXG4gICAgLy8gTm9ybWFsbHkgdGhlIFNESyBwcm92aWRlcyB0aGUgZmlyc3Qgc2lnbmF0dXJlIGZvciBhbiBYUlAgdHgsIGJ1dCBvY2Nhc2lvbmFsbHkgaXQgcHJvdmlkZXMgdGhlIGZpbmFsIG9uZSBhcyB3ZWxsXG4gICAgLy8gKHJlY292ZXJpZXMpXG4gICAgaWYgKGlzTGFzdFNpZ25hdHVyZSkge1xuICAgICAgcmV0dXJuIHsgdHhIZXg6IHR4LnNpZ25lZFRyYW5zYWN0aW9uIH07XG4gICAgfVxuICAgIHJldHVybiB7IGhhbGZTaWduZWQ6IHsgdHhIZXg6IHR4LnNpZ25lZFRyYW5zYWN0aW9uIH0gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSaXBwbGUgcmVxdWlyZXMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB3YWxsZXQgZ2VuZXJhdGlvbiB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlXG4gICAqIHRoZSByb290IHB1YmxpYyBrZXksIHdoaWNoIGlzIHRoZSBiYXNpcyBvZiB0aGUgcm9vdCBhZGRyZXNzLCB0d28gc2lnbmVkLCBhbmQgb25lIGhhbGYtc2lnbmVkIGluaXRpYWxpemF0aW9uIHR4c1xuICAgKiBAcGFyYW0gd2FsbGV0UGFyYW1zXG4gICAqIC0gcm9vdFByaXZhdGVLZXk6IG9wdGlvbmFsIGhleC1lbmNvZGVkIFJpcHBsZSBwcml2YXRlIGtleVxuICAgKi9cbiAgYXN5bmMgc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KFxuICAgIHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9uc1xuICApOiBQcm9taXNlPFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnM+IHtcbiAgICBpZiAod2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5KSB7XG4gICAgICBpZiAod2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290UHJpdmF0ZUtleSBuZWVkcyB0byBiZSBhIGhleGFkZWNpbWFsIHByaXZhdGUga2V5IHN0cmluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IFhycEtleVBhaXIoKS5nZXRLZXlzKCk7XG4gICAgICBpZiAoIWtleVBhaXIucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcHJpdmF0ZUtleScpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0ga2V5UGFpci5wcnY7XG4gICAgfVxuICAgIHJldHVybiB3YWxsZXRQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbi9wYXJzZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBsZXQgdHJhbnNhY3Rpb247XG4gICAgbGV0IHR4SGV4OiBzdHJpbmcgPSBwYXJhbXMudHhIZXggfHwgKChwYXJhbXMuaGFsZlNpZ25lZCAmJiBwYXJhbXMuaGFsZlNpZ25lZC50eEhleCkgYXMgc3RyaW5nKTtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gdHhIZXgnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uID0gcmlwcGxlQmluYXJ5Q29kZWMuZGVjb2RlKHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0cmFuc2FjdGlvbiA9IEpTT04ucGFyc2UodHhIZXgpO1xuICAgICAgICB0eEhleCA9IHJpcHBsZUJpbmFyeUNvZGVjLmVuY29kZSh0cmFuc2FjdGlvbik7XG4gICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5lZWRzIHRvIGJlIGVpdGhlciBoZXggb3IgSlNPTiBzdHJpbmcgZm9yIFhSUCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaWQ6IHN0cmluZztcbiAgICAvLyBoYXNoZXMgaWRzIGFyZSBkaWZmZXJlbnQgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgdHhcbiAgICAvLyBmaXJzdCB3ZSB0cnkgdG8gZ2V0IHRoZSBoYXNoIGlkIGFzIGlmIGl0IGlzIHNpZ25lZCwgd2lsbCB0aHJvdyBpZiBpdHMgbm90XG4gICAgdHJ5IHtcbiAgICAgIGlkID0geHJwbC5oYXNoZXMuaGFzaFNpZ25lZFR4KHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZCA9IHhycGwuaGFzaGVzLmhhc2hUeCh0eEhleCk7XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSA9PT0gJ0FjY291bnRTZXQnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ2FjY291bnRTZXQnXSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAwLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6IHRyYW5zYWN0aW9uLkZlZSxcbiAgICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2l6ZTogdHhIZXgubGVuZ3RoIC8gMixcbiAgICAgICAgfSxcbiAgICAgICAgYWNjb3VudFNldDoge1xuICAgICAgICAgIG1lc3NhZ2VLZXk6IHRyYW5zYWN0aW9uLk1lc3NhZ2VLZXksXG4gICAgICAgICAgc2V0RmxhZzogdHJhbnNhY3Rpb24uU2V0RmxhZyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0cmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUgPT09ICdUcnVzdFNldCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnYWNjb3VudCcsXG4gICAgICAgICAgJ2xpbWl0QW1vdW50JyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAwLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6IHRyYW5zYWN0aW9uLkZlZSxcbiAgICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2l6ZTogdHhIZXgubGVuZ3RoIC8gMixcbiAgICAgICAgfSxcbiAgICAgICAgYWNjb3VudDogdHJhbnNhY3Rpb24uQWNjb3VudCxcbiAgICAgICAgbGltaXRBbW91bnQ6IHtcbiAgICAgICAgICBjdXJyZW5jeTogdHJhbnNhY3Rpb24uTGltaXRBbW91bnQuY3VycmVuY3ksXG4gICAgICAgICAgaXNzdWVyOiB0cmFuc2FjdGlvbi5MaW1pdEFtb3VudC5pc3N1ZXIsXG4gICAgICAgICAgdmFsdWU6IHRyYW5zYWN0aW9uLkxpbWl0QW1vdW50LnZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSA9PT0gJ01QVG9rZW5BdXRob3JpemUnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ21wdElzc3VhbmNlSWQnXSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAwLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6IHRyYW5zYWN0aW9uLkZlZSxcbiAgICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2l6ZTogdHhIZXgubGVuZ3RoIC8gMixcbiAgICAgICAgfSxcbiAgICAgICAgbXB0SXNzdWFuY2VJZDogdHJhbnNhY3Rpb24uTVBUb2tlbklzc3VhbmNlSUQsXG4gICAgICAgIC4uLih0cmFuc2FjdGlvbi5NUFRIb2xkZXIgIT09IHVuZGVmaW5lZCAmJiB7IG1wdEhvbGRlcjogdHJhbnNhY3Rpb24uTVBUSG9sZGVyIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzID1cbiAgICAgIHRyYW5zYWN0aW9uLkRlc3RpbmF0aW9uICsgKHRyYW5zYWN0aW9uLkRlc3RpbmF0aW9uVGFnID49IDAgPyAnP2R0PScgKyB0cmFuc2FjdGlvbi5EZXN0aW5hdGlvblRhZyA6ICcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZSddLFxuICAgICAgaWQ6IGlkLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBvdXRwdXRBbW91bnQ6IHRyYW5zYWN0aW9uLkFtb3VudCxcbiAgICAgIGNoYW5nZUFtb3VudDogMCxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0cmFuc2FjdGlvbi5BbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogdHJhbnNhY3Rpb24uRmVlLFxuICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIHNpemU6IHR4SGV4Lmxlbmd0aCAvIDIsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRUcmFuc2FjdGlvblR5cGVSYXdUeEhleCh0eEhleDogc3RyaW5nKTogWHJwVHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgdHJhbnNhY3Rpb247XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHR4SGV4Jyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IHJpcHBsZUJpbmFyeUNvZGVjLmRlY29kZSh0eEhleCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhbnNhY3Rpb24gPSBKU09OLnBhcnNlKHR4SGV4KTtcbiAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbmVlZHMgdG8gYmUgZWl0aGVyIGhleCBvciBKU09OIHN0cmluZyBmb3IgWFJQJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgdHhIZXhQcmVidWlsZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBpc01wdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0eEhleFByZWJ1aWxkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdHhIZXhQcmVidWlsZCB0byB2ZXJpZnkgdG9rZW4gdHlwZSBmb3IgZW5hYmxldG9rZW4gdHgnKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZVJhd1R4SGV4KHR4SGV4UHJlYnVpbGQpO1xuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIFRyYW5zYWN0aW9uVHlwZSBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG5cbiAgICBpZiAoaXNNcHQpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvblR5cGUgIT09IFhycFRyYW5zYWN0aW9uVHlwZS5NUFRva2VuQXV0aG9yaXplKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHR4IHR5cGUgJHt0cmFuc2FjdGlvblR5cGV9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgTVBUb2tlbkF1dGhvcml6ZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgIT09IFhycFRyYW5zYWN0aW9uVHlwZS5UcnVzdFNldClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHggdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdHlwZSBUcnVzdFNldGApO1xuICAgIC8vIGRlY29kZWQgcGF5bG9hZCB0eXBlIGNvdWxkIGNvbWUgYXMgdW5kZWZpbmVkIG9yIGFueSBvZiB0aGUgZW5hYmxldG9rZW4gbGlrZSB0eXBlcyBidXQgbmV2ZXIgYXMgc29tZXRoaW5nIGVsc2UgbGlrZSBTZW5kLCBldGNcbiAgICBjb25zdCBhY3R1YWxUeXBlRnJvbURlY29kZWQgPVxuICAgICAgJ3R5cGUnIGluIHR4UHJlYnVpbGREZWNvZGVkICYmIHR5cGVvZiB0eFByZWJ1aWxkRGVjb2RlZC50eXBlID09PSAnc3RyaW5nJyA/IHR4UHJlYnVpbGREZWNvZGVkLnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgIWFjdHVhbFR5cGVGcm9tRGVjb2RlZCB8fFxuICAgICAgYWN0dWFsVHlwZUZyb21EZWNvZGVkID09PSAnZW5hYmxldG9rZW4nIHx8XG4gICAgICBhY3R1YWxUeXBlRnJvbURlY29kZWQgPT09ICdBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb24nXG4gICAgKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKGB0eCB0eXBlICR7YWN0dWFsVHlwZUZyb21EZWNvZGVkfSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZSBlbmFibGV0b2tlbmApO1xuICB9XG5cbiAgdmVyaWZ5TXB0VHhUeXBlKHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCB0eEhleFByZWJ1aWxkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXR4SGV4UHJlYnVpbGQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0eEhleFByZWJ1aWxkIHRvIHZlcmlmeSB0b2tlbiB0eXBlIGZvciBlbmFibGVNcHQgdHgnKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZVJhd1R4SGV4KHR4SGV4UHJlYnVpbGQpO1xuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIFRyYW5zYWN0aW9uVHlwZSBvbiBNUFQgZW5hYmxlbWVudCB0eCcpO1xuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgIT09IFhycFRyYW5zYWN0aW9uVHlwZS5NUFRva2VuQXV0aG9yaXplKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eCB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIE1QVG9rZW5BdXRob3JpemVgKTtcbiAgICBjb25zdCBhY3R1YWxUeXBlRnJvbURlY29kZWQgPVxuICAgICAgJ3R5cGUnIGluIHR4UHJlYnVpbGREZWNvZGVkICYmIHR5cGVvZiB0eFByZWJ1aWxkRGVjb2RlZC50eXBlID09PSAnc3RyaW5nJyA/IHR4UHJlYnVpbGREZWNvZGVkLnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFhY3R1YWxUeXBlRnJvbURlY29kZWQgfHwgYWN0dWFsVHlwZUZyb21EZWNvZGVkID09PSAnZW5hYmxlTXB0JykgcmV0dXJuO1xuICAgIHRocm93IG5ldyBFcnJvcihgdHggdHlwZSAke2FjdHVhbFR5cGVGcm9tRGVjb2RlZH0gZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGUgZW5hYmxlTXB0YCk7XG4gIH1cblxuICB2ZXJpZnlUb2tlbk5hbWUoXG4gICAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zLFxuICAgIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIHR4SGV4UHJlYnVpbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb2luQ29uZmlnOiBYcnBDb2luXG4gICk6IHZvaWQge1xuICAgIGlmICghdHhIZXhQcmVidWlsZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHR4SGV4UHJlYnVpbGQgcGFyYW0gcmVxdWlyZWQgZm9yIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgaWYgKCF0eFBhcmFtcy5yZWNpcGllbnRzIHx8IHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlY2lwaWVudHMgcGFyYW0gZm9yIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgY29uc3QgZnVsbFRva2VuTmFtZSA9IHR4UGFyYW1zLnJlY2lwaWVudHNbMF0udG9rZW5OYW1lO1xuICAgIGlmIChmdWxsVG9rZW5OYW1lID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtIHRva2VuTmFtZSBpcyByZXF1aXJlZCBmb3IgdG9rZW4gZW5hYmxlbWVudC4gUmVjaXBpZW50IG11c3QgaW5jbHVkZSBhIHRva2VuIG5hbWUuJyk7XG5cbiAgICBpZiAoISgnbGltaXRBbW91bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGxpbWl0QW1vdW50IHBhcmFtIGZvciB0b2tlbiBlbmFibGVtZW50LicpO1xuXG4gICAgLy8gd2UgY2hlY2sgY3VycmVuY3kgb24gYm90aCB0aGUgdHhIZXggYnV0IGFsc28gdGhlIGV4cGxhaW5lZCBwYXlsb2FkXG4gICAgY29uc3QgZXhwZWN0ZWRDdXJyZW5jeSA9IHV0aWxzLmdldFhycEN1cnJlbmN5RnJvbVRva2VuTmFtZShmdWxsVG9rZW5OYW1lKS5jdXJyZW5jeTtcbiAgICBpZiAoY29pbkNvbmZpZy5pc1Rva2VuICYmIGV4cGVjdGVkQ3VycmVuY3kgIT09IHR4UHJlYnVpbGREZWNvZGVkLmxpbWl0QW1vdW50LmN1cnJlbmN5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuIGlzc3VlciBvciBjdXJyZW5jeSBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG4gIH1cblxuICB2ZXJpZnlBY3RpdmF0aW9uQWRkcmVzcyh0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXMsIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgPT09IHVuZGVmaW5lZCB8fCB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZWNpcGllbnRzIHBhcmFtIGZvciB0b2tlbiBlbmFibGVtZW50LicpO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHM/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLmdldENoYWluKCl9IGRvZXNuJ3Qgc3VwcG9ydCBzZW5kaW5nIHRvIG1vcmUgdGhhbiAxIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUcnkgYWdhaW4sIHVzaW5nIG9ubHkgYSBzaW5nbGUgcmVjaXBpZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghKCdhY2NvdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkpIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBhY2NvdW50IG9uIHRva2VuIGVuYWJsZW1lbnQgdHgnKTtcblxuICAgIGNvbnN0IGFjdGl2YXRpb25BZGRyZXNzID0gdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IGFjY291bnRBZGRyZXNzID0gdHhQcmVidWlsZERlY29kZWQuYWNjb3VudDtcbiAgICBpZiAoYWN0aXZhdGlvbkFkZHJlc3MgIT09IGFjY291bnRBZGRyZXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGFkZHJlc3MgZG9lc24ndCBtYXRjaCB3aXRoIGFjdGl2YXRpb24gYWRkcmVzcy5cIik7XG4gIH1cblxuICB2ZXJpZnlUb2tlbklzc3Vlcih0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXMsIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHR4UHJlYnVpbGREZWNvZGVkID09PSB1bmRlZmluZWQgfHwgISgnbGltaXRBbW91bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0b2tlbiBpc3N1ZXIgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuICAgIGNvbnN0IHsgaXNzdWVyLCBjdXJyZW5jeSB9ID0gdHhQcmVidWlsZERlY29kZWQubGltaXRBbW91bnQ7XG4gICAgaWYgKCF1dGlscy5nZXRYcnBUb2tlbihpc3N1ZXIsIGN1cnJlbmN5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBpc3N1ZXIgb3IgY3VycmVuY3kgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuICB9XG5cbiAgdmVyaWZ5UmVxdWlyZWRLZXlzKHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcywgdHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhKCdhY2NvdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkgfHxcbiAgICAgICEoJ2xpbWl0QW1vdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkgfHxcbiAgICAgICF0eFByZWJ1aWxkRGVjb2RlZC5saW1pdEFtb3VudC5jdXJyZW5jeVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBsYW5hdGlvbiBpcyBtaXNzaW5nIHJlcXVpcmVkIGtleXMgKGFjY291bnQgb3IgbGltaXRBbW91bnQgd2l0aCBjdXJyZW5jeSknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAgICogQHBhcmFtIHR4UGFyYW1zIHBhcmFtcyBvYmplY3QgcGFzc2VkIHRvIHNlbmRcbiAgICogQHBhcmFtIHR4UHJlYnVpbGQgcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHNlcnZlclxuICAgKiBAcGFyYW0gd2FsbGV0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9OiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkgYXMgWHJwQ29pbjtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgIH0pO1xuXG4gICAgLy8gRXhwbGFpbmluZyBhIHR4IHN0cmlwcyBvdXQgY2VydGFpbiBkYXRhLCBmb3IgZXh0cmEgbWVhc3VyZW1lbnQgd2UncmUgY2hlY2tpbmcgdnMgdGhlIGV4cGxhaW5lZCB0eFxuICAgIC8vIGJ1dCBhbHNvIHZzIHRoZSB0eCBwcmUgZXhwbGFpbmVkLlxuICAgIGlmICh0eFBhcmFtcy50eXBlID09PSAnZW5hYmxlTXB0Jykge1xuICAgICAgaWYgKHZlcmlmaWNhdGlvbj8udmVyaWZ5VG9rZW5FbmFibGVtZW50KSB7XG4gICAgICAgIHRoaXMudmVyaWZ5VHhUeXBlKGV4cGxhbmF0aW9uLCB0eFByZWJ1aWxkLnR4SGV4LCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eFBhcmFtcy50eXBlID09PSAnZW5hYmxldG9rZW4nICYmIHZlcmlmaWNhdGlvbj8udmVyaWZ5VG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aGlzLnZlcmlmeVR4VHlwZShleHBsYW5hdGlvbiwgdHhQcmVidWlsZC50eEhleCk7XG4gICAgICB0aGlzLnZlcmlmeUFjdGl2YXRpb25BZGRyZXNzKHR4UGFyYW1zLCBleHBsYW5hdGlvbik7XG4gICAgICB0aGlzLnZlcmlmeVRva2VuSXNzdWVyKHR4UGFyYW1zLCBleHBsYW5hdGlvbik7XG4gICAgICB0aGlzLnZlcmlmeVRva2VuTmFtZSh0eFBhcmFtcywgZXhwbGFuYXRpb24sIHR4UHJlYnVpbGQudHhIZXgsIGNvaW5Db25maWcpO1xuICAgICAgdGhpcy52ZXJpZnlSZXF1aXJlZEtleXModHhQYXJhbXMsIGV4cGxhbmF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAodHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZU1wdCcpIHtcbiAgICAgIGlmICh2ZXJpZmljYXRpb24/LnZlcmlmeVRva2VuRW5hYmxlbWVudCkge1xuICAgICAgICB0aGlzLnZlcmlmeU1wdFR4VHlwZShleHBsYW5hdGlvbiwgdHhQcmVidWlsZC50eEhleCk7XG4gICAgICB9XG4gICAgICAvLyBNUFRva2VuQXV0aG9yaXplIHRyYW5zYWN0aW9ucyBoYXZlIG5vIGRlc3RpbmF0aW9uIG9yIGFtb3VudDtcbiAgICAgIC8vIHRoZSBvdXRwdXQgY29tcGFyYXRvciBiZWxvdyBkb2VzIG5vdCBhcHBseS5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXVswXTtcbiAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9IHR4UGFyYW1zLnJlY2lwaWVudHMgJiYgdHhQYXJhbXMucmVjaXBpZW50c1swXTtcblxuICAgIGNvbnN0IGNvbXBhcmF0b3IgPSAocmVjaXBpZW50MSwgcmVjaXBpZW50MikgPT4ge1xuICAgICAgaWYgKHV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKHJlY2lwaWVudDEuYWRkcmVzcykuYWRkcmVzcyAhPT0gdXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocmVjaXBpZW50Mi5hZGRyZXNzKS5hZGRyZXNzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFtb3VudDEgPSBuZXcgQmlnTnVtYmVyKHJlY2lwaWVudDEuYW1vdW50KTtcbiAgICAgIGNvbnN0IGFtb3VudDIgPSBuZXcgQmlnTnVtYmVyKHJlY2lwaWVudDIuYW1vdW50KTtcbiAgICAgIHJldHVybiBhbW91bnQxLnRvRml4ZWQoKSA9PT0gYW1vdW50Mi50b0ZpeGVkKCk7XG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgICh0eFBhcmFtcy50eXBlID09PSB1bmRlZmluZWQgfHwgdHhQYXJhbXMudHlwZSA9PT0gJ3BheW1lbnQnKSAmJlxuICAgICAgdHlwZW9mIG91dHB1dC5hbW91bnQgIT09ICdvYmplY3QnICYmXG4gICAgICAhY29tcGFyYXRvcihvdXRwdXQsIGV4cGVjdGVkT3V0cHV0KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBvdXRwdXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhZGRyZXNzIGlzIGEgdmFsaWQgWFJQIGFkZHJlc3MsIGFuZCB0aGVuIG1ha2Ugc3VyZSB0aGUgcm9vdCBhZGRyZXNzZXMgbWF0Y2guXG4gICAqIFRoaXMgcHJldmVudHMgYXR0YWNrcyB3aGVyZSBhbiBhdHRhY2sgbWF5IHN3aXRjaCBvdXQgdGhlIG5ldyBhZGRyZXNzIGZvciBvbmUgb2YgdGhlaXIgb3duXG4gICAqIEBwYXJhbSBhZGRyZXNzIHtTdHJpbmd9IHRoZSBhZGRyZXNzIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gcm9vdEFkZHJlc3Mge1N0cmluZ30gdGhlIHdhbGxldCdzIHJvb3QgYWRkcmVzc1xuICAgKiBAcmV0dXJuIHRydWUgaWZmIGFkZHJlc3MgaXMgYSB3YWxsZXQgYWRkcmVzcyAoYmFzZWQgb24gcm9vdEFkZHJlc3MpXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzcywgcm9vdEFkZHJlc3MgfTogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBmYWlsdXJlOiBhZGRyZXNzIFwiJHthZGRyZXNzfVwiIGlzIG5vdCB2YWxpZGApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRJbmZvUGFyYW1zID0ge1xuICAgICAgbWV0aG9kOiAnYWNjb3VudF9pbmZvJyxcbiAgICAgIHBhcmFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogYWRkcmVzcyxcbiAgICAgICAgICBsZWRnZXJfaW5kZXg6ICdjdXJyZW50JyxcbiAgICAgICAgICBxdWV1ZTogdHJ1ZSxcbiAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgc2lnbmVyX2xpc3RzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWNjb3VudEluZm8gPSAoYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuZ2V0UmlwcGxlZFVybCgpKS5zZW5kKGFjY291bnRJbmZvUGFyYW1zKSkuYm9keTtcblxuICAgIGlmIChhY2NvdW50SW5mbz8ucmVzdWx0Py5hY2NvdW50X2RhdGE/LkZsYWdzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhY2NvdW50IGluZm9ybWF0aW9uOiBGbGFncyBmaWVsZCBpcyBtaXNzaW5nLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYWdzID0geHJwbC5wYXJzZUFjY291bnRSb290RmxhZ3MoYWNjb3VudEluZm8ucmVzdWx0LmFjY291bnRfZGF0YS5GbGFncyk7XG5cbiAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IHV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3MpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzRGV0YWlscyA9IHV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKHJvb3RBZGRyZXNzKTtcblxuICAgIGlmIChmbGFncy5sc2ZSZXF1aXJlRGVzdFRhZyAmJiBhZGRyZXNzRGV0YWlscy5kZXN0aW5hdGlvblRhZyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgSW52YWxpZCBBZGRyZXNzOiBEZXN0aW5hdGlvbiBUYWcgaXMgcmVxdWlyZWQgZm9yIGFkZHJlc3MgXCIke2FkZHJlc3N9XCIuYCk7XG4gICAgfVxuXG4gICAgaWYgKGFkZHJlc3NEZXRhaWxzLmFkZHJlc3MgIT09IHJvb3RBZGRyZXNzRGV0YWlscy5hZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihcbiAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiAke2FkZHJlc3NEZXRhaWxzLmFkZHJlc3N9IHZzLiAke3Jvb3RBZGRyZXNzRGV0YWlscy5hZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVVJMIG9mIGEgd2VsbC1rbm93biwgcHVibGljIGZhY2luZyAobm9uLWJpdGdvKSByaXBwbGVkIGluc3RhbmNlIHdoaWNoIGNhbiBiZSB1c2VkIGZvciByZWNvdmVyeVxuICAgKi9cbiAgcHVibGljIGdldFJpcHBsZWRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2h0dHBzOi8vczEucmlwcGxlLmNvbTo1MTIzNCc7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gcm9vdEFkZHJlc3M6IHJvb3QgWFJQIHdhbGxldCBhZGRyZXNzIHRvIHJlY292ZXIgZnVuZHMgZnJvbVxuICAgKiAtIHVzZXJLZXk6IFtlbmNyeXB0ZWRdIHhwcnZcbiAgICogLSBiYWNrdXBLZXk6IFtlbmNyeXB0ZWRdIHhwcnYsIG9yIHhwdWIgaWYgdGhlIHhwcnYgaXMgaGVsZCBieSBhIEtSUyBwcm92aWRlclxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2U6IG5lY2Vzc2FyeSBpZiBvbmUgb2YgdGhlIHhwcnZzIGlzIGVuY3J5cHRlZFxuICAgKiAtIGJpdGdvS2V5OiB4cHViXG4gICAqIC0ga3JzUHJvdmlkZXI6IG5lY2Vzc2FyeSBpZiBiYWNrdXAga2V5IGlzIGhlbGQgYnkgS1JTXG4gICAqIC0gcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGFyZ2V0IGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxSZWNvdmVyeUluZm8gfCBSZWNvdmVyeVRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgcmlwcGxlZFVybCA9IHRoaXMuZ2V0UmlwcGxlZFVybCgpO1xuICAgIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBwYXJhbXMuYmFja3VwS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKSAmJiAhcGFyYW1zLnVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpO1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IHBhcmFtcy5iYWNrdXBLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmIHBhcmFtcy51c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKTtcblxuICAgIC8vIFN0cmlwIGFueSA/ZHQ9PHRhZz4gcXVlcnkgc3RyaW5nIGZyb20gdGhlIHJvb3QgYWRkcmVzcyBiZWZvcmUgc2VuZGluZyB0byB0aGUgWFJQTCBSUEMuXG4gICAgLy8gQml0R28gZW5jb2RlcyBkZXN0aW5hdGlvbiB0YWdzIGFzIGByWFhYWD9kdD1OYCBpbiBpdHMgVUkvQVBJLCBidXQgdGhlIHJpcHBsZWQgSlNPTi1SUENcbiAgICAvLyBvbmx5IGFjY2VwdHMgdGhlIGJhcmUgci1hZGRyZXNzLlxuICAgIGNvbnN0IHJvb3RBZGRyZXNzRGV0YWlscyA9IHVybC5wYXJzZShwYXJhbXMucm9vdEFkZHJlc3MpO1xuICAgIGNvbnN0IHJvb3RBY2NvdW50ID0gcm9vdEFkZHJlc3NEZXRhaWxzLnBhdGhuYW1lIGFzIHN0cmluZztcblxuICAgIGNvbnN0IGFjY291bnRJbmZvUGFyYW1zID0ge1xuICAgICAgbWV0aG9kOiAnYWNjb3VudF9pbmZvJyxcbiAgICAgIHBhcmFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogcm9vdEFjY291bnQsXG4gICAgICAgICAgbGVkZ2VyX2luZGV4OiAnY3VycmVudCcsXG4gICAgICAgICAgcXVldWU6IHRydWUsXG4gICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgIHNpZ25lcl9saXN0czogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IGFjY291bnRMaW5lc1BhcmFtcyA9IHtcbiAgICAgIG1ldGhvZDogJ2FjY291bnRfbGluZXMnLFxuICAgICAgcGFyYW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiByb290QWNjb3VudCxcbiAgICAgICAgICBsZWRnZXJfaW5kZXg6ICd2YWxpZGF0ZWQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgLy8gRm9yIEFjY291bnREZWxldGUgKHJlc2VydmVXaXRoZHJhd2FsKSB0aGUgS1JTIHByb3ZpZGVyIGNvaW4tZmFtaWx5IGNoZWNrIGlzIHNraXBwZWQgYmVjYXVzZTpcbiAgICAvLyAxLiBBY2NvdW50RGVsZXRlIGlzIGFuIGVtZXJnZW5jeSByZWNvdmVyeTsgS1JTIGNvaW4tZmFtaWx5IGxpc3RzIGFyZSBpcnJlbGV2YW50IGhlcmUuXG4gICAgLy8gMi4gVGhlIHNpZ25pbmcgcGF0aCBpbnNpZGUgdGhlIHJlc2VydmVXaXRoZHJhd2FsIGJsb2NrIGFscmVhZHkgaGFuZGxlcyBpc0tyc1JlY292ZXJ5IGNvcnJlY3RseVxuICAgIC8vICAgICh1c2VyIHNpZ25zLCBiYWNrdXAgc2lnbmF0dXJlIGNvbWVzIGZyb20gS1JTIG9yIGlzIG9taXR0ZWQgZm9yIGFuIHVuc2lnbmVkIHN3ZWVwKS5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSAmJiAhcGFyYW1zLnJlc2VydmVXaXRoZHJhd2FsKSB7XG4gICAgICBjaGVja0tyc1Byb3ZpZGVyKHRoaXMsIHBhcmFtcy5rcnNQcm92aWRlcik7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVzdGluYXRpb24gYWRkcmVzcyEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gYXdhaXQgZ2V0QmlwMzJLZXlzKHRoaXMuYml0Z28sIHBhcmFtcywgeyByZXF1aXJlQml0R29YcHViOiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IHsgYWRkcmVzc0RldGFpbHMsIGZlZURldGFpbHMsIHNlcnZlckRldGFpbHMsIGFjY291bnRMaW5lcyB9ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgIGFkZHJlc3NEZXRhaWxzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZChhY2NvdW50SW5mb1BhcmFtcyksXG4gICAgICBmZWVEZXRhaWxzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZCh7IG1ldGhvZDogJ2ZlZScgfSksXG4gICAgICBzZXJ2ZXJEZXRhaWxzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZCh7IG1ldGhvZDogJ3NlcnZlcl9pbmZvJyB9KSxcbiAgICAgIGFjY291bnRMaW5lczogdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoYWNjb3VudExpbmVzUGFyYW1zKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wZW5MZWRnZXJGZWUgPSBuZXcgQmlnTnVtYmVyKGZlZURldGFpbHMuYm9keS5yZXN1bHQuZHJvcHMub3Blbl9sZWRnZXJfZmVlKTtcbiAgICBjb25zdCBiYXNlUmVzZXJ2ZSA9IG5ldyBCaWdOdW1iZXIoc2VydmVyRGV0YWlscy5ib2R5LnJlc3VsdC5pbmZvLnZhbGlkYXRlZF9sZWRnZXIucmVzZXJ2ZV9iYXNlX3hycCkudGltZXMoXG4gICAgICB0aGlzLmdldEJhc2VGYWN0b3IoKVxuICAgICk7XG4gICAgY29uc3QgcmVzZXJ2ZURlbHRhID0gbmV3IEJpZ051bWJlcihzZXJ2ZXJEZXRhaWxzLmJvZHkucmVzdWx0LmluZm8udmFsaWRhdGVkX2xlZGdlci5yZXNlcnZlX2luY194cnApLnRpbWVzKFxuICAgICAgdGhpcy5nZXRCYXNlRmFjdG9yKClcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRMZWRnZXIgPSBzZXJ2ZXJEZXRhaWxzLmJvZHkucmVzdWx0LmluZm8udmFsaWRhdGVkX2xlZGdlci5zZXE7XG4gICAgY29uc3Qgc2VxdWVuY2VJZCA9IGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5TZXF1ZW5jZTtcbiAgICBjb25zdCBiYWxhbmNlID0gbmV3IEJpZ051bWJlcihhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuQmFsYW5jZSk7XG4gICAgY29uc3Qgc2lnbmVyTGlzdHMgPSBhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuc2lnbmVyX2xpc3RzO1xuICAgIGNvbnN0IGFjY291bnRGbGFncyA9IGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5GbGFncztcbiAgICBjb25zdCBvd25lckNvdW50ID0gbmV3IEJpZ051bWJlcihhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuT3duZXJDb3VudCk7XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgc2lnbmVyIGxpc3Qgc2V0XG4gICAgaWYgKHNpZ25lckxpc3RzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIHNldCBvZiBzaWduZXIgbGlzdHMnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIHNpZ25lcnMgYXJlIHVzZXIsIGJhY2t1cCwgYml0Z29cbiAgICBjb25zdCB1c2VyQWRkcmVzcyA9IHJpcHBsZUtleXBhaXJzLmRlcml2ZUFkZHJlc3Moa2V5c1swXS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBjb25zdCBiYWNrdXBBZGRyZXNzID0gcmlwcGxlS2V5cGFpcnMuZGVyaXZlQWRkcmVzcyhrZXlzWzFdLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgY29uc3Qgc2lnbmVyTGlzdCA9IHNpZ25lckxpc3RzWzBdO1xuICAgIGlmIChzaWduZXJMaXN0LlNpZ25lclF1b3J1bSAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbmltdW0gc2lnbmF0dXJlIGNvdW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kQWRkcmVzc2VzID0ge307XG5cbiAgICBjb25zdCBzaWduZXJFbnRyaWVzID0gc2lnbmVyTGlzdC5TaWduZXJFbnRyaWVzO1xuICAgIGlmIChzaWduZXJFbnRyaWVzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25lciBsaXN0IGxlbmd0aCcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgU2lnbmVyRW50cnkgfSBvZiBzaWduZXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCB3ZWlnaHQgPSBTaWduZXJFbnRyeS5TaWduZXJXZWlnaHQ7XG4gICAgICBjb25zdCBhZGRyZXNzID0gU2lnbmVyRW50cnkuQWNjb3VudDtcbiAgICAgIGlmICh3ZWlnaHQgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25lciB3ZWlnaHQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgaXQncyBhIGR1cGUgb2YgYW4gYWRkcmVzcyB3ZSBhbHJlYWR5IGtub3csIGJsb2NrXG4gICAgICBpZiAoZm91bmRBZGRyZXNzZXNbYWRkcmVzc10gPj0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cGxpY2F0ZSBzaWduZXIgYWRkcmVzcycpO1xuICAgICAgfVxuICAgICAgZm91bmRBZGRyZXNzZXNbYWRkcmVzc10gPSAoZm91bmRBZGRyZXNzZXNbYWRkcmVzc10gfHwgMCkgKyAxO1xuICAgIH1cblxuICAgIGlmIChmb3VuZEFkZHJlc3Nlc1t1c2VyQWRkcmVzc10gIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBpbmNpZGVuY2UgZnJlcXVlbmN5IG9mIHVzZXIgc2lnbmVyIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgaWYgKGZvdW5kQWRkcmVzc2VzW2JhY2t1cEFkZHJlc3NdICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgaW5jaWRlbmNlIGZyZXF1ZW5jeSBvZiB1c2VyIHNpZ25lciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBmbGFncyBkaXNhYmxlIHRoZSBtYXN0ZXIga2V5IGFuZCBlbmZvcmNlIGRlc3RpbmF0aW9uIHRhZ3NcbiAgICBjb25zdCBVU0VSX0tFWV9TRVRUSU5HX0ZMQUcgPSA2NTUzNjtcbiAgICBjb25zdCBNQVNURVJfS0VZX0RFQUNUSVZBVElPTl9GTEFHID0gMTA0ODU3NjtcbiAgICBjb25zdCBSRVFVSVJFX0RFU1RJTkFUSU9OX1RBR19GTEFHID0gMTMxMDcyO1xuICAgIGlmICgoYWNjb3VudEZsYWdzICYgVVNFUl9LRVlfU0VUVElOR19GTEFHKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhIGN1c3RvbSB1c2VyIGtleSBoYXMgYmVlbiBzZXQnKTtcbiAgICB9XG4gICAgaWYgKChhY2NvdW50RmxhZ3MgJiBNQVNURVJfS0VZX0RFQUNUSVZBVElPTl9GTEFHKSAhPT0gTUFTVEVSX0tFWV9ERUFDVElWQVRJT05fRkxBRykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgbWFzdGVyIGtleSBoYXMgbm90IGJlZW4gZGVhY3RpdmF0ZWQnKTtcbiAgICB9XG4gICAgaWYgKChhY2NvdW50RmxhZ3MgJiBSRVFVSVJFX0RFU1RJTkFUSU9OX1RBR19GTEFHKSAhPT0gUkVRVUlSRV9ERVNUSU5BVElPTl9UQUdfRkxBRykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgZGVzdGluYXRpb24gZmxhZyByZXF1aXJlbWVudCBoYXMgbm90IGJlZW4gYWN0aXZhdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gcmVjb3ZlciB0aGUgZnVuZHNcbiAgICBjb25zdCB0b3RhbFJlc2VydmVEZWx0YSA9IHJlc2VydmVEZWx0YS50aW1lcyhvd25lckNvdW50KTtcbiAgICBjb25zdCByZXNlcnZlID0gYmFzZVJlc2VydmUucGx1cyh0b3RhbFJlc2VydmVEZWx0YSk7XG4gICAgY29uc3QgcmVjb3ZlcmFibGVCYWxhbmNlID0gYmFsYW5jZS5taW51cyhyZXNlcnZlKTtcblxuICAgIGNvbnN0IHJhd0Rlc3RpbmF0aW9uID0gcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25EZXRhaWxzID0gdXJsLnBhcnNlKHJhd0Rlc3RpbmF0aW9uKTtcblxuICAgIGlmIChkZXN0aW5hdGlvbkRldGFpbHMucXVlcnkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5RGV0YWlscyA9IHF1ZXJ5c3RyaW5nLnBhcnNlKGRlc3RpbmF0aW9uRGV0YWlscy5xdWVyeSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeURldGFpbHMuZHQpKSB7XG4gICAgICAgIC8vIGlmIHF1ZXJ5RGV0YWlscy5kdCBpcyBhbiBhcnJheSwgdGhhdCBtZWFucyBkdCB3YXMgZ2l2ZW4gbXVsdGlwbGUgdGltZXMsIHdoaWNoIGlzIG5vdCB2YWxpZFxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihcbiAgICAgICAgICBgZGVzdGluYXRpb24gdGFnIGNhbiBhcHBlYXIgYXQgbW9zdCBvbmNlLCBidXQgJHtxdWVyeURldGFpbHMuZHQubGVuZ3RofSBkZXN0aW5hdGlvbiB0YWdzIHdlcmUgZm91bmRgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJhYmxlQmFsYW5jZS50b051bWJlcigpIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFF1YW50aXR5IG9mIFhSUCB0byByZWNvdmVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIEN1cnJlbnQgYmFsYW5jZTogJHtiYWxhbmNlLnRvTnVtYmVyKCl9LCBibG9ja2NoYWluIHJlc2VydmU6ICR7cmVzZXJ2ZS50b051bWJlcigpfSwgc3BlbmRhYmxlIGJhbGFuY2U6ICR7cmVjb3ZlcmFibGVCYWxhbmNlLnRvTnVtYmVyKCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc3N1ZXIgPSBwYXJhbXM/Lmlzc3VlckFkZHJlc3M7XG4gICAgY29uc3QgY3VycmVuY3kgPSBwYXJhbXM/LmN1cnJlbmN5Q29kZTtcbiAgICBpZiAoISFpc3N1ZXIgJiYgISFjdXJyZW5jeSkge1xuICAgICAgY29uc3QgdG9rZW5QYXJhbXMgPSB7XG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICByZWNvdmVyYWJsZUJhbGFuY2UsXG4gICAgICAgIGN1cnJlbnRMZWRnZXIsXG4gICAgICAgIG9wZW5MZWRnZXJGZWUsXG4gICAgICAgIHNlcXVlbmNlSWQsXG4gICAgICAgIGFjY291bnRMaW5lcyxcbiAgICAgICAga2V5cyxcbiAgICAgICAgaXNLcnNSZWNvdmVyeSxcbiAgICAgICAgaXNVbnNpZ25lZFN3ZWVwLFxuICAgICAgICB1c2VyQWRkcmVzcyxcbiAgICAgICAgYmFja3VwQWRkcmVzcyxcbiAgICAgICAgaXNzdWVyLFxuICAgICAgICBjdXJyZW5jeSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnJlY292ZXJYcnBUb2tlbihwYXJhbXMsIHRva2VuUGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuXG4gICAgLy8gLS0tIEFjY291bnREZWxldGUgcGF0aDogd2l0aGRyYXcgZnVsbCBiYWxhbmNlIGluY2x1ZGluZyB0aGUgYmFzZSByZXNlcnZlIC0tLVxuICAgIGlmIChwYXJhbXMucmVzZXJ2ZVdpdGhkcmF3YWwpIHtcbiAgICAgIC8vIDEuIE5vIHRydXN0bGluZXMgd2l0aCBub24temVybyBiYWxhbmNlcyBtYXkgZXhpc3QuXG4gICAgICBjb25zdCBsaW5lczogQXJyYXk8eyBjdXJyZW5jeTogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IGJhbGFuY2U6IHN0cmluZyB9PiA9IGFjY291bnRMaW5lcy5ib2R5LnJlc3VsdC5saW5lcyA/PyBbXTtcbiAgICAgIGNvbnN0IG5vblplcm9MaW5lcyA9IGxpbmVzLmZpbHRlcigobCkgPT4gcGFyc2VGbG9hdChsLmJhbGFuY2UpICE9PSAwKTtcbiAgICAgIGlmIChub25aZXJvTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFjY291bnQgaGFzICR7bm9uWmVyb0xpbmVzLmxlbmd0aH0gdHJ1c3RsaW5lKHMpIHdpdGggbm9uLXplcm8gYmFsYW5jZXMuIGAgK1xuICAgICAgICAgICAgJ0NsZWFyIGFsbCB0b2tlbiB0cnVzdGxpbmVzIGJlZm9yZSB1c2luZyByZXNlcnZlIHdpdGhkcmF3YWwuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBObyBvd25lZCBvYmplY3RzIG90aGVyIHRoYW4gU2lnbmVyTGlzdCBlbnRyaWVzLlxuICAgICAgY29uc3QgYWNjb3VudE9iamVjdHNQYXJhbXMgPSB7XG4gICAgICAgIG1ldGhvZDogJ2FjY291bnRfb2JqZWN0cycsXG4gICAgICAgIHBhcmFtczogW3sgYWNjb3VudDogcm9vdEFjY291bnQsIGxlZGdlcl9pbmRleDogJ3ZhbGlkYXRlZCcgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgYWNjb3VudE9iamVjdHNSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKGFjY291bnRPYmplY3RzUGFyYW1zKTtcbiAgICAgIGNvbnN0IG93bmVkT2JqZWN0czogQXJyYXk8eyBMZWRnZXJFbnRyeVR5cGU6IHN0cmluZyB9PiA9IGFjY291bnRPYmplY3RzUmVzcG9uc2UuYm9keS5yZXN1bHQuYWNjb3VudF9vYmplY3RzID8/IFtdO1xuICAgICAgY29uc3QgYmxvY2tpbmdPYmplY3RzID0gb3duZWRPYmplY3RzLmZpbHRlcigobykgPT4gby5MZWRnZXJFbnRyeVR5cGUgIT09ICdTaWduZXJMaXN0Jyk7XG4gICAgICBpZiAoYmxvY2tpbmdPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBbLi4ubmV3IFNldChibG9ja2luZ09iamVjdHMubWFwKChvKSA9PiBvLkxlZGdlckVudHJ5VHlwZSkpXS5qb2luKCcsICcpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFjY291bnQgb3ducyBvYmplY3RzIHRoYXQgbXVzdCBiZSByZW1vdmVkIGJlZm9yZSBhY2NvdW50IGRlbGV0aW9uOiAke3R5cGVzfS4gYCArXG4gICAgICAgICAgICAnUGxlYXNlIHJlc29sdmUgdGhlc2Ugb2JqZWN0cyB1c2luZyB0aGUgc3RhbmRhcmQgcmVjb3ZlcnkgZmxvdyBmaXJzdC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFNlcXVlbmNlICsgMjU2IG11c3QgYmUgPD0gY3VycmVudCB2YWxpZGF0ZWQgbGVkZ2VyLlxuICAgICAgaWYgKHNlcXVlbmNlSWQgKyAyNTYgPiBjdXJyZW50TGVkZ2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWNjb3VudCBpcyB0b28gbmV3IGZvciBBY2NvdW50RGVsZXRlOiBTZXF1ZW5jZSgke3NlcXVlbmNlSWR9KSArIDI1NiA+IGN1cnJlbnRMZWRnZXIoJHtjdXJyZW50TGVkZ2VyfSkuIGAgK1xuICAgICAgICAgICAgYFdhaXQgYXQgbGVhc3QgJHtzZXF1ZW5jZUlkICsgMjU2IC0gY3VycmVudExlZGdlcn0gbW9yZSBsZWRnZXIocykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBEZXN0aW5hdGlvbiBtdXN0IGJlIGEgZnVuZGVkLCBleGlzdGluZyBYUlBMIGFjY291bnQuXG4gICAgICAvLyBTdHJpcCBhbnkgP2R0PTx0YWc+IHN1ZmZpeCDigJQgdGhlIFhSUEwgUlBDIG9ubHkgYWNjZXB0cyB0aGUgYmFyZSByLWFkZHJlc3MuXG4gICAgICBjb25zdCBkZXN0QWNjb3VudCA9IHVybC5wYXJzZShwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikucGF0aG5hbWUgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGVzdEluZm9QYXJhbXMgPSB7XG4gICAgICAgIG1ldGhvZDogJ2FjY291bnRfaW5mbycsXG4gICAgICAgIHBhcmFtczogW3sgYWNjb3VudDogZGVzdEFjY291bnQsIGxlZGdlcl9pbmRleDogJ3ZhbGlkYXRlZCcsIHN0cmljdDogdHJ1ZSB9XSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkZXN0SW5mbyA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKGRlc3RJbmZvUGFyYW1zKTtcbiAgICAgIGlmIChkZXN0SW5mby5ib2R5LnJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFJlY292ZXJ5IGRlc3RpbmF0aW9uIFwiJHtkZXN0QWNjb3VudH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgbGVkZ2VyLiBgICtcbiAgICAgICAgICAgICdBY2NvdW50RGVsZXRlIHJlcXVpcmVzIGEgZnVuZGVkIGRlc3RpbmF0aW9uIGFjY291bnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBY2NvdW50RGVsZXRlIGZlZSBtdXN0IGJlID49IG93bmVyLXJlc2VydmUgaW5jcmVtZW50IChyZXNlcnZlRGVsdGEsIGN1cnJlbnRseSAyIFhSUCkuXG4gICAgICAvLyBXZSB1c2UgcmVzZXJ2ZURlbHRhIGRpcmVjdGx5IChub3Qgb3BlbkxlZGdlckZlZSDDlyAzKSBwZXIgWFJQTCBwcm90b2NvbC5cbiAgICAgIGNvbnN0IGFjY291bnREZWxldGVGZWUgPSByZXNlcnZlRGVsdGE7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QWNjb3VudERlbGV0ZUJ1aWxkZXIoKSBhcyBBY2NvdW50RGVsZXRlQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudG8ocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gYXMgc3RyaW5nKVxuICAgICAgICAuc2VuZGVyKHJvb3RBY2NvdW50KVxuICAgICAgICAuZmxhZ3MoMjE0NzQ4MzY0OClcbiAgICAgICAgLmxhc3RMZWRnZXJTZXF1ZW5jZShjdXJyZW50TGVkZ2VyICsgMTAwMDAwMClcbiAgICAgICAgLmZlZShhY2NvdW50RGVsZXRlRmVlLnRvRml4ZWQoMCkpXG4gICAgICAgIC5zZXF1ZW5jZShzZXF1ZW5jZUlkKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgcmV0dXJuIHsgdHhIZXg6IHNlcmlhbGl6ZWRUeCwgY29pbjogdGhpcy5nZXRDaGFpbigpIH07XG4gICAgICB9XG5cbiAgICAgIGlmICgha2V5c1swXS5wcml2YXRlS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlcktleSBpcyBub3QgYSBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlcktleSA9IGtleXNbMF0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCB1c2VyU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIHVzZXJLZXksIHsgc2lnbkFzOiB1c2VyQWRkcmVzcyB9KTtcblxuICAgICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBzdHJpbmc7XG4gICAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHVzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWtleXNbMV0ucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFja3VwS2V5ID0ga2V5c1sxXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgY29uc3QgYmFja3VwU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIGJhY2t1cEtleSwgeyBzaWduQXM6IGJhY2t1cEFkZHJlc3MgfSk7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gcmlwcGxlLm11bHRpc2lnbihbdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbiwgYmFja3VwU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uXSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY291bnREZWxldGVFeHBsYW5hdGlvbjogUmVjb3ZlcnlJbmZvID0gKGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgfSkpIGFzIFJlY292ZXJ5SW5mbztcbiAgICAgIGFjY291bnREZWxldGVFeHBsYW5hdGlvbi50eEhleCA9IHNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgICAgYWNjb3VudERlbGV0ZUV4cGxhbmF0aW9uLmJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXk7XG4gICAgICAgIGFjY291bnREZWxldGVFeHBsYW5hdGlvbi5jb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY291bnREZWxldGVFeHBsYW5hdGlvbjtcbiAgICB9XG4gICAgLy8gLS0tIEVuZCBBY2NvdW50RGVsZXRlIHBhdGggLS0tXG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpIGFzIFRyYW5zZmVyQnVpbGRlcjtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC50byhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiBhcyBzdHJpbmcpXG4gICAgICAuYW1vdW50KHJlY292ZXJhYmxlQmFsYW5jZS50b0ZpeGVkKDApKVxuICAgICAgLnNlbmRlcihyb290QWNjb3VudClcbiAgICAgIC5mbGFncygyMTQ3NDgzNjQ4KVxuICAgICAgLmxhc3RMZWRnZXJTZXF1ZW5jZShjdXJyZW50TGVkZ2VyICsgMTAwMDAwMCkgLy8gZ2l2ZSBpdCAxIG1pbGxpb24gbGVkZ2VycycgdGltZSAofjEgbW9udGgsIHN1aXRhYmxlIGZvciBLUlMpXG4gICAgICAuZmVlKG9wZW5MZWRnZXJGZWUudGltZXMoMykudG9GaXhlZCgwKSkgLy8gdGhlIGZhY3RvciB0aHJlZSBpcyBmb3IgdGhlIG11bHRpc2lnbmluZ1xuICAgICAgLnNlcXVlbmNlKHNlcXVlbmNlSWQpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhIZXg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWtleXNbMF0ucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1c2VyS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJLZXkgPSBrZXlzWzBdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHVzZXJTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgdXNlcktleSwgeyBzaWduQXM6IHVzZXJBZGRyZXNzIH0pO1xuXG4gICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSB1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWtleXNbMV0ucHJpdmF0ZUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhY2t1cEtleSBpcyBub3QgYSBwcml2YXRlIGtleWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwS2V5ID0ga2V5c1sxXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGJhY2t1cFNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCBiYWNrdXBLZXksIHsgc2lnbkFzOiBiYWNrdXBBZGRyZXNzIH0pO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSByaXBwbGUubXVsdGlzaWduKFt1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uLCBiYWNrdXBTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb25dKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uOiBSZWNvdmVyeUluZm8gPSAoYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIH0pKSBhcyBSZWNvdmVyeUluZm87XG5cbiAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLnR4SGV4ID0gc2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5jb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWNvdmVyWHJwVG9rZW4ocGFyYW1zLCB0b2tlblBhcmFtcykge1xuICAgIGNvbnN0IHsgY3VycmVuY3ksIGlzc3VlciB9ID0gdG9rZW5QYXJhbXM7XG4gICAgY29uc3QgdG9rZW5OYW1lID0gKHV0aWxzLmdldFhycFRva2VuKGlzc3VlciwgY3VycmVuY3kpIGFzIFhycENvaW4pLm5hbWU7XG4gICAgY29uc3QgbGluZXMgPSB0b2tlblBhcmFtcy5hY2NvdW50TGluZXMuYm9keS5yZXN1bHQubGluZXM7XG5cbiAgICBsZXQgYW1vdW50O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYgKGxpbmUuY3VycmVuY3kgPT09IGN1cnJlbmN5ICYmIGxpbmUuYWNjb3VudCA9PT0gaXNzdWVyKSB7XG4gICAgICAgIGFtb3VudCA9IGxpbmUuYmFsYW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvZXMgbm90IGhhdmUgVHJ1c3RsaW5lIHdpdGggJHtpc3N1ZXJ9YCk7XG4gICAgfVxuICAgIGlmIChhbW91bnQgPT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb2VzIG5vdCBoYXZlIGZ1bmRzIHRvIHJlY292ZXJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNpbWFsUGxhY2VzID0gY29pbnMuZ2V0KHRva2VuTmFtZSkuZGVjaW1hbFBsYWNlcztcbiAgICBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCkuc2hpZnRlZEJ5KGRlY2ltYWxQbGFjZXMpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IEZMQUdfVkFMVUUgPSAyMTQ3NDgzNjQ4O1xuXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0b2tlbk5hbWUpKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCkgYXMgVG9rZW5UcmFuc2ZlckJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyXG4gICAgICAudG8odG9rZW5QYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbilcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnNlbmRlcihwYXJhbXMucm9vdEFkZHJlc3MpXG4gICAgICAuZmxhZ3MoRkxBR19WQUxVRSlcbiAgICAgIC5sYXN0TGVkZ2VyU2VxdWVuY2UodG9rZW5QYXJhbXMuY3VycmVudExlZGdlciArIDEwMDAwMDApIC8vIGdpdmUgaXQgMSBtaWxsaW9uIGxlZGdlcnMnIHRpbWUgKH4xIG1vbnRoLCBzdWl0YWJsZSBmb3IgS1JTKVxuICAgICAgLmZlZSh0b2tlblBhcmFtcy5vcGVuTGVkZ2VyRmVlLnRpbWVzKDMpLnRvRml4ZWQoMCkpIC8vIHRoZSBmYWN0b3IgdGhyZWUgaXMgZm9yIHRoZSBtdWx0aXNpZ25pbmdcbiAgICAgIC5zZXF1ZW5jZSh0b2tlblBhcmFtcy5zZXF1ZW5jZUlkKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGNvbnN0IHsga2V5cywgaXNLcnNSZWNvdmVyeSwgaXNVbnNpZ25lZFN3ZWVwLCB1c2VyQWRkcmVzcywgYmFja3VwQWRkcmVzcyB9ID0gdG9rZW5QYXJhbXM7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eEhleDogc2VyaWFsaXplZFR4LFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgha2V5c1swXS5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXJLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5ID0ga2V5c1swXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB1c2VyU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIHVzZXJLZXksIHsgc2lnbkFzOiB1c2VyQWRkcmVzcyB9KTtcblxuICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbjogc3RyaW5nO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFrZXlzWzFdLnByaXZhdGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrdXBLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cEtleSA9IGtleXNbMV0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBiYWNrdXBTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgYmFja3VwS2V5LCB7IHNpZ25BczogYmFja3VwQWRkcmVzcyB9KTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gcmlwcGxlLm11bHRpc2lnbihbdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbiwgYmFja3VwU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uXSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjogUmVjb3ZlcnlJbmZvID0gKGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiBzaWduZWRUcmFuc2FjdGlvbixcbiAgICB9KSkgYXMgUmVjb3ZlcnlJbmZvO1xuXG4gICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi50eEhleCA9IHNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleTtcbiAgICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uY29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcga2V5cGFpciBmb3IgdGhpcyBjb2luLlxuICAgKiBAcGFyYW0gc2VlZCBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IFhycEtleVBhaXIoeyBzZWVkIH0pIDogbmV3IFhycEtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcbiAgICBpZiAoIWtleXMueHBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy54cHViLFxuICAgICAgcHJ2OiBrZXlzLnhwcnYsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkocGFyYW1zOiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn1cbiJdfQ==