'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
// istanbul ignore next
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { Eif (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
// istanbul ignore next
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _findNodeModules = require('find-node-modules');
var _findNodeModules2 = _interopRequireDefault(_findNodeModules);
var _commonUtil = require('../common/util');
exports.addPathToAdapterConfig = addPathToAdapterConfig;
exports.getNearestNodeModulesDirectory = getNearestNodeModulesDirectory;
exports.getNearestProjectRootDirectory = getNearestProjectRootDirectory;
exports.getNpmInstallStringMappings = getNpmInstallStringMappings;
exports.getPrompter = getPrompter;
exports.generateNpmInstallAdapterCommand = generateNpmInstallAdapterCommand;
exports.resolveAdapterPath = resolveAdapterPath;
/**
* ADAPTER
*
* Adapter is generally responsible for actually installing adapters to an
* end user's project. It does not perform checks to determine if there is
* a previous commitizen adapter installed or if the proper fields were
* provided. It defers that responsibility to init.
*/
/**
* Modifies the package.json, sets config.commitizen.path to the path of the adapter
* Must be passed an absolute path to the cli's root
*/
function addPathToAdapterConfig(sh, cliPath, repoPath, adapterNpmName) {
var packageJsonPath = _path2['default'].join(getNearestProjectRootDirectory(), 'package.json');
sh.exec(cliPath + '/node_modules/.bin/json -I -f ' + packageJsonPath + ' -e \'if(!this.config) {this.config={};}; if(!this.config.commitizen) { this.config.commitizen={};}; this.config.commitizen.path="./node_modules/' + adapterNpmName + '"\'');
}
/**
* Generates an npm install command given a map of strings and a package name
*/
function generateNpmInstallAdapterCommand(stringMappings, adapterNpmName) {
// Start with an initial npm install command
var installAdapterCommand = 'npm install ' + adapterNpmName;
// Append the neccesary arguments to it based on user preferences
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = stringMappings.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _step$value = _slicedToArray(_step.value, 2);
var key = _step$value[0];
var value = _step$value[1];
if (value) {
installAdapterCommand = installAdapterCommand + ' ' + value;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
Iif (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
Iif (_didIteratorError) {
throw _iteratorError;
}
}
}
return installAdapterCommand;
}
/**
* Gets the nearest npm_modules directory
*/
function getNearestNodeModulesDirectory(options) {
// Get the nearest node_modules directories to the current working directory
var nodeModulesDirectories = (0, _findNodeModules2['default'])(options);
// Make sure we find a node_modules folder
Eif (nodeModulesDirectories && nodeModulesDirectories.length > 0) {
return nodeModulesDirectories[0];
} else {
console.error('Error: Could not locate node_modules in your project\'s root directory. Did you forget to npm init or npm install?');
}
}
/**
* Gets the nearest project root directory
*/
function getNearestProjectRootDirectory(options) {
return _path2['default'].join(process.cwd(), getNearestNodeModulesDirectory(options), '/../');
}
/**
* Gets a map of arguments where the value is the corresponding npm strings
*/
function getNpmInstallStringMappings(save, saveDev, saveExact, force) {
return new Map().set('save', save && !saveDev ? '--save' : undefined).set('saveDev', saveDev ? '--save-dev' : undefined).set('saveExact', saveExact ? '--save-exact' : undefined).set('force', force ? '--force' : undefined);
}
/**
* Gets the prompter from an adapter given an adapter path
*/
function getPrompter(adapterPath) {
// We need to handle directories and files, so resolve the parh first
var resolvedAdapterPath = resolveAdapterPath(adapterPath);
// Load the adapter
var adapter = require(resolvedAdapterPath);
Eif (adapter && adapter.prompter && (0, _commonUtil.isFunction)(adapter.prompter)) {
return adapter.prompter;
} else {
throw "Could not find prompter method in the provided adapter module: " + adapterPath;
}
}
/**
* Given a path, which can be a directory or file, will
* return a located adapter path or will throw.
*/
function resolveAdapterPath(inboundAdapterPath) {
var outboundAdapterPath = undefined;
// Try to open the provided path
try {
// If we're given a directory, append index.js
if (_fs2['default'].lstatSync(inboundAdapterPath).isDirectory()) {
// Modify the path and make sure the modified path exists
outboundAdapterPath = _path2['default'].join(inboundAdapterPath, 'index.js');
_fs2['default'].lstatSync(outboundAdapterPath);
} else {
// The file exists and is a file, so just return it
outboundAdapterPath = inboundAdapterPath;
}
return outboundAdapterPath;
} catch (err) {
throw err;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3RyYXZpcy9idWlsZC9jb21taXRpemVuL2N6LWNsaS9zcmMvY29tbWl0aXplbi9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7b0JBQWlCLE1BQU07Ozs7a0JBQ1IsSUFBSTs7OzsrQkFDUyxtQkFBbUI7Ozs7MEJBRXRCLGdCQUFnQjs7UUFHdkMsc0JBQXNCLEdBQXRCLHNCQUFzQjtRQUN0Qiw4QkFBOEIsR0FBOUIsOEJBQThCO1FBQzlCLDhCQUE4QixHQUE5Qiw4QkFBOEI7UUFDOUIsMkJBQTJCLEdBQTNCLDJCQUEyQjtRQUMzQixXQUFXLEdBQVgsV0FBVztRQUNYLGdDQUFnQyxHQUFoQyxnQ0FBZ0M7UUFDaEMsa0JBQWtCLEdBQWxCLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JwQixTQUFTLHNCQUFzQixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRTtBQUNyRSxNQUFJLGVBQWUsR0FBRyxrQkFBSyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNsRixJQUFFLENBQUMsSUFBSSxDQUFJLE9BQU8sc0NBQWlDLGVBQWUseUpBQW9KLGNBQWMsU0FBTSxDQUFDO0NBQzVPOzs7OztBQUtELFNBQVMsZ0NBQWdDLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRTs7O0FBR3hFLE1BQUkscUJBQXFCLG9CQUFrQixjQUFjLEFBQUUsQ0FBQzs7Ozs7Ozs7QUFHNUQseUJBQXdCLGNBQWMsQ0FBQyxPQUFPLEVBQUUsOEhBQUU7OztVQUF6QyxHQUFHO1VBQUUsS0FBSzs7QUFDakIsVUFBRyxLQUFLLEVBQUU7QUFDUiw2QkFBcUIsR0FBRyxxQkFBcUIsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO09BQzdEO0tBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFRCxTQUFPLHFCQUFxQixDQUFDO0NBQzlCOzs7OztBQUtELFNBQVMsOEJBQThCLENBQUMsT0FBTyxFQUFFOzs7QUFHL0MsTUFBSSxzQkFBc0IsR0FBRyxrQ0FBZ0IsT0FBTyxDQUFDLENBQUM7OztBQUd0RCxNQUFHLHNCQUFzQixJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDOUQsV0FBTyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNsQyxNQUFNO0FBQ0wsV0FBTyxDQUFDLEtBQUssc0hBQXFILENBQUE7R0FDbkk7Q0FDRjs7Ozs7QUFLRCxTQUFTLDhCQUE4QixDQUFDLE9BQU8sRUFBRTtBQUMvQyxTQUFPLGtCQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsOEJBQThCLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDbEY7Ozs7O0FBS0QsU0FBUywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7QUFDcEUsU0FBTyxJQUFJLEdBQUcsRUFBRSxDQUNiLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQUFBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUksUUFBUSxHQUFDLFNBQVMsQ0FBQyxDQUNwRCxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sR0FBRyxZQUFZLEdBQUMsU0FBUyxDQUFDLENBQ2hELEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxHQUFHLGNBQWMsR0FBQyxTQUFTLENBQUMsQ0FDdEQsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsU0FBUyxHQUFDLFNBQVMsQ0FBQyxDQUFDO0NBQzlDOzs7OztBQUtELFNBQVMsV0FBVyxDQUFDLFdBQVcsRUFBRTs7QUFFaEMsTUFBSSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7O0FBRzFELE1BQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOztBQUUzQyxNQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLDRCQUFXLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUM3RCxXQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7R0FDMUIsTUFBTTtBQUNMLFVBQU0saUVBQWlFLEdBQUcsV0FBVyxDQUFDO0dBQ3ZGO0NBQ0Y7Ozs7OztBQU1ELFNBQVMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUU7QUFDOUMsTUFBSSxtQkFBbUIsWUFBQSxDQUFDOzs7QUFHeEIsTUFBSTs7O0FBR0YsUUFBRyxnQkFBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTs7O0FBR2pELHlCQUFtQixHQUFHLGtCQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNoRSxzQkFBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQUVuQyxNQUFNOztBQUVMLHlCQUFtQixHQUFHLGtCQUFrQixDQUFDO0tBQzFDO0FBQ0QsV0FBTyxtQkFBbUIsQ0FBQztHQUU1QixDQUFDLE9BQU0sR0FBRyxFQUFFO0FBQ1gsVUFBTSxHQUFHLENBQUM7R0FDWDtDQUVGIiwiZmlsZSI6Ii9ob21lL3RyYXZpcy9idWlsZC9jb21taXRpemVuL2N6LWNsaS9zcmMvY29tbWl0aXplbi9hZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGZpbmROb2RlTW9kdWxlcyBmcm9tICdmaW5kLW5vZGUtbW9kdWxlcyc7XG5cbmltcG9ydCB7aXNGdW5jdGlvbn0gZnJvbSAnLi4vY29tbW9uL3V0aWwnO1xuXG5leHBvcnQge1xuICBhZGRQYXRoVG9BZGFwdGVyQ29uZmlnLFxuICBnZXROZWFyZXN0Tm9kZU1vZHVsZXNEaXJlY3RvcnksXG4gIGdldE5lYXJlc3RQcm9qZWN0Um9vdERpcmVjdG9yeSxcbiAgZ2V0TnBtSW5zdGFsbFN0cmluZ01hcHBpbmdzLFxuICBnZXRQcm9tcHRlcixcbiAgZ2VuZXJhdGVOcG1JbnN0YWxsQWRhcHRlckNvbW1hbmQsXG4gIHJlc29sdmVBZGFwdGVyUGF0aFxufTtcblxuLyoqXG4gKiBBREFQVEVSXG4gKiBcbiAqIEFkYXB0ZXIgaXMgZ2VuZXJhbGx5IHJlc3BvbnNpYmxlIGZvciBhY3R1YWxseSBpbnN0YWxsaW5nIGFkYXB0ZXJzIHRvIGFuIFxuICogZW5kIHVzZXIncyBwcm9qZWN0LiBJdCBkb2VzIG5vdCBwZXJmb3JtIGNoZWNrcyB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXNcbiAqIGEgcHJldmlvdXMgY29tbWl0aXplbiBhZGFwdGVyIGluc3RhbGxlZCBvciBpZiB0aGUgcHJvcGVyIGZpZWxkcyB3ZXJlXG4gKiBwcm92aWRlZC4gSXQgZGVmZXJzIHRoYXQgcmVzcG9uc2liaWxpdHkgdG8gaW5pdC4gXG4gKi9cblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGFja2FnZS5qc29uLCBzZXRzIGNvbmZpZy5jb21taXRpemVuLnBhdGggdG8gdGhlIHBhdGggb2YgdGhlIGFkYXB0ZXJcbiAqIE11c3QgYmUgcGFzc2VkIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGNsaSdzIHJvb3RcbiAqL1xuZnVuY3Rpb24gYWRkUGF0aFRvQWRhcHRlckNvbmZpZyhzaCwgY2xpUGF0aCwgcmVwb1BhdGgsIGFkYXB0ZXJOcG1OYW1lKSB7XG4gIGxldCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZ2V0TmVhcmVzdFByb2plY3RSb290RGlyZWN0b3J5KCksICdwYWNrYWdlLmpzb24nKTtcbiAgc2guZXhlYyhgJHtjbGlQYXRofS9ub2RlX21vZHVsZXMvLmJpbi9qc29uIC1JIC1mICR7cGFja2FnZUpzb25QYXRofSAtZSAnaWYoIXRoaXMuY29uZmlnKSB7dGhpcy5jb25maWc9e307fTsgaWYoIXRoaXMuY29uZmlnLmNvbW1pdGl6ZW4pIHsgdGhpcy5jb25maWcuY29tbWl0aXplbj17fTt9OyB0aGlzLmNvbmZpZy5jb21taXRpemVuLnBhdGg9XFxcIi4vbm9kZV9tb2R1bGVzLyR7YWRhcHRlck5wbU5hbWV9XFxcIidgKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gbnBtIGluc3RhbGwgY29tbWFuZCBnaXZlbiBhIG1hcCBvZiBzdHJpbmdzIGFuZCBhIHBhY2thZ2UgbmFtZVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5wbUluc3RhbGxBZGFwdGVyQ29tbWFuZChzdHJpbmdNYXBwaW5ncywgYWRhcHRlck5wbU5hbWUpIHtcbiBcbiAgLy8gU3RhcnQgd2l0aCBhbiBpbml0aWFsIG5wbSBpbnN0YWxsIGNvbW1hbmRcbiAgbGV0IGluc3RhbGxBZGFwdGVyQ29tbWFuZCA9IGBucG0gaW5zdGFsbCAke2FkYXB0ZXJOcG1OYW1lfWA7XG4gIFxuICAvLyBBcHBlbmQgdGhlIG5lY2Nlc2FyeSBhcmd1bWVudHMgdG8gaXQgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlc1xuICBmb3IobGV0IFtrZXksIHZhbHVlXSBvZiBzdHJpbmdNYXBwaW5ncy5lbnRyaWVzKCkpIHtcbiAgICBpZih2YWx1ZSkge1xuICAgICAgaW5zdGFsbEFkYXB0ZXJDb21tYW5kID0gaW5zdGFsbEFkYXB0ZXJDb21tYW5kICsgJyAnICsgdmFsdWU7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gaW5zdGFsbEFkYXB0ZXJDb21tYW5kO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5lYXJlc3QgbnBtX21vZHVsZXMgZGlyZWN0b3J5XG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3ROb2RlTW9kdWxlc0RpcmVjdG9yeShvcHRpb25zKSB7XG4gIFxuICAvLyBHZXQgdGhlIG5lYXJlc3Qgbm9kZV9tb2R1bGVzIGRpcmVjdG9yaWVzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gIGxldCBub2RlTW9kdWxlc0RpcmVjdG9yaWVzID0gZmluZE5vZGVNb2R1bGVzKG9wdGlvbnMpO1xuICBcbiAgIC8vIE1ha2Ugc3VyZSB3ZSBmaW5kIGEgbm9kZV9tb2R1bGVzIGZvbGRlclxuICBpZihub2RlTW9kdWxlc0RpcmVjdG9yaWVzICYmIG5vZGVNb2R1bGVzRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBub2RlTW9kdWxlc0RpcmVjdG9yaWVzWzBdO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBDb3VsZCBub3QgbG9jYXRlIG5vZGVfbW9kdWxlcyBpbiB5b3VyIHByb2plY3QncyByb290IGRpcmVjdG9yeS4gRGlkIHlvdSBmb3JnZXQgdG8gbnBtIGluaXQgb3IgbnBtIGluc3RhbGw/YClcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIG5lYXJlc3QgcHJvamVjdCByb290IGRpcmVjdG9yeVxuICovXG5mdW5jdGlvbiBnZXROZWFyZXN0UHJvamVjdFJvb3REaXJlY3Rvcnkob3B0aW9ucykge1xuICByZXR1cm4gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGdldE5lYXJlc3ROb2RlTW9kdWxlc0RpcmVjdG9yeShvcHRpb25zKSwgJy8uLi8nKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbWFwIG9mIGFyZ3VtZW50cyB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgbnBtIHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0TnBtSW5zdGFsbFN0cmluZ01hcHBpbmdzKHNhdmUsIHNhdmVEZXYsIHNhdmVFeGFjdCwgZm9yY2UpIHtcbiAgcmV0dXJuIG5ldyBNYXAoKVxuICAgIC5zZXQoJ3NhdmUnLCAoc2F2ZSAmJiAhc2F2ZURldikgPyAnLS1zYXZlJzp1bmRlZmluZWQpXG4gICAgLnNldCgnc2F2ZURldicsIHNhdmVEZXYgPyAnLS1zYXZlLWRldic6dW5kZWZpbmVkKVxuICAgIC5zZXQoJ3NhdmVFeGFjdCcsIHNhdmVFeGFjdCA/ICctLXNhdmUtZXhhY3QnOnVuZGVmaW5lZClcbiAgICAuc2V0KCdmb3JjZScsIGZvcmNlID8gJy0tZm9yY2UnOnVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvbXB0ZXIgZnJvbSBhbiBhZGFwdGVyIGdpdmVuIGFuIGFkYXB0ZXIgcGF0aFxuICovXG5mdW5jdGlvbiBnZXRQcm9tcHRlcihhZGFwdGVyUGF0aCkge1xuICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMsIHNvIHJlc29sdmUgdGhlIHBhcmggZmlyc3RcbiAgbGV0IHJlc29sdmVkQWRhcHRlclBhdGggPSByZXNvbHZlQWRhcHRlclBhdGgoYWRhcHRlclBhdGgpO1xuXG4gIC8vIExvYWQgdGhlIGFkYXB0ZXJcbiAgbGV0IGFkYXB0ZXIgPSByZXF1aXJlKHJlc29sdmVkQWRhcHRlclBhdGgpO1xuICBcbiAgaWYoYWRhcHRlciAmJiBhZGFwdGVyLnByb21wdGVyICYmIGlzRnVuY3Rpb24oYWRhcHRlci5wcm9tcHRlcikpIHtcbiAgICAgcmV0dXJuIGFkYXB0ZXIucHJvbXB0ZXI7IFxuICB9IGVsc2Uge1xuICAgIHRocm93IFwiQ291bGQgbm90IGZpbmQgcHJvbXB0ZXIgbWV0aG9kIGluIHRoZSBwcm92aWRlZCBhZGFwdGVyIG1vZHVsZTogXCIgKyBhZGFwdGVyUGF0aDtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgcGF0aCwgd2hpY2ggY2FuIGJlIGEgZGlyZWN0b3J5IG9yIGZpbGUsIHdpbGxcbiAqIHJldHVybiBhIGxvY2F0ZWQgYWRhcHRlciBwYXRoIG9yIHdpbGwgdGhyb3cuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBZGFwdGVyUGF0aChpbmJvdW5kQWRhcHRlclBhdGgpIHtcbiAgbGV0IG91dGJvdW5kQWRhcHRlclBhdGg7XG4gIFxuICAvLyBUcnkgdG8gb3BlbiB0aGUgcHJvdmlkZWQgcGF0aFxuICB0cnkge1xuICAgIFxuICAgIC8vIElmIHdlJ3JlIGdpdmVuIGEgZGlyZWN0b3J5LCBhcHBlbmQgaW5kZXguanMgXG4gICAgaWYoZnMubHN0YXRTeW5jKGluYm91bmRBZGFwdGVyUGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgXG4gICAgICAvLyBNb2RpZnkgdGhlIHBhdGggYW5kIG1ha2Ugc3VyZSB0aGUgbW9kaWZpZWQgcGF0aCBleGlzdHNcbiAgICAgIG91dGJvdW5kQWRhcHRlclBhdGggPSBwYXRoLmpvaW4oaW5ib3VuZEFkYXB0ZXJQYXRoLCAnaW5kZXguanMnKTtcbiAgICAgIGZzLmxzdGF0U3luYyhvdXRib3VuZEFkYXB0ZXJQYXRoKTsgXG4gICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGZpbGUgZXhpc3RzIGFuZCBpcyBhIGZpbGUsIHNvIGp1c3QgcmV0dXJuIGl0XG4gICAgICBvdXRib3VuZEFkYXB0ZXJQYXRoID0gaW5ib3VuZEFkYXB0ZXJQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gb3V0Ym91bmRBZGFwdGVyUGF0aDtcbiAgICBcbiAgfSBjYXRjaChlcnIpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgXG59Il19 |