verdaccio
Version:
A lightweight private npm proxy registry
151 lines (147 loc) • 23.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createServerFactory = createServerFactory;
exports.displayExperimentsInfoBox = displayExperimentsInfoBox;
exports.runServer = runServer;
var _constants = _interopRequireDefault(require("constants"));
var _debug = _interopRequireDefault(require("debug"));
var _fs = _interopRequireDefault(require("fs"));
var _http = _interopRequireDefault(require("http"));
var _https = _interopRequireDefault(require("https"));
var _lodash = _interopRequireWildcard(require("lodash"));
var _path = _interopRequireDefault(require("path"));
var _index = _interopRequireDefault(require("../api/index"));
var _utils = require("./cli/utils");
var _configPath = _interopRequireDefault(require("./config-path"));
var _constants2 = require("./constants");
var _utils2 = require("./utils");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
const debug = (0, _debug.default)('verdaccio');
const logger = require('./logger');
function displayExperimentsInfoBox(flags) {
if (!flags) {
return;
}
const experimentList = Object.keys(flags);
if (experimentList.length >= 1) {
logger.warn(
// eslint-disable-next-line max-len
`experiments are enabled, it is recommended do not use experiments in production comment out this section to disable it`);
experimentList.forEach(experiment => {
// eslint-disable-next-line max-len
logger.info(`support for experiment [${experiment}] ${flags[experiment] ? 'is enabled' : ' is disabled'}`);
});
}
}
/**
* Exposes a server factory to be instantiated programmatically.
*
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer({ configuration });
app.listen(4000, (event) => {
// do something
});
* @param config
*/
async function runServer(config) {
let configurationParsed;
if (config === undefined || typeof config === 'string') {
const configPathLocation = (0, _configPath.default)(config);
configurationParsed = (0, _utils2.parseConfigFile)(configPathLocation);
if (!configurationParsed.self_path) {
configurationParsed.self_path = _path.default.resolve(configPathLocation);
}
} else if (_lodash.default.isObject(config)) {
configurationParsed = config;
if (!configurationParsed.self_path) {
throw new Error('self_path is required, please provide a valid root path for storage');
}
} else {
throw new Error(_constants2.API_ERROR.CONFIG_BAD_FORMAT);
}
const addresses = (0, _utils.getListListenAddresses)(undefined, configurationParsed.listen);
if (addresses.length > 1) {
process.emitWarning('You have specified multiple listen addresses, using this method only the first will be used');
}
const app = await (0, _index.default)(configurationParsed);
return createServerFactory(configurationParsed, addresses[0], app);
}
/**
* Return a native HTTP/HTTPS server instance
* @param config
* @param addr
* @param app
*/
function createServerFactory(config, addr, app) {
let serverFactory;
if (addr.proto === 'https') {
debug('https enabled');
try {
let httpsOptions = {
// disable insecure SSLv2 and SSLv3
secureOptions: _constants.default.SSL_OP_NO_SSLv2 | _constants.default.SSL_OP_NO_SSLv3
};
const keyCertConfig = config.https;
const pfxConfig = config.https;
// https must either have key and cert or a pfx and (optionally) a passphrase
if (!(keyCertConfig.key && keyCertConfig.cert || pfxConfig.pfx)) {
throw Error('bad format https configuration');
}
if (pfxConfig.pfx) {
const {
pfx,
passphrase
} = pfxConfig;
httpsOptions = (0, _lodash.assign)(httpsOptions, {
pfx: _fs.default.readFileSync(pfx),
passphrase: passphrase || ''
});
} else {
const {
key,
cert,
ca
} = keyCertConfig;
httpsOptions = (0, _lodash.assign)(httpsOptions, _objectSpread({
key: _fs.default.readFileSync(key),
cert: _fs.default.readFileSync(cert)
}, ca && {
ca: _fs.default.readFileSync(ca)
}));
}
// TODO: enable http2 as feature
// if (config.server.http2) <-- check if force http2
serverFactory = _https.default.createServer(httpsOptions, app);
} catch (err) {
throw new Error(`cannot create https server: ${err.message}`);
}
} else {
// http
debug('http enabled');
serverFactory = _http.default.createServer(app);
}
if (config.server && typeof config.server.keepAliveTimeout !== 'undefined' &&
// @ts-ignore
config.server.keepAliveTimeout !== 'null') {
// library definition for node is not up to date (doesn't contain recent 8.0 changes)
serverFactory.keepAliveTimeout = config.server.keepAliveTimeout * 1000;
}
// FIXE: I could not find the reason of this code.
unlinkAddressPath(addr);
return serverFactory;
}
function unlinkAddressPath(addr) {
if (addr.path && _fs.default.existsSync(addr.path)) {
_fs.default.unlinkSync(addr.path);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZGVidWciLCJfZnMiLCJfaHR0cCIsIl9odHRwcyIsIl9sb2Rhc2giLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9wYXRoIiwiX2luZGV4IiwiX3V0aWxzIiwiX2NvbmZpZ1BhdGgiLCJfY29uc3RhbnRzMiIsIl91dGlsczIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJkZWJ1ZyIsImJ1aWxkRGVidWciLCJsb2dnZXIiLCJkaXNwbGF5RXhwZXJpbWVudHNJbmZvQm94IiwiZmxhZ3MiLCJleHBlcmltZW50TGlzdCIsIndhcm4iLCJleHBlcmltZW50IiwiaW5mbyIsInJ1blNlcnZlciIsImNvbmZpZyIsImNvbmZpZ3VyYXRpb25QYXJzZWQiLCJ1bmRlZmluZWQiLCJjb25maWdQYXRoTG9jYXRpb24iLCJmaW5kQ29uZmlnRmlsZSIsInBhcnNlQ29uZmlnRmlsZSIsInNlbGZfcGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiXyIsImlzT2JqZWN0IiwiRXJyb3IiLCJBUElfRVJST1IiLCJDT05GSUdfQkFEX0ZPUk1BVCIsImFkZHJlc3NlcyIsImdldExpc3RMaXN0ZW5BZGRyZXNzZXMiLCJsaXN0ZW4iLCJwcm9jZXNzIiwiZW1pdFdhcm5pbmciLCJhcHAiLCJlbmRQb2ludEFQSSIsImNyZWF0ZVNlcnZlckZhY3RvcnkiLCJhZGRyIiwic2VydmVyRmFjdG9yeSIsInByb3RvIiwiaHR0cHNPcHRpb25zIiwic2VjdXJlT3B0aW9ucyIsImNvbnN0YW50cyIsIlNTTF9PUF9OT19TU0x2MiIsIlNTTF9PUF9OT19TU0x2MyIsImtleUNlcnRDb25maWciLCJodHRwcyIsInBmeENvbmZpZyIsImtleSIsImNlcnQiLCJwZngiLCJwYXNzcGhyYXNlIiwiYXNzaWduIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJjYSIsImNyZWF0ZVNlcnZlciIsImVyciIsIm1lc3NhZ2UiLCJodHRwIiwic2VydmVyIiwia2VlcEFsaXZlVGltZW91dCIsInVubGlua0FkZHJlc3NQYXRoIiwiZXhpc3RzU3luYyIsInVubGlua1N5bmMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3J1bi1zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbnN0YW50cyBmcm9tICdjb25zdGFudHMnO1xuaW1wb3J0IGJ1aWxkRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCBfLCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgQ29uZmlnLCBIdHRwc0NvbmZLZXlDZXJ0LCBIdHRwc0NvbmZQZnggfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IGVuZFBvaW50QVBJIGZyb20gJy4uL2FwaS9pbmRleCc7XG5pbXBvcnQgeyBnZXRMaXN0TGlzdGVuQWRkcmVzc2VzIH0gZnJvbSAnLi9jbGkvdXRpbHMnO1xuaW1wb3J0IGZpbmRDb25maWdGaWxlIGZyb20gJy4vY29uZmlnLXBhdGgnO1xuaW1wb3J0IHsgQVBJX0VSUk9SIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgcGFyc2VDb25maWdGaWxlIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGRlYnVnID0gYnVpbGREZWJ1ZygndmVyZGFjY2lvJyk7XG5cbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJy4vbG9nZ2VyJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5RXhwZXJpbWVudHNJbmZvQm94KGZsYWdzKSB7XG4gIGlmICghZmxhZ3MpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleHBlcmltZW50TGlzdCA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgaWYgKGV4cGVyaW1lbnRMaXN0Lmxlbmd0aCA+PSAxKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgYGV4cGVyaW1lbnRzIGFyZSBlbmFibGVkLCBpdCBpcyByZWNvbW1lbmRlZCBkbyBub3QgdXNlIGV4cGVyaW1lbnRzIGluIHByb2R1Y3Rpb24gY29tbWVudCBvdXQgdGhpcyBzZWN0aW9uIHRvIGRpc2FibGUgaXRgXG4gICAgKTtcbiAgICBleHBlcmltZW50TGlzdC5mb3JFYWNoKChleHBlcmltZW50KSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBzdXBwb3J0IGZvciBleHBlcmltZW50IFske2V4cGVyaW1lbnR9XSAke1xuICAgICAgICAgIGZsYWdzW2V4cGVyaW1lbnRdID8gJ2lzIGVuYWJsZWQnIDogJyBpcyBkaXNhYmxlZCdcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvc2VzIGEgc2VydmVyIGZhY3RvcnkgdG8gYmUgaW5zdGFudGlhdGVkIHByb2dyYW1tYXRpY2FsbHkuXG4gKlxuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHJ1blNlcnZlcigpOyAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBhcHAgPSBhd2FpdCBydW5TZXJ2ZXIoJy4vY29uZmlnL2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3QgYXBwID0gYXdhaXQgcnVuU2VydmVyKHsgY29uZmlndXJhdGlvbiB9KTtcbiAgICBhcHAubGlzdGVuKDQwMDAsIChldmVudCkgPT4ge1xuICAgICAgLy8gZG8gc29tZXRoaW5nXG4gICAgfSk7XG4gKiBAcGFyYW0gY29uZmlnXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXIoY29uZmlnPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgbGV0IGNvbmZpZ3VyYXRpb25QYXJzZWQ6IFJldHVyblR5cGU8YW55PjtcbiAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aExvY2F0aW9uID0gZmluZENvbmZpZ0ZpbGUoY29uZmlnKTtcbiAgICBjb25maWd1cmF0aW9uUGFyc2VkID0gcGFyc2VDb25maWdGaWxlKGNvbmZpZ1BhdGhMb2NhdGlvbik7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uUGFyc2VkLnNlbGZfcGF0aCkge1xuICAgICAgY29uZmlndXJhdGlvblBhcnNlZC5zZWxmX3BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnUGF0aExvY2F0aW9uKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXy5pc09iamVjdChjb25maWcpKSB7XG4gICAgY29uZmlndXJhdGlvblBhcnNlZCA9IGNvbmZpZztcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb25QYXJzZWQuc2VsZl9wYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGZfcGF0aCBpcyByZXF1aXJlZCwgcGxlYXNlIHByb3ZpZGUgYSB2YWxpZCByb290IHBhdGggZm9yIHN0b3JhZ2UnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEFQSV9FUlJPUi5DT05GSUdfQkFEX0ZPUk1BVCk7XG4gIH1cblxuICBjb25zdCBhZGRyZXNzZXMgPSBnZXRMaXN0TGlzdGVuQWRkcmVzc2VzKHVuZGVmaW5lZCwgY29uZmlndXJhdGlvblBhcnNlZC5saXN0ZW4pO1xuICBpZiAoYWRkcmVzc2VzLmxlbmd0aCA+IDEpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKFxuICAgICAgJ1lvdSBoYXZlIHNwZWNpZmllZCBtdWx0aXBsZSBsaXN0ZW4gYWRkcmVzc2VzLCB1c2luZyB0aGlzIG1ldGhvZCBvbmx5IHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQnXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGF3YWl0IGVuZFBvaW50QVBJKGNvbmZpZ3VyYXRpb25QYXJzZWQpO1xuICByZXR1cm4gY3JlYXRlU2VydmVyRmFjdG9yeShjb25maWd1cmF0aW9uUGFyc2VkLCBhZGRyZXNzZXNbMF0sIGFwcCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbmF0aXZlIEhUVFAvSFRUUFMgc2VydmVyIGluc3RhbmNlXG4gKiBAcGFyYW0gY29uZmlnXG4gKiBAcGFyYW0gYWRkclxuICogQHBhcmFtIGFwcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVyRmFjdG9yeShjb25maWc6IENvbmZpZywgYWRkciwgYXBwKSB7XG4gIGxldCBzZXJ2ZXJGYWN0b3J5O1xuICBpZiAoYWRkci5wcm90byA9PT0gJ2h0dHBzJykge1xuICAgIGRlYnVnKCdodHRwcyBlbmFibGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBodHRwc09wdGlvbnMgPSB7XG4gICAgICAgIC8vIGRpc2FibGUgaW5zZWN1cmUgU1NMdjIgYW5kIFNTTHYzXG4gICAgICAgIHNlY3VyZU9wdGlvbnM6IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qga2V5Q2VydENvbmZpZyA9IGNvbmZpZy5odHRwcyBhcyBIdHRwc0NvbmZLZXlDZXJ0O1xuICAgICAgY29uc3QgcGZ4Q29uZmlnID0gY29uZmlnLmh0dHBzIGFzIEh0dHBzQ29uZlBmeDtcblxuICAgICAgLy8gaHR0cHMgbXVzdCBlaXRoZXIgaGF2ZSBrZXkgYW5kIGNlcnQgb3IgYSBwZnggYW5kIChvcHRpb25hbGx5KSBhIHBhc3NwaHJhc2VcbiAgICAgIGlmICghKChrZXlDZXJ0Q29uZmlnLmtleSAmJiBrZXlDZXJ0Q29uZmlnLmNlcnQpIHx8IHBmeENvbmZpZy5wZngpKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdiYWQgZm9ybWF0IGh0dHBzIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBmeENvbmZpZy5wZngpIHtcbiAgICAgICAgY29uc3QgeyBwZngsIHBhc3NwaHJhc2UgfSA9IHBmeENvbmZpZztcbiAgICAgICAgaHR0cHNPcHRpb25zID0gYXNzaWduKGh0dHBzT3B0aW9ucywge1xuICAgICAgICAgIHBmeDogZnMucmVhZEZpbGVTeW5jKHBmeCksXG4gICAgICAgICAgcGFzc3BocmFzZTogcGFzc3BocmFzZSB8fCAnJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGtleSwgY2VydCwgY2EgfSA9IGtleUNlcnRDb25maWc7XG4gICAgICAgIGh0dHBzT3B0aW9ucyA9IGFzc2lnbihodHRwc09wdGlvbnMsIHtcbiAgICAgICAgICBrZXk6IGZzLnJlYWRGaWxlU3luYyhrZXkpLFxuICAgICAgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYyhjZXJ0KSxcbiAgICAgICAgICAuLi4oY2EgJiYge1xuICAgICAgICAgICAgY2E6IGZzLnJlYWRGaWxlU3luYyhjYSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogZW5hYmxlIGh0dHAyIGFzIGZlYXR1cmVcbiAgICAgIC8vIGlmIChjb25maWcuc2VydmVyLmh0dHAyKSA8LS0gY2hlY2sgaWYgZm9yY2UgaHR0cDJcbiAgICAgIHNlcnZlckZhY3RvcnkgPSBodHRwcy5jcmVhdGVTZXJ2ZXIoaHR0cHNPcHRpb25zLCBhcHApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBjcmVhdGUgaHR0cHMgc2VydmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBodHRwXG4gICAgZGVidWcoJ2h0dHAgZW5hYmxlZCcpO1xuICAgIHNlcnZlckZhY3RvcnkgPSBodHRwLmNyZWF0ZVNlcnZlcihhcHApO1xuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5zZXJ2ZXIgJiZcbiAgICB0eXBlb2YgY29uZmlnLnNlcnZlci5rZWVwQWxpdmVUaW1lb3V0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25maWcuc2VydmVyLmtlZXBBbGl2ZVRpbWVvdXQgIT09ICdudWxsJ1xuICApIHtcbiAgICAvLyBsaWJyYXJ5IGRlZmluaXRpb24gZm9yIG5vZGUgaXMgbm90IHVwIHRvIGRhdGUgKGRvZXNuJ3QgY29udGFpbiByZWNlbnQgOC4wIGNoYW5nZXMpXG4gICAgc2VydmVyRmFjdG9yeS5rZWVwQWxpdmVUaW1lb3V0ID0gY29uZmlnLnNlcnZlci5rZWVwQWxpdmVUaW1lb3V0ICogMTAwMDtcbiAgfVxuICAvLyBGSVhFOiBJIGNvdWxkIG5vdCBmaW5kIHRoZSByZWFzb24gb2YgdGhpcyBjb2RlLlxuICB1bmxpbmtBZGRyZXNzUGF0aChhZGRyKTtcblxuICByZXR1cm4gc2VydmVyRmFjdG9yeTtcbn1cblxuZnVuY3Rpb24gdW5saW5rQWRkcmVzc1BhdGgoYWRkcikge1xuICBpZiAoYWRkci5wYXRoICYmIGZzLmV4aXN0c1N5bmMoYWRkci5wYXRoKSkge1xuICAgIGZzLnVubGlua1N5bmMoYWRkci5wYXRoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLEdBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUMsdUJBQUEsQ0FBQU4sT0FBQTtBQUNBLElBQUFPLEtBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUlBLElBQUFRLE1BQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFdBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFdBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLE9BQUEsR0FBQVosT0FBQTtBQUEwQyxTQUFBTSx3QkFBQU8sQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVQsdUJBQUEsWUFBQUEsQ0FBQU8sQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFB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