UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

96 lines (95 loc) 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.PLUGIN_UI_PREFIX = exports.DEFAULT_PLUGIN_UI_THEME = void 0; exports.loadTheme = loadTheme; exports.webAPIMiddleware = webAPIMiddleware; exports.webMiddleware = webMiddleware; var _debug = _interopRequireDefault(require("debug")); var _express = _interopRequireWildcard(require("express")); var _lodash = _interopRequireDefault(require("lodash")); var _core = require("@verdaccio/core"); var _loaders = require("@verdaccio/loaders"); var _logger = require("@verdaccio/logger"); var _middleware = require("@verdaccio/middleware"); var _uiTheme = _interopRequireDefault(require("@verdaccio/ui-theme")); var _api = _interopRequireDefault(require("./api")); 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 }; } const debug = (0, _debug.default)('verdaccio:web'); const PLUGIN_UI_PREFIX = exports.PLUGIN_UI_PREFIX = 'verdaccio-theme'; const DEFAULT_PLUGIN_UI_THEME = exports.DEFAULT_PLUGIN_UI_THEME = '@verdaccio/ui-theme'; async function loadTheme(config) { if (_lodash.default.isNil(config.theme) === false) { const plugin = await (0, _loaders.asyncLoadPlugin)(config.theme, { config, logger: _logger.logger }, // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown } function (plugin) { /** * - `staticPath`: is the same data returned in Verdaccio 5. - `manifest`: A webpack manifest object. - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically. */ return plugin.staticPath && plugin.manifest && plugin.manifestFiles; }, true, config?.serverSettings?.pluginPrefix ?? PLUGIN_UI_PREFIX, _core.PLUGIN_CATEGORY.THEME); if (plugin.length > 1) { _logger.logger.warn('multiple ui themes are not supported; only the first plugin is used'); } return _lodash.default.head(plugin); } } function webAPIMiddleware(tokenMiddleware, webEndpointsApi) { const route = (0, _express.Router)(); // validate all of these params as a package name // this might be too harsh, so ask if it causes trouble= route.param('package', _middleware.validatePackage); route.param('filename', _middleware.validateName); route.param('version', _middleware.validateName); route.use(_express.default.urlencoded({ extended: false })); route.use(_middleware.setSecurityWebHeaders); if (typeof tokenMiddleware === 'function') { route.use(tokenMiddleware); } if (typeof webEndpointsApi === 'function') { route.use(webEndpointsApi); } return route; } function webMiddleware(config, middlewares, pluginOptions) { const router = _express.default.Router(); const { tokenMiddleware, webEndpointsApi } = middlewares; // render web router.use(_middleware.WebUrlsNamespace.root, (0, _middleware.renderWebMiddleware)(config, tokenMiddleware, pluginOptions)); // web endpoints: search, packages, readme, sidebar, etc router.use(_middleware.WebUrlsNamespace.endpoints, webAPIMiddleware(tokenMiddleware, webEndpointsApi)); return router; } var _default = async (config, auth, storage, logger) => { let pluginOptions = await loadTheme(config); if (!pluginOptions) { debug('no theme plugin found, using default theme'); pluginOptions = (0, _uiTheme.default)(config.web); logger.info({ name: DEFAULT_PLUGIN_UI_THEME, pluginCategory: _core.PLUGIN_CATEGORY.THEME }, 'plugin @{name} successfully loaded (@{pluginCategory})'); } const router = (0, _express.Router)(); // web endpoints, search, packages, etc router.use(webMiddleware(config, { tokenMiddleware: auth.webUIJWTmiddleware(), webEndpointsApi: (0, _api.default)(auth, storage, config) }, pluginOptions)); return router; }; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9leHByZXNzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbG9kYXNoIiwiX2NvcmUiLCJfbG9hZGVycyIsIl9sb2dnZXIiLCJfbWlkZGxld2FyZSIsIl91aVRoZW1lIiwiX2FwaSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlYnVnIiwiYnVpbGREZWJ1ZyIsIlBMVUdJTl9VSV9QUkVGSVgiLCJleHBvcnRzIiwiREVGQVVMVF9QTFVHSU5fVUlfVEhFTUUiLCJsb2FkVGhlbWUiLCJjb25maWciLCJfIiwiaXNOaWwiLCJ0aGVtZSIsInBsdWdpbiIsImFzeW5jTG9hZFBsdWdpbiIsImxvZ2dlciIsInN0YXRpY1BhdGgiLCJtYW5pZmVzdCIsIm1hbmlmZXN0RmlsZXMiLCJzZXJ2ZXJTZXR0aW5ncyIsInBsdWdpblByZWZpeCIsIlBMVUdJTl9DQVRFR09SWSIsIlRIRU1FIiwibGVuZ3RoIiwid2FybiIsImhlYWQiLCJ3ZWJBUElNaWRkbGV3YXJlIiwidG9rZW5NaWRkbGV3YXJlIiwid2ViRW5kcG9pbnRzQXBpIiwicm91dGUiLCJSb3V0ZXIiLCJwYXJhbSIsInZhbGlkYXRlUGFja2FnZSIsInZhbGlkYXRlTmFtZSIsInVzZSIsImV4cHJlc3MiLCJ1cmxlbmNvZGVkIiwiZXh0ZW5kZWQiLCJzZXRTZWN1cml0eVdlYkhlYWRlcnMiLCJ3ZWJNaWRkbGV3YXJlIiwibWlkZGxld2FyZXMiLCJwbHVnaW5PcHRpb25zIiwicm91dGVyIiwiV2ViVXJsc05hbWVzcGFjZSIsInJvb3QiLCJyZW5kZXJXZWJNaWRkbGV3YXJlIiwiZW5kcG9pbnRzIiwiX2RlZmF1bHQiLCJhdXRoIiwic3RvcmFnZSIsImRlZmF1bHRUaGVtZSIsIndlYiIsImluZm8iLCJuYW1lIiwicGx1Z2luQ2F0ZWdvcnkiLCJ3ZWJVSUpXVG1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3dlYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYnVpbGREZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IFBMVUdJTl9DQVRFR09SWSB9IGZyb20gJ0B2ZXJkYWNjaW8vY29yZSc7XG5pbXBvcnQgeyBhc3luY0xvYWRQbHVnaW4gfSBmcm9tICdAdmVyZGFjY2lvL2xvYWRlcnMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHZlcmRhY2Npby9sb2dnZXInO1xuaW1wb3J0IHtcbiAgV2ViVXJsc05hbWVzcGFjZSxcbiAgcmVuZGVyV2ViTWlkZGxld2FyZSxcbiAgc2V0U2VjdXJpdHlXZWJIZWFkZXJzLFxuICB2YWxpZGF0ZU5hbWUsXG4gIHZhbGlkYXRlUGFja2FnZSxcbn0gZnJvbSAnQHZlcmRhY2Npby9taWRkbGV3YXJlJztcbmltcG9ydCBkZWZhdWx0VGhlbWUgZnJvbSAnQHZlcmRhY2Npby91aS10aGVtZSc7XG5cbmltcG9ydCB3ZWJFbmRwb2ludHNBcGkgZnJvbSAnLi9hcGknO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ3ZlcmRhY2Npbzp3ZWInKTtcbmV4cG9ydCBjb25zdCBQTFVHSU5fVUlfUFJFRklYID0gJ3ZlcmRhY2Npby10aGVtZSc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9QTFVHSU5fVUlfVEhFTUUgPSAnQHZlcmRhY2Npby91aS10aGVtZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVGhlbWUoY29uZmlnOiBhbnkpIHtcbiAgaWYgKF8uaXNOaWwoY29uZmlnLnRoZW1lKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zdCBwbHVnaW4gPSBhd2FpdCBhc3luY0xvYWRQbHVnaW4oXG4gICAgICBjb25maWcudGhlbWUsXG4gICAgICB7IGNvbmZpZywgbG9nZ2VyIH0sXG4gICAgICAvLyBUT0RPOiBhZGQgdHlwZXMgeyBzdGF0aWNQYXRoOiBzdHJpbmc7IG1hbmlmZXN0OiB1bmtub3duOyBtYW5pZmVzdEZpbGVzOiB1bmtub3duIH1cbiAgICAgIGZ1bmN0aW9uIChwbHVnaW46IGFueSkge1xuICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAtIGBzdGF0aWNQYXRoYDogaXMgdGhlIHNhbWUgZGF0YSByZXR1cm5lZCBpbiBWZXJkYWNjaW8gNS5cbiAgICAgICAgICAgICAgICAgLSBgbWFuaWZlc3RgOiBBIHdlYnBhY2sgbWFuaWZlc3Qgb2JqZWN0LlxuICAgICAgICAgICAgICAgICAtIGBtYW5pZmVzdEZpbGVzYDogQSBvYmplY3Qgd2l0aCBvbmUgcHJvcGVydHkgYGpzYCBhbmQgdGhlIGFycmF5IChvcmRlciBtYXR0ZXJzKSBvZiB0aGUgbWFuaWZlc3QgaWQgdG8gYmUgbG9hZGVkIGluIHRoZSB0ZW1wbGF0ZSBkeW5hbWljYWxseS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHBsdWdpbi5zdGF0aWNQYXRoICYmIHBsdWdpbi5tYW5pZmVzdCAmJiBwbHVnaW4ubWFuaWZlc3RGaWxlcztcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgY29uZmlnPy5zZXJ2ZXJTZXR0aW5ncz8ucGx1Z2luUHJlZml4ID8/IFBMVUdJTl9VSV9QUkVGSVgsXG4gICAgICBQTFVHSU5fQ0FURUdPUlkuVEhFTUVcbiAgICApO1xuICAgIGlmIChwbHVnaW4ubGVuZ3RoID4gMSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ211bHRpcGxlIHVpIHRoZW1lcyBhcmUgbm90IHN1cHBvcnRlZDsgb25seSB0aGUgZmlyc3QgcGx1Z2luIGlzIHVzZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXy5oZWFkKHBsdWdpbik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlYkFQSU1pZGRsZXdhcmUoXG4gIHRva2VuTWlkZGxld2FyZTogUmVxdWVzdEhhbmRsZXIsXG4gIHdlYkVuZHBvaW50c0FwaTogUmVxdWVzdEhhbmRsZXJcbik6IFJvdXRlciB7XG4gIGNvbnN0IHJvdXRlID0gUm91dGVyKCk7XG4gIC8vIHZhbGlkYXRlIGFsbCBvZiB0aGVzZSBwYXJhbXMgYXMgYSBwYWNrYWdlIG5hbWVcbiAgLy8gdGhpcyBtaWdodCBiZSB0b28gaGFyc2gsIHNvIGFzayBpZiBpdCBjYXVzZXMgdHJvdWJsZT1cbiAgcm91dGUucGFyYW0oJ3BhY2thZ2UnLCB2YWxpZGF0ZVBhY2thZ2UpO1xuICByb3V0ZS5wYXJhbSgnZmlsZW5hbWUnLCB2YWxpZGF0ZU5hbWUpO1xuICByb3V0ZS5wYXJhbSgndmVyc2lvbicsIHZhbGlkYXRlTmFtZSk7XG4gIHJvdXRlLnVzZShleHByZXNzLnVybGVuY29kZWQoeyBleHRlbmRlZDogZmFsc2UgfSkpO1xuICByb3V0ZS51c2Uoc2V0U2VjdXJpdHlXZWJIZWFkZXJzKTtcblxuICBpZiAodHlwZW9mIHRva2VuTWlkZGxld2FyZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJvdXRlLnVzZSh0b2tlbk1pZGRsZXdhcmUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB3ZWJFbmRwb2ludHNBcGkgPT09ICdmdW5jdGlvbicpIHtcbiAgICByb3V0ZS51c2Uod2ViRW5kcG9pbnRzQXBpKTtcbiAgfVxuXG4gIHJldHVybiByb3V0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlYk1pZGRsZXdhcmUoY29uZmlnLCBtaWRkbGV3YXJlcywgcGx1Z2luT3B0aW9ucyk6IGFueSB7XG4gIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG4gIGNvbnN0IHsgdG9rZW5NaWRkbGV3YXJlLCB3ZWJFbmRwb2ludHNBcGkgfSA9IG1pZGRsZXdhcmVzO1xuICAvLyByZW5kZXIgd2ViXG4gIHJvdXRlci51c2UoV2ViVXJsc05hbWVzcGFjZS5yb290LCByZW5kZXJXZWJNaWRkbGV3YXJlKGNvbmZpZywgdG9rZW5NaWRkbGV3YXJlLCBwbHVnaW5PcHRpb25zKSk7XG4gIC8vIHdlYiBlbmRwb2ludHM6IHNlYXJjaCwgcGFja2FnZXMsIHJlYWRtZSwgc2lkZWJhciwgZXRjXG4gIHJvdXRlci51c2UoV2ViVXJsc05hbWVzcGFjZS5lbmRwb2ludHMsIHdlYkFQSU1pZGRsZXdhcmUodG9rZW5NaWRkbGV3YXJlLCB3ZWJFbmRwb2ludHNBcGkpKTtcbiAgcmV0dXJuIHJvdXRlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGNvbmZpZywgYXV0aCwgc3RvcmFnZSwgbG9nZ2VyKSA9PiB7XG4gIGxldCBwbHVnaW5PcHRpb25zID0gYXdhaXQgbG9hZFRoZW1lKGNvbmZpZyk7XG4gIGlmICghcGx1Z2luT3B0aW9ucykge1xuICAgIGRlYnVnKCdubyB0aGVtZSBwbHVnaW4gZm91bmQsIHVzaW5nIGRlZmF1bHQgdGhlbWUnKTtcbiAgICBwbHVnaW5PcHRpb25zID0gZGVmYXVsdFRoZW1lKGNvbmZpZy53ZWIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgeyBuYW1lOiBERUZBVUxUX1BMVUdJTl9VSV9USEVNRSwgcGx1Z2luQ2F0ZWdvcnk6IFBMVUdJTl9DQVRFR09SWS5USEVNRSB9LFxuICAgICAgJ3BsdWdpbiBAe25hbWV9IHN1Y2Nlc3NmdWxseSBsb2FkZWQgKEB7cGx1Z2luQ2F0ZWdvcnl9KSdcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgcm91dGVyID0gUm91dGVyKCk7XG4gIC8vIHdlYiBlbmRwb2ludHMsIHNlYXJjaCwgcGFja2FnZXMsIGV0Y1xuICByb3V0ZXIudXNlKFxuICAgIHdlYk1pZGRsZXdhcmUoXG4gICAgICBjb25maWcsXG4gICAgICB7XG4gICAgICAgIHRva2VuTWlkZGxld2FyZTogYXV0aC53ZWJVSUpXVG1pZGRsZXdhcmUoKSxcbiAgICAgICAgd2ViRW5kcG9pbnRzQXBpOiB3ZWJFbmRwb2ludHNBcGkoYXV0aCwgc3RvcmFnZSwgY29uZmlnKSxcbiAgICAgIH0sXG4gICAgICBwbHVnaW5PcHRpb25zXG4gICAgKVxuICApO1xuICByZXR1cm4gcm91dGVyO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsUUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBUCxPQUFBO0FBT0EsSUFBQVEsUUFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQVMsSUFBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQW9DLFNBQUFFLHdCQUFBUSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBVix1QkFBQSxZQUFBQSxDQUFBUSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENBQUFNLEdB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QUM5QixNQUFNLEVBQUUrQixXQUFXLEVBQUVDLGFBQWEsRUFBTztFQUNyRSxNQUFNQyxNQUFNLEdBQUdQLGdCQUFPLENBQUNMLE1BQU0sQ0FBQyxDQUFDO0VBQy9CLE1BQU07SUFBRUgsZUFBZTtJQUFFQztFQUFnQixDQUFDLEdBQUdZLFdBQVc7RUFDeEQ7RUFDQUUsTUFBTSxDQUFDUixHQUFHLENBQUNTLDRCQUFnQixDQUFDQyxJQUFJLEVBQUUsSUFBQUMsK0JBQW1CLEVBQUNwQyxNQUFNLEVBQUVrQixlQUFlLEVBQUVjLGFBQWEsQ0FBQyxDQUFDO0VBQzlGO0VBQ0FDLE1BQU0sQ0FBQ1IsR0FBRyxDQUFDUyw0QkFBZ0IsQ0FBQ0csU0FBUyxFQUFFcEIsZ0JBQWdCLENBQUNDLGVBQWUsRUFBRUMsZUFBZSxDQUFDLENBQUM7RUFDMUYsT0FBT2MsTUFBTTtBQUNmO0FBQUMsSUFBQUssUUFBQSxHQUVjLE1BQUFBLENBQU90QyxNQUFNLEVBQUV1QyxJQUFJLEVBQUVDLE9BQU8sRUFBRWxDLE1BQU0sS0FBSztFQUN0RCxJQUFJMEIsYUFBYSxHQUFHLE1BQU1qQyxTQUFTLENBQUNDLE1BQU0sQ0FBQztFQUMzQyxJQUFJLENBQUNnQyxhQUFhLEVBQUU7SUFDbEJ0QyxLQUFLLENBQUMsNENBQTRDLENBQUM7SUFDbkRzQyxhQUFhLEdBQUcsSUFBQVMsZ0JBQVksRUFBQ3pDLE1BQU0sQ0FBQzBDLEdBQUcsQ0FBQztJQUN4Q3BDLE1BQU0sQ0FBQ3FDLElBQUksQ0FDVDtNQUFFQyxJQUFJLEVBQUU5Qyx1QkFBdUI7TUFBRStDLGNBQWMsRUFBRWpDLHFCQUFlLENBQUNDO0lBQU0sQ0FBQyxFQUN4RSx3REFDRixDQUFDO0VBQ0g7RUFFQSxNQUFNb0IsTUFBTSxHQUFHLElBQUFaLGVBQU0sRUFBQyxDQUFDO0VBQ3ZCO0VBQ0FZLE1BQU0sQ0FBQ1IsR0FBRyxDQUNSSyxhQUFhLENBQ1g5QixNQUFNLEVBQ047SUFDRWtCLGVBQWUsRUFBRXFCLElBQUksQ0FBQ08sa0JBQWtCLENBQUMsQ0FBQztJQUMxQzNCLGVBQWUsRUFBRSxJQUFBQSxZQUFlLEVBQUNvQixJQUFJLEVBQUVDLE9BQU8sRUFBRXhDLE1BQU07RUFDeEQsQ0FBQyxFQUNEZ0MsYUFDRixDQUNGLENBQUM7RUFDRCxPQUFPQyxNQUFNO0FBQ2YsQ0FBQztBQUFBcEMsT0FBQSxDQUFBWixPQUFBLEdBQUFxRCxRQUFBIiwiaWdub3JlTGlzdCI6W119