UNPKG

@sharekey/meteor-desktop

Version:

Build a Meteor's desktop client with hot code push.

165 lines (153 loc) 21.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); var _lodash = require("lodash"); var _log = _interopRequireDefault(require("./log")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // eslint-disable-next-line no-unused-vars /** * Utility class designed for merging dependencies list with simple validation and duplicate * detection. * * @class */ class DependenciesManager { /** * @param {MeteorDesktop} $ - context * @param {Object} defaultDependencies - core dependencies list * @constructor */ constructor($, defaultDependencies) { this.log = new _log.default('dependenciesManager'); this.$ = $; this.dependencies = defaultDependencies; // Regexes for matching certain types of dependencies version. // https://docs.npmjs.com/files/package.json#dependencies this.regexes = { local: /^(\.\.\/|~\/|\.\/|\/)/, git: /^git(\+(ssh|http)s?)?/, github: /^\w+-?\w+(?!-)\//, http: /^https?.+tar\.gz/, file: /^file:/ }; // Check for commit hashes. const gitCheck = { type: 'regex', regex: /#[a-f0-9]{7,40}/, test: 'match', message: 'git or github link must have a commit hash' }; // Check for displaying warnings when npm package from local path is used. const localCheck = { onceName: 'localCheck', type: 'warning', message: 'using dependencies from local paths is permitted' + ' but dangerous - read more in README.md' }; this.checks = { local: localCheck, file: localCheck, git: gitCheck, github: gitCheck, version: { type: 'regex', // Matches all the semver ranges operators, empty strings and `*`. regex: /[\^|><= ~-]|\.x|^$|^\*$/, test: 'do not match', message: 'semver ranges are forbidden, please specify exact version' } }; } /** * Just a public getter. * @returns {Object} */ getDependencies() { return this.dependencies; } /** * Returns local dependencies. * @returns {Object} */ getLocalDependencies() { return Object.keys(this.dependencies).filter(dependency => this.regexes.local.test(this.dependencies[dependency]) || this.regexes.file.test(this.dependencies[dependency])).reduce((localDependencies, currentDependency) => Object.assign(localDependencies, { [currentDependency]: this.dependencies[currentDependency] }), {}); } /** * Returns remote dependencies. * @returns {Object} */ getRemoteDependencies() { return Object.keys(this.dependencies).filter(dependency => !this.regexes.local.test(this.dependencies[dependency]) && !this.regexes.file.test(this.dependencies[dependency])).reduce((localDependencies, currentDependency) => Object.assign(localDependencies, { [currentDependency]: this.dependencies[currentDependency] }), {}); } /** * Merges dependencies into one list. * * @param {string} from - describes where the dependencies were set * @param {Object} dependencies - dependencies list */ mergeDependencies(from, dependencies) { if (this.validateDependenciesVersions(from, dependencies)) { this.detectDuplicatedDependencies(from, dependencies); (0, _lodash.assignIn)(this.dependencies, dependencies); } } /** * Detects dependency version type. * @param {string} version - version string of the dependency * @return {string} */ detectDependencyVersionType(version) { const type = Object.keys(this.regexes).find(dependencyType => this.regexes[dependencyType].test(version)); return type || 'version'; } /** * Validates semver and detect ranges. * * @param {string} from - describes where the dependencies were set * @param {Object} dependencies - dependencies list */ validateDependenciesVersions(from, dependencies) { const warningsShown = {}; (0, _lodash.forEach)(dependencies, (version, name) => { const type = this.detectDependencyVersionType(version); if (this.checks[type]) { const check = this.checks[type]; if (check.type === 'regex') { const checkResult = check.test === 'match' ? this.checks[type].regex.test(version) : !this.checks[type].regex.test(version); if (!checkResult) { throw new Error(`dependency ${name}:${version} from ${from} failed version ` + `check with message: ${this.checks[type].message}`); } } if (check.type === 'warning' && !warningsShown[check.onceName]) { warningsShown[check.onceName] = true; this.log.warn(`dependency ${name}:${version} from ${from} caused a` + ` warning: ${check.message}`); } } }); return true; } /** * Detects duplicates. * * @param {string} from - describes where the dependencies were set * @param {Object} dependencies - dependencies list */ detectDuplicatedDependencies(from, dependencies) { const duplicates = (0, _lodash.intersection)(Object.keys(dependencies), Object.keys(this.dependencies)); if (duplicates.length > 0) { duplicates.forEach(name => { if (dependencies[name] !== this.dependencies[name]) { throw new Error(`While processing dependencies from ${from}, a dependency ` + `${name}: ${dependencies[name]} was found to be conflicting with a ` + `dependency (${this.dependencies[name]}) that was already declared in ` + 'other module or it is used in core of the electron app.'); } }); } } } exports.default = DependenciesManager; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2xvZGFzaCIsIl9sb2ciLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkRlcGVuZGVuY2llc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsIiQiLCJkZWZhdWx0RGVwZW5kZW5jaWVzIiwibG9nIiwiTG9nIiwiZGVwZW5kZW5jaWVzIiwicmVnZXhlcyIsImxvY2FsIiwiZ2l0IiwiZ2l0aHViIiwiaHR0cCIsImZpbGUiLCJnaXRDaGVjayIsInR5cGUiLCJyZWdleCIsInRlc3QiLCJtZXNzYWdlIiwibG9jYWxDaGVjayIsIm9uY2VOYW1lIiwiY2hlY2tzIiwidmVyc2lvbiIsImdldERlcGVuZGVuY2llcyIsImdldExvY2FsRGVwZW5kZW5jaWVzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImRlcGVuZGVuY3kiLCJyZWR1Y2UiLCJsb2NhbERlcGVuZGVuY2llcyIsImN1cnJlbnREZXBlbmRlbmN5IiwiYXNzaWduIiwiZ2V0UmVtb3RlRGVwZW5kZW5jaWVzIiwibWVyZ2VEZXBlbmRlbmNpZXMiLCJmcm9tIiwidmFsaWRhdGVEZXBlbmRlbmNpZXNWZXJzaW9ucyIsImRldGVjdER1cGxpY2F0ZWREZXBlbmRlbmNpZXMiLCJhc3NpZ25JbiIsImRldGVjdERlcGVuZGVuY3lWZXJzaW9uVHlwZSIsImZpbmQiLCJkZXBlbmRlbmN5VHlwZSIsIndhcm5pbmdzU2hvd24iLCJmb3JFYWNoIiwibmFtZSIsImNoZWNrIiwiY2hlY2tSZXN1bHQiLCJFcnJvciIsIndhcm4iLCJkdXBsaWNhdGVzIiwiaW50ZXJzZWN0aW9uIiwibGVuZ3RoIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL2xpYi9kZXBlbmRlbmNpZXNNYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IHsgZm9yRWFjaCwgYXNzaWduSW4sIGludGVyc2VjdGlvbiB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZGVzaWduZWQgZm9yIG1lcmdpbmcgZGVwZW5kZW5jaWVzIGxpc3Qgd2l0aCBzaW1wbGUgdmFsaWRhdGlvbiBhbmQgZHVwbGljYXRlXG4gKiBkZXRlY3Rpb24uXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlcGVuZGVuY2llc01hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAgICAgICAgICAgICAgICAgICAtIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgIGRlZmF1bHREZXBlbmRlbmNpZXMgLSBjb3JlIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCwgZGVmYXVsdERlcGVuZGVuY2llcykge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2RlcGVuZGVuY2llc01hbmFnZXInKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZWZhdWx0RGVwZW5kZW5jaWVzO1xuXG4gICAgICAgIC8vIFJlZ2V4ZXMgZm9yIG1hdGNoaW5nIGNlcnRhaW4gdHlwZXMgb2YgZGVwZW5kZW5jaWVzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vZmlsZXMvcGFja2FnZS5qc29uI2RlcGVuZGVuY2llc1xuICAgICAgICB0aGlzLnJlZ2V4ZXMgPSB7XG4gICAgICAgICAgICBsb2NhbDogL14oXFwuXFwuXFwvfH5cXC98XFwuXFwvfFxcLykvLFxuICAgICAgICAgICAgZ2l0OiAvXmdpdChcXCsoc3NofGh0dHApcz8pPy8sXG4gICAgICAgICAgICBnaXRodWI6IC9eXFx3Ky0/XFx3Kyg/IS0pXFwvLyxcbiAgICAgICAgICAgIGh0dHA6IC9eaHR0cHM/Lit0YXJcXC5nei8sXG4gICAgICAgICAgICBmaWxlOiAvXmZpbGU6L1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjb21taXQgaGFzaGVzLlxuICAgICAgICBjb25zdCBnaXRDaGVjayA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWdleCcsXG4gICAgICAgICAgICByZWdleDogLyNbYS1mMC05XXs3LDQwfS8sXG4gICAgICAgICAgICB0ZXN0OiAnbWF0Y2gnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2dpdCBvciBnaXRodWIgbGluayBtdXN0IGhhdmUgYSBjb21taXQgaGFzaCdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZGlzcGxheWluZyB3YXJuaW5ncyB3aGVuIG5wbSBwYWNrYWdlIGZyb20gbG9jYWwgcGF0aCBpcyB1c2VkLlxuICAgICAgICBjb25zdCBsb2NhbENoZWNrID0ge1xuICAgICAgICAgICAgb25jZU5hbWU6ICdsb2NhbENoZWNrJyxcbiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd1c2luZyBkZXBlbmRlbmNpZXMgZnJvbSBsb2NhbCBwYXRocyBpcyBwZXJtaXR0ZWQnICtcbiAgICAgICAgICAgICcgYnV0IGRhbmdlcm91cyAtIHJlYWQgbW9yZSBpbiBSRUFETUUubWQnXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5jaGVja3MgPSB7XG4gICAgICAgICAgICBsb2NhbDogbG9jYWxDaGVjayxcbiAgICAgICAgICAgIGZpbGU6IGxvY2FsQ2hlY2ssXG4gICAgICAgICAgICBnaXQ6IGdpdENoZWNrLFxuICAgICAgICAgICAgZ2l0aHViOiBnaXRDaGVjayxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVnZXgnLFxuICAgICAgICAgICAgICAgIC8vIE1hdGNoZXMgYWxsIHRoZSBzZW12ZXIgcmFuZ2VzIG9wZXJhdG9ycywgZW1wdHkgc3RyaW5ncyBhbmQgYCpgLlxuICAgICAgICAgICAgICAgIHJlZ2V4OiAvW1xcXnw+PD0gfi1dfFxcLnh8XiR8XlxcKiQvLFxuICAgICAgICAgICAgICAgIHRlc3Q6ICdkbyBub3QgbWF0Y2gnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzZW12ZXIgcmFuZ2VzIGFyZSBmb3JiaWRkZW4sIHBsZWFzZSBzcGVjaWZ5IGV4YWN0IHZlcnNpb24nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVzdCBhIHB1YmxpYyBnZXR0ZXIuXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGxvY2FsIGRlcGVuZGVuY2llcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldExvY2FsRGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4ZXMubG9jYWwudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdleGVzLmZpbGUudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGxvY2FsRGVwZW5kZW5jaWVzLCBjdXJyZW50RGVwZW5kZW5jeSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbY3VycmVudERlcGVuZGVuY3ldOiB0aGlzLmRlcGVuZGVuY2llc1tjdXJyZW50RGVwZW5kZW5jeV0gfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVtb3RlIGRlcGVuZGVuY2llcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFJlbW90ZURlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdFxuICAgICAgICAgICAgLmtleXModGhpcy5kZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPT5cbiAgICAgICAgICAgICAgICAgICAgIXRoaXMucmVnZXhlcy5sb2NhbC50ZXN0KHRoaXMuZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5yZWdleGVzLmZpbGUudGVzdCh0aGlzLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGxvY2FsRGVwZW5kZW5jaWVzLCBjdXJyZW50RGVwZW5kZW5jeSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbY3VycmVudERlcGVuZGVuY3ldOiB0aGlzLmRlcGVuZGVuY2llc1tjdXJyZW50RGVwZW5kZW5jeV0gfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBkZXBlbmRlbmNpZXMgaW50byBvbmUgbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tICAgICAgICAgLSBkZXNjcmliZXMgd2hlcmUgdGhlIGRlcGVuZGVuY2llcyB3ZXJlIHNldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXBlbmRlbmNpZXMgLSBkZXBlbmRlbmNpZXMgbGlzdFxuICAgICAqL1xuICAgIG1lcmdlRGVwZW5kZW5jaWVzKGZyb20sIGRlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURlcGVuZGVuY2llc1ZlcnNpb25zKGZyb20sIGRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0RHVwbGljYXRlZERlcGVuZGVuY2llcyhmcm9tLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgYXNzaWduSW4odGhpcy5kZXBlbmRlbmNpZXMsIGRlcGVuZGVuY2llcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3RzIGRlcGVuZGVuY3kgdmVyc2lvbiB0eXBlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZGV0ZWN0RGVwZW5kZW5jeVZlcnNpb25UeXBlKHZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IE9iamVjdC5rZXlzKHRoaXMucmVnZXhlcylcbiAgICAgICAgICAgIC5maW5kKGRlcGVuZGVuY3lUeXBlID0+IHRoaXMucmVnZXhlc1tkZXBlbmRlbmN5VHlwZV0udGVzdCh2ZXJzaW9uKSk7XG4gICAgICAgIHJldHVybiB0eXBlIHx8ICd2ZXJzaW9uJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgc2VtdmVyIGFuZCBkZXRlY3QgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb20gICAgICAgICAtIGRlc2NyaWJlcyB3aGVyZSB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgc2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICovXG4gICAgdmFsaWRhdGVEZXBlbmRlbmNpZXNWZXJzaW9ucyhmcm9tLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3NTaG93biA9IHt9O1xuICAgICAgICBmb3JFYWNoKGRlcGVuZGVuY2llcywgKHZlcnNpb24sIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRldGVjdERlcGVuZGVuY3lWZXJzaW9uVHlwZSh2ZXJzaW9uKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gdGhpcy5jaGVja3NbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrLnR5cGUgPT09ICdyZWdleCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBjaGVjay50ZXN0ID09PSAnbWF0Y2gnID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tzW3R5cGVdLnJlZ2V4LnRlc3QodmVyc2lvbikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuY2hlY2tzW3R5cGVdLnJlZ2V4LnRlc3QodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZGVwZW5kZW5jeSAke25hbWV9OiR7dmVyc2lvbn0gZnJvbSAke2Zyb219IGZhaWxlZCB2ZXJzaW9uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjaGVjayB3aXRoIG1lc3NhZ2U6ICR7dGhpcy5jaGVja3NbdHlwZV0ubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2sudHlwZSA9PT0gJ3dhcm5pbmcnICYmICF3YXJuaW5nc1Nob3duW2NoZWNrLm9uY2VOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc1Nob3duW2NoZWNrLm9uY2VOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGRlcGVuZGVuY3kgJHtuYW1lfToke3ZlcnNpb259IGZyb20gJHtmcm9tfSBjYXVzZWQgYWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCB3YXJuaW5nOiAke2NoZWNrLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb20gICAgICAgICAtIGRlc2NyaWJlcyB3aGVyZSB0aGUgZGVwZW5kZW5jaWVzIHdlcmUgc2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgICovXG4gICAgZGV0ZWN0RHVwbGljYXRlZERlcGVuZGVuY2llcyhmcm9tLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGludGVyc2VjdGlvbihPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLCBPYmplY3Qua2V5cyh0aGlzLmRlcGVuZGVuY2llcykpO1xuICAgICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkdXBsaWNhdGVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzW25hbWVdICE9PSB0aGlzLmRlcGVuZGVuY2llc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoaWxlIHByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZyb20gJHtmcm9tfSwgYSBkZXBlbmRlbmN5IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7bmFtZX06ICR7ZGVwZW5kZW5jaWVzW25hbWVdfSB3YXMgZm91bmQgdG8gYmUgY29uZmxpY3Rpbmcgd2l0aCBhIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRlcGVuZGVuY3kgKCR7dGhpcy5kZXBlbmRlbmNpZXNbbmFtZV19KSB0aGF0IHdhcyBhbHJlYWR5IGRlY2xhcmVkIGluIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyIG1vZHVsZSBvciBpdCBpcyB1c2VkIGluIGNvcmUgb2YgdGhlIGVsZWN0cm9uIGFwcC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsUUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsSUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQXdCLFNBQUFELHVCQUFBSSxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsS0FBQUUsT0FBQSxFQUFBRixHQUFBO0FBSnhCOztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU1HLG1CQUFtQixDQUFDO0VBQ3JDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsV0FBV0EsQ0FBQ0MsQ0FBQyxFQUFFQyxtQkFBbUIsRUFBRTtJQUNoQyxJQUFJLENBQUNDLEdBQUcsR0FB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