verdaccio
Version:
A lightweight private npm proxy registry
281 lines (272 loc) • 38.4 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.WHITELIST = void 0;
exports.checkPackageLocal = checkPackageLocal;
exports.checkPackageRemote = checkPackageRemote;
exports.cleanUpLinksRef = cleanUpLinksRef;
exports.cleanUpReadme = cleanUpReadme;
exports.convertAbbreviatedManifest = convertAbbreviatedManifest;
exports.generatePackageTemplate = generatePackageTemplate;
exports.generateRevision = generateRevision;
exports.getLatestReadme = getLatestReadme;
exports.hasInstallScript = hasInstallScript;
exports.isPublishablePackage = isPublishablePackage;
exports.mergeUplinkTimeIntoLocal = mergeUplinkTimeIntoLocal;
exports.normalizePackage = normalizePackage;
exports.prepareSearchPackage = prepareSearchPackage;
exports.publishPackage = publishPackage;
var _lodash = _interopRequireDefault(require("lodash"));
var _core = require("@verdaccio/core");
var _searchIndexer = require("@verdaccio/search-indexer");
var _utils = require("@verdaccio/utils");
var _constants = require("./constants");
var _logger = require("./logger");
var _utils2 = require("./utils");
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); }
function generatePackageTemplate(name) {
return {
// standard things
name,
versions: {},
time: {},
[_constants.USERS]: {},
[_constants.DIST_TAGS]: {},
_uplinks: {},
_distfiles: {},
_attachments: {},
_rev: ''
};
}
/**
* Normalize package properties, tags, revision id.
* @param {Object} pkg package reference.
*/
function normalizePackage(pkg) {
const pkgProperties = ['versions', 'dist-tags', '_distfiles', '_attachments', '_uplinks', 'time'];
pkgProperties.forEach(key => {
const pkgProp = pkg[key];
if (_lodash.default.isNil(pkgProp) || (0, _utils2.isObject)(pkgProp) === false) {
pkg[key] = {};
}
});
if (_lodash.default.isString(pkg._rev) === false) {
pkg._rev = _constants.STORAGE.DEFAULT_REVISION;
}
if (_lodash.default.isString(pkg._id) === false) {
pkg._id = pkg.name;
}
// normalize dist-tags
(0, _utils2.normalizeDistTags)(pkg);
return pkg;
}
function generateRevision(rev) {
const _rev = rev.split('-');
return (+_rev[0] || 0) + 1 + '-' + (0, _utils.generateRandomHexString)();
}
function getLatestReadme(pkg) {
const versions = pkg['versions'] || {};
const distTags = pkg[_constants.DIST_TAGS] || {};
// FIXME: here is a bit tricky add the types
const latestVersion = distTags['latest'] ? versions[distTags['latest']] || {} : {};
let readme = _lodash.default.trim(pkg.readme || latestVersion.readme || '');
if (readme) {
return readme;
}
// In case of empty readme - trying to get ANY readme in the following order: 'next','beta','alpha','test','dev','canary'
const readmeDistTagsPriority = ['next', 'beta', 'alpha', 'test', 'dev', 'canary'];
readmeDistTagsPriority.map(function (tag) {
if (readme) {
return readme;
}
const version = distTags[tag] ? versions[distTags[tag]] || {} : {};
readme = _lodash.default.trim(version.readme || readme);
});
return readme;
}
function cleanUpReadme(version) {
if (_lodash.default.isNil(version) === false) {
// @ts-ignore
delete version.readme;
}
return version;
}
const WHITELIST = exports.WHITELIST = ['_rev', 'name', 'versions', 'dist-tags', 'readme', 'time', '_id', 'users'];
function cleanUpLinksRef(keepUpLinkData, result) {
const propertyToKeep = [...WHITELIST];
if (keepUpLinkData === true) {
propertyToKeep.push('_uplinks');
}
for (const i in result) {
if (propertyToKeep.indexOf(i) === -1) {
// Remove sections like '_uplinks' from response
delete result[i];
}
}
return result;
}
/**
* Check whether a package it is already a local package
* @param {*} name
* @param {*} localStorage
*/
function checkPackageLocal(name, localStorage) {
return new Promise((resolve, reject) => {
localStorage.getPackageMetadata(name, (err, results) => {
if (!_lodash.default.isNil(err) && err.status !== _constants.HTTP_STATUS.NOT_FOUND) {
return reject(err);
}
if (results) {
return reject(_utils2.ErrorCode.getConflict(_constants.API_ERROR.PACKAGE_EXIST));
}
return resolve();
});
});
}
function publishPackage(name, metadata, localStorage) {
return new Promise((resolve, reject) => {
localStorage.addPackage(name, metadata, (err, latest) => {
if (!_lodash.default.isNull(err)) {
return reject(err);
} else if (!_lodash.default.isUndefined(latest)) {
_searchIndexer.SearchMemoryIndexer.add(latest).catch(reason => {
_logger.logger.error('indexer has failed on add item');
});
}
return resolve();
});
});
}
function checkPackageRemote(name, isAllowPublishOffline, syncMetadata) {
return new Promise((resolve, reject) => {
syncMetadata(name, null, {}, (err, packageJsonLocal, upLinksErrors) => {
// something weird
if (err && err.status !== _constants.HTTP_STATUS.NOT_FOUND) {
return reject(err);
}
// checking package exist already
if (_lodash.default.isNil(packageJsonLocal) === false) {
return reject(_utils2.ErrorCode.getConflict(_constants.API_ERROR.PACKAGE_EXIST));
}
for (let errorItem = 0; errorItem < upLinksErrors.length; errorItem++) {
// checking error
// if uplink fails with a status other than 404, we report failure
if (_lodash.default.isNil(upLinksErrors[errorItem][0]) === false) {
if (upLinksErrors[errorItem][0].status !== _constants.HTTP_STATUS.NOT_FOUND) {
if (isAllowPublishOffline) {
return resolve();
}
return reject(_utils2.ErrorCode.getServiceUnavailable(_constants.API_ERROR.UPLINK_OFFLINE_PUBLISH));
}
}
}
return resolve();
});
});
}
// tested on v6
function mergeUplinkTimeIntoLocal(cacheManifest, remoteManifest) {
if ('time' in remoteManifest) {
// remote override cache time conflicts
return _objectSpread(_objectSpread({}, cacheManifest), {}, {
time: _objectSpread(_objectSpread({}, cacheManifest.time), remoteManifest.time)
});
}
return cacheManifest;
}
function prepareSearchPackage(data, time) {
const latest = _core.pkgUtils.getLatest(data);
if (latest && data.versions[latest]) {
const version = data.versions[latest];
const versions = {
[latest]: 'latest'
};
const pkg = {
name: version.name,
description: version.description,
[_constants.DIST_TAGS]: {
latest
},
maintainers: version.maintainers || [version.author].filter(Boolean),
author: version.author,
repository: version.repository,
readmeFilename: version.readmeFilename || '',
homepage: version.homepage,
keywords: version.keywords,
time: {
modified: time
},
bugs: version.bugs,
license: version.license,
versions
};
return pkg;
}
}
/**
* Check whether the package metadta has enough data to be published
* @param pkg metadata
*/
function isPublishablePackage(pkg) {
const keys = Object.keys(pkg);
return keys.includes('versions');
}
function hasInstallScript(version) {
if (version !== null && version !== void 0 && version.scripts) {
const scripts = Object.keys(version.scripts);
return scripts.find(item => {
return ['install', 'preinstall', 'postinstall'].includes(item);
}) !== undefined;
}
return false;
}
function convertAbbreviatedManifest(manifest) {
var _manifest$time;
const abbreviatedVersions = Object.keys(manifest.versions).reduce((acc, version) => {
const _version = manifest.versions[version];
// This should be align with this document
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object
const _version_abbreviated = {
name: _version.name,
version: _version.version,
description: _version.description,
deprecated: _version.deprecated,
bin: _version.bin,
dist: _version.dist,
engines: _version.engines,
cpu: _version.cpu,
os: _version.os,
funding: _version.funding,
directories: _version.directories,
dependencies: _version.dependencies,
devDependencies: _version.devDependencies,
peerDependencies: _version.peerDependencies,
peerDependenciesMeta: _version.peerDependenciesMeta,
optionalDependencies: _version.optionalDependencies,
bundleDependencies: _version.bundleDependencies,
// npm cli specifics
_hasShrinkwrap: _version._hasShrinkwrap,
hasInstallScript: hasInstallScript(_version)
};
acc[version] = _version_abbreviated;
return acc;
}, {});
const convertedManifest = {
name: manifest['name'],
[_constants.DIST_TAGS]: manifest[_constants.DIST_TAGS],
versions: abbreviatedVersions,
// @ts-ignore
modified: manifest === null || manifest === void 0 ? void 0 : (_manifest$time = manifest.time) === null || _manifest$time === void 0 ? void 0 : _manifest$time.modified,
// NOTE: special case for pnpm https://github.com/pnpm/rfcs/pull/2
time: manifest === null || manifest === void 0 ? void 0 : manifest.time
};
// @ts-ignore
return convertedManifest;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29yZSIsIl9zZWFyY2hJbmRleGVyIiwiX3V0aWxzIiwiX2NvbnN0YW50cyIsIl9sb2dnZXIiLCJfdXRpbHMyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwib3duS2V5cyIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX3RvUHJvcGVydHlLZXkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsImdlbmVyYXRlUGFja2FnZVRlbXBsYXRlIiwibmFtZSIsInZlcnNpb25zIiwidGltZSIsIlVTRVJTIiwiRElTVF9UQUdTIiwiX3VwbGlua3MiLCJfZGlzdGZpbGVzIiwiX2F0dGFjaG1lbnRzIiwiX3JldiIsIm5vcm1hbGl6ZVBhY2thZ2UiLCJwa2ciLCJwa2dQcm9wZXJ0aWVzIiwia2V5IiwicGtnUHJvcCIsIl8iLCJpc05pbCIsImlzT2JqZWN0IiwiaXNTdHJpbmciLCJTVE9SQUdFIiwiREVGQVVMVF9SRVZJU0lPTiIsIl9pZCIsIm5vcm1hbGl6ZURpc3RUYWdzIiwiZ2VuZXJhdGVSZXZpc2lvbiIsInJldiIsInNwbGl0IiwiZ2VuZXJhdGVSYW5kb21IZXhTdHJpbmciLCJnZXRMYXRlc3RSZWFkbWUiLCJkaXN0VGFncyIsImxhdGVzdFZlcnNpb24iLCJyZWFkbWUiLCJ0cmltIiwicmVhZG1lRGlzdFRhZ3NQcmlvcml0eSIsIm1hcCIsInRhZyIsInZlcnNpb24iLCJjbGVhblVwUmVhZG1lIiwiV0hJVEVMSVNUIiwiZXhwb3J0cyIsImNsZWFuVXBMaW5rc1JlZiIsImtlZXBVcExpbmtEYXRhIiwicmVzdWx0IiwicHJvcGVydHlUb0tlZXAiLCJpbmRleE9mIiwiY2hlY2tQYWNrYWdlTG9jYWwiLCJsb2NhbFN0b3JhZ2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImdldFBhY2thZ2VNZXRhZGF0YSIsImVyciIsInJlc3VsdHMiLCJzdGF0dXMiLCJIVFRQX1NUQVRVUyIsIk5PVF9GT1VORCIsIkVycm9yQ29kZSIsImdldENvbmZsaWN0IiwiQVBJX0VSUk9SIiwiUEFDS0FHRV9FWElTVCIsInB1Ymxpc2hQYWNrYWdlIiwibWV0YWRhdGEiLCJhZGRQYWNrYWdlIiwibGF0ZXN0IiwiaXNOdWxsIiwiaXNVbmRlZmluZWQiLCJTZWFyY2hNZW1vcnlJbmRleGVyIiwiYWRkIiwiY2F0Y2giLCJyZWFzb24iLCJsb2dnZXIiLCJlcnJvciIsImNoZWNrUGFja2FnZVJlbW90ZSIsImlzQWxsb3dQdWJsaXNoT2ZmbGluZSIsInN5bmNNZXRhZGF0YSIsInBhY2thZ2VKc29uTG9jYWwiLCJ1cExpbmtzRXJyb3JzIiwiZXJyb3JJdGVtIiwiZ2V0U2VydmljZVVuYXZhaWxhYmxlIiwiVVBMSU5LX09GRkxJTkVfUFVCTElTSCIsIm1lcmdlVXBsaW5rVGltZUludG9Mb2NhbCIsImNhY2hlTWFuaWZlc3QiLCJyZW1vdGVNYW5pZmVzdCIsInByZXBhcmVTZWFyY2hQYWNrYWdlIiwiZGF0YSIsInBrZ1V0aWxzIiwiZ2V0TGF0ZXN0IiwiZGVzY3JpcHRpb24iLCJtYWludGFpbmVycyIsImF1dGhvciIsIkJvb2xlYW4iLCJyZXBvc2l0b3J5IiwicmVhZG1lRmlsZW5hbWUiLCJob21lcGFnZSIsImtleXdvcmRzIiwibW9kaWZpZWQiLCJidWdzIiwibGljZW5zZSIsImlzUHVibGlzaGFibGVQYWNrYWdlIiwiaW5jbHVkZXMiLCJoYXNJbnN0YWxsU2NyaXB0Iiwic2NyaXB0cyIsImZpbmQiLCJpdGVtIiwidW5kZWZpbmVkIiwiY29udmVydEFiYnJldmlhdGVkTWFuaWZlc3QiLCJtYW5pZmVzdCIsIl9tYW5pZmVzdCR0aW1lIiwiYWJicmV2aWF0ZWRWZXJzaW9ucyIsInJlZHVjZSIsImFjYyIsIl92ZXJzaW9uIiwiX3ZlcnNpb25fYWJicmV2aWF0ZWQiLCJkZXByZWNhdGVkIiwiYmluIiwiZGlzdCIsImVuZ2luZXMiLCJjcHUiLCJvcyIsImZ1bmRpbmciLCJkaXJlY3RvcmllcyIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzTWV0YSIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiYnVuZGxlRGVwZW5kZW5jaWVzIiwiX2hhc1Nocmlua3dyYXAiLCJjb252ZXJ0ZWRNYW5pZmVzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvc3RvcmFnZS11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBwa2dVdGlscyB9IGZyb20gJ0B2ZXJkYWNjaW8vY29yZSc7XG5pbXBvcnQgeyBTZWFyY2hNZW1vcnlJbmRleGVyIH0gZnJvbSAnQHZlcmRhY2Npby9zZWFyY2gtaW5kZXhlcic7XG5pbXBvcnQgeyBBYmJyZXZpYXRlZE1hbmlmZXN0LCBBYmJyZXZpYXRlZFZlcnNpb25zLCBNYW5pZmVzdCwgVmVyc2lvbiB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSYW5kb21IZXhTdHJpbmcgfSBmcm9tICdAdmVyZGFjY2lvL3V0aWxzJztcblxuaW1wb3J0IHsgQVBJX0VSUk9SLCBESVNUX1RBR1MsIEhUVFBfU1RBVFVTLCBTVE9SQUdFLCBVU0VSUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBMb2NhbFN0b3JhZ2UgZnJvbSAnLi9sb2NhbC1zdG9yYWdlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IEVycm9yQ29kZSwgaXNPYmplY3QsIG5vcm1hbGl6ZURpc3RUYWdzIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VUZW1wbGF0ZShuYW1lOiBzdHJpbmcpOiBNYW5pZmVzdCB7XG4gIHJldHVybiB7XG4gICAgLy8gc3RhbmRhcmQgdGhpbmdzXG4gICAgbmFtZSxcbiAgICB2ZXJzaW9uczoge30sXG4gICAgdGltZToge30sXG4gICAgW1VTRVJTXToge30sXG4gICAgW0RJU1RfVEFHU106IHt9LFxuICAgIF91cGxpbmtzOiB7fSxcbiAgICBfZGlzdGZpbGVzOiB7fSxcbiAgICBfYXR0YWNobWVudHM6IHt9LFxuICAgIF9yZXY6ICcnLFxuICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBwYWNrYWdlIHByb3BlcnRpZXMsIHRhZ3MsIHJldmlzaW9uIGlkLlxuICogQHBhcmFtIHtPYmplY3R9IHBrZyBwYWNrYWdlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2UocGtnOiBNYW5pZmVzdCk6IE1hbmlmZXN0IHtcbiAgY29uc3QgcGtnUHJvcGVydGllcyA9IFsndmVyc2lvbnMnLCAnZGlzdC10YWdzJywgJ19kaXN0ZmlsZXMnLCAnX2F0dGFjaG1lbnRzJywgJ191cGxpbmtzJywgJ3RpbWUnXTtcblxuICBwa2dQcm9wZXJ0aWVzLmZvckVhY2goKGtleSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHBrZ1Byb3AgPSBwa2dba2V5XTtcblxuICAgIGlmIChfLmlzTmlsKHBrZ1Byb3ApIHx8IGlzT2JqZWN0KHBrZ1Byb3ApID09PSBmYWxzZSkge1xuICAgICAgcGtnW2tleV0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChfLmlzU3RyaW5nKHBrZy5fcmV2KSA9PT0gZmFsc2UpIHtcbiAgICBwa2cuX3JldiA9IFNUT1JBR0UuREVGQVVMVF9SRVZJU0lPTjtcbiAgfVxuXG4gIGlmIChfLmlzU3RyaW5nKHBrZy5faWQpID09PSBmYWxzZSkge1xuICAgIHBrZy5faWQgPSBwa2cubmFtZTtcbiAgfVxuXG4gIC8vIG5vcm1hbGl6ZSBkaXN0LXRhZ3NcbiAgbm9ybWFsaXplRGlzdFRhZ3MocGtnKTtcblxuICByZXR1cm4gcGtnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSZXZpc2lvbihyZXY6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IF9yZXYgPSByZXYuc3BsaXQoJy0nKTtcblxuICByZXR1cm4gKCtfcmV2WzBdIHx8IDApICsgMSArICctJyArIGdlbmVyYXRlUmFuZG9tSGV4U3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RSZWFkbWUocGtnOiBNYW5pZmVzdCk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zID0gcGtnWyd2ZXJzaW9ucyddIHx8IHt9O1xuICBjb25zdCBkaXN0VGFncyA9IHBrZ1tESVNUX1RBR1NdIHx8IHt9O1xuICAvLyBGSVhNRTogaGVyZSBpcyBhIGJpdCB0cmlja3kgYWRkIHRoZSB0eXBlc1xuICBjb25zdCBsYXRlc3RWZXJzaW9uOiBWZXJzaW9uIHwgYW55ID0gZGlzdFRhZ3NbJ2xhdGVzdCddID8gdmVyc2lvbnNbZGlzdFRhZ3NbJ2xhdGVzdCddXSB8fCB7fSA6IHt9O1xuICBsZXQgcmVhZG1lID0gXy50cmltKHBrZy5yZWFkbWUgfHwgbGF0ZXN0VmVyc2lvbi5yZWFkbWUgfHwgJycpO1xuICBpZiAocmVhZG1lKSB7XG4gICAgcmV0dXJuIHJlYWRtZTtcbiAgfVxuXG4gIC8vIEluIGNhc2Ugb2YgZW1wdHkgcmVhZG1lIC0gdHJ5aW5nIHRvIGdldCBBTlkgcmVhZG1lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICduZXh0JywnYmV0YScsJ2FscGhhJywndGVzdCcsJ2RldicsJ2NhbmFyeSdcbiAgY29uc3QgcmVhZG1lRGlzdFRhZ3NQcmlvcml0eSA9IFsnbmV4dCcsICdiZXRhJywgJ2FscGhhJywgJ3Rlc3QnLCAnZGV2JywgJ2NhbmFyeSddO1xuICByZWFkbWVEaXN0VGFnc1ByaW9yaXR5Lm1hcChmdW5jdGlvbiAodGFnKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHJlYWRtZSkge1xuICAgICAgcmV0dXJuIHJlYWRtZTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbjogVmVyc2lvbiB8IGFueSA9IGRpc3RUYWdzW3RhZ10gPyB2ZXJzaW9uc1tkaXN0VGFnc1t0YWddXSB8fCB7fSA6IHt9O1xuICAgIHJlYWRtZSA9IF8udHJpbSh2ZXJzaW9uLnJlYWRtZSB8fCByZWFkbWUpO1xuICB9KTtcbiAgcmV0dXJuIHJlYWRtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBSZWFkbWUodmVyc2lvbjogVmVyc2lvbik6IFZlcnNpb24ge1xuICBpZiAoXy5pc05pbCh2ZXJzaW9uKSA9PT0gZmFsc2UpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZGVsZXRlIHZlcnNpb24ucmVhZG1lO1xuICB9XG5cbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmV4cG9ydCBjb25zdCBXSElURUxJU1QgPSBbXG4gICdfcmV2JyxcbiAgJ25hbWUnLFxuICAndmVyc2lvbnMnLFxuICAnZGlzdC10YWdzJyxcbiAgJ3JlYWRtZScsXG4gICd0aW1lJyxcbiAgJ19pZCcsXG4gICd1c2VycycsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcExpbmtzUmVmKGtlZXBVcExpbmtEYXRhOiBib29sZWFuLCByZXN1bHQ6IE1hbmlmZXN0KTogTWFuaWZlc3Qge1xuICBjb25zdCBwcm9wZXJ0eVRvS2VlcCA9IFsuLi5XSElURUxJU1RdO1xuICBpZiAoa2VlcFVwTGlua0RhdGEgPT09IHRydWUpIHtcbiAgICBwcm9wZXJ0eVRvS2VlcC5wdXNoKCdfdXBsaW5rcycpO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIGluIHJlc3VsdCkge1xuICAgIGlmIChwcm9wZXJ0eVRvS2VlcC5pbmRleE9mKGkpID09PSAtMSkge1xuICAgICAgLy8gUmVtb3ZlIHNlY3Rpb25zIGxpa2UgJ191cGxpbmtzJyBmcm9tIHJlc3BvbnNlXG4gICAgICBkZWxldGUgcmVzdWx0W2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIHBhY2thZ2UgaXQgaXMgYWxyZWFkeSBhIGxvY2FsIHBhY2thZ2VcbiAqIEBwYXJhbSB7Kn0gbmFtZVxuICogQHBhcmFtIHsqfSBsb2NhbFN0b3JhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUGFja2FnZUxvY2FsKG5hbWU6IHN0cmluZywgbG9jYWxTdG9yYWdlOiBMb2NhbFN0b3JhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICBsb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZU1ldGFkYXRhKG5hbWUsIChlcnIsIHJlc3VsdHMpOiB2b2lkID0+IHtcbiAgICAgIGlmICghXy5pc05pbChlcnIpICYmIGVyci5zdGF0dXMgIT09IEhUVFBfU1RBVFVTLk5PVF9GT1VORCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICByZXR1cm4gcmVqZWN0KEVycm9yQ29kZS5nZXRDb25mbGljdChBUElfRVJST1IuUEFDS0FHRV9FWElTVCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoUGFja2FnZShcbiAgbmFtZTogc3RyaW5nLFxuICBtZXRhZGF0YTogYW55LFxuICBsb2NhbFN0b3JhZ2U6IExvY2FsU3RvcmFnZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgbG9jYWxTdG9yYWdlLmFkZFBhY2thZ2UobmFtZSwgbWV0YWRhdGEsIChlcnIsIGxhdGVzdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFfLmlzTnVsbChlcnIpKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIV8uaXNVbmRlZmluZWQobGF0ZXN0KSkge1xuICAgICAgICBTZWFyY2hNZW1vcnlJbmRleGVyLmFkZChsYXRlc3QpLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2luZGV4ZXIgaGFzIGZhaWxlZCBvbiBhZGQgaXRlbScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tQYWNrYWdlUmVtb3RlKFxuICBuYW1lOiBzdHJpbmcsXG4gIGlzQWxsb3dQdWJsaXNoT2ZmbGluZTogYm9vbGVhbixcbiAgc3luY01ldGFkYXRhOiBGdW5jdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgc3luY01ldGFkYXRhKG5hbWUsIG51bGwsIHt9LCAoZXJyLCBwYWNrYWdlSnNvbkxvY2FsLCB1cExpbmtzRXJyb3JzKTogdm9pZCA9PiB7XG4gICAgICAvLyBzb21ldGhpbmcgd2VpcmRcbiAgICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVMuTk9UX0ZPVU5EKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2tpbmcgcGFja2FnZSBleGlzdCBhbHJlYWR5XG4gICAgICBpZiAoXy5pc05pbChwYWNrYWdlSnNvbkxvY2FsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChFcnJvckNvZGUuZ2V0Q29uZmxpY3QoQVBJX0VSUk9SLlBBQ0tBR0VfRVhJU1QpKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgZXJyb3JJdGVtID0gMDsgZXJyb3JJdGVtIDwgdXBMaW5rc0Vycm9ycy5sZW5ndGg7IGVycm9ySXRlbSsrKSB7XG4gICAgICAgIC8vIGNoZWNraW5nIGVycm9yXG4gICAgICAgIC8vIGlmIHVwbGluayBmYWlscyB3aXRoIGEgc3RhdHVzIG90aGVyIHRoYW4gNDA0LCB3ZSByZXBvcnQgZmFpbHVyZVxuICAgICAgICBpZiAoXy5pc05pbCh1cExpbmtzRXJyb3JzW2Vycm9ySXRlbV1bMF0pID09PSBmYWxzZSkge1xuICAgICAgICAgIGlmICh1cExpbmtzRXJyb3JzW2Vycm9ySXRlbV1bMF0uc3RhdHVzICE9PSBIVFRQX1NUQVRVUy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgIGlmIChpc0FsbG93UHVibGlzaE9mZmxpbmUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChFcnJvckNvZGUuZ2V0U2VydmljZVVuYXZhaWxhYmxlKEFQSV9FUlJPUi5VUExJTktfT0ZGTElORV9QVUJMSVNIKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyB0ZXN0ZWQgb24gdjZcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVVwbGlua1RpbWVJbnRvTG9jYWwoY2FjaGVNYW5pZmVzdDogTWFuaWZlc3QsIHJlbW90ZU1hbmlmZXN0OiBNYW5pZmVzdCk6IGFueSB7XG4gIGlmICgndGltZScgaW4gcmVtb3RlTWFuaWZlc3QpIHtcbiAgICAvLyByZW1vdGUgb3ZlcnJpZGUgY2FjaGUgdGltZSBjb25mbGljdHNcbiAgICByZXR1cm4geyAuLi5jYWNoZU1hbmlmZXN0LCB0aW1lOiB7IC4uLmNhY2hlTWFuaWZlc3QudGltZSwgLi4ucmVtb3RlTWFuaWZlc3QudGltZSB9IH07XG4gIH1cblxuICByZXR1cm4gY2FjaGVNYW5pZmVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTZWFyY2hQYWNrYWdlKGRhdGE6IE1hbmlmZXN0LCB0aW1lOiB1bmtub3duKTogYW55IHtcbiAgY29uc3QgbGF0ZXN0ID0gcGtnVXRpbHMuZ2V0TGF0ZXN0KGRhdGEpO1xuXG4gIGlmIChsYXRlc3QgJiYgZGF0YS52ZXJzaW9uc1tsYXRlc3RdKSB7XG4gICAgY29uc3QgdmVyc2lvbjogVmVyc2lvbiA9IGRhdGEudmVyc2lvbnNbbGF0ZXN0XTtcbiAgICBjb25zdCB2ZXJzaW9uczogYW55ID0geyBbbGF0ZXN0XTogJ2xhdGVzdCcgfTtcbiAgICBjb25zdCBwa2c6IGFueSA9IHtcbiAgICAgIG5hbWU6IHZlcnNpb24ubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB2ZXJzaW9uLmRlc2NyaXB0aW9uLFxuICAgICAgW0RJU1RfVEFHU106IHsgbGF0ZXN0IH0sXG4gICAgICBtYWludGFpbmVyczogdmVyc2lvbi5tYWludGFpbmVycyB8fCBbdmVyc2lvbi5hdXRob3JdLmZpbHRlcihCb29sZWFuKSxcbiAgICAgIGF1dGhvcjogdmVyc2lvbi5hdXRob3IsXG4gICAgICByZXBvc2l0b3J5OiB2ZXJzaW9uLnJlcG9zaXRvcnksXG4gICAgICByZWFkbWVGaWxlbmFtZTogdmVyc2lvbi5yZWFkbWVGaWxlbmFtZSB8fCAnJyxcbiAgICAgIGhvbWVwYWdlOiB2ZXJzaW9uLmhvbWVwYWdlLFxuICAgICAga2V5d29yZHM6IHZlcnNpb24ua2V5d29yZHMsXG4gICAgICB0aW1lOiB7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lLFxuICAgICAgfSxcbiAgICAgIGJ1Z3M6IHZlcnNpb24uYnVncyxcbiAgICAgIGxpY2Vuc2U6IHZlcnNpb24ubGljZW5zZSxcbiAgICAgIHZlcnNpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gcGtnO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcGFja2FnZSBtZXRhZHRhIGhhcyBlbm91Z2ggZGF0YSB0byBiZSBwdWJsaXNoZWRcbiAqIEBwYXJhbSBwa2cgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGFibGVQYWNrYWdlKHBrZzogTWFuaWZlc3QpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhwa2cpO1xuXG4gIHJldHVybiBrZXlzLmluY2x1ZGVzKCd2ZXJzaW9ucycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW5zdGFsbFNjcmlwdCh2ZXJzaW9uOiBWZXJzaW9uKSB7XG4gIGlmICh2ZXJzaW9uPy5zY3JpcHRzKSB7XG4gICAgY29uc3Qgc2NyaXB0cyA9IE9iamVjdC5rZXlzKHZlcnNpb24uc2NyaXB0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHNjcmlwdHMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gWydpbnN0YWxsJywgJ3ByZWluc3RhbGwnLCAncG9zdGluc3RhbGwnXS5pbmNsdWRlcyhpdGVtKTtcbiAgICAgIH0pICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBYmJyZXZpYXRlZE1hbmlmZXN0KG1hbmlmZXN0OiBNYW5pZmVzdCk6IEFiYnJldmlhdGVkTWFuaWZlc3Qge1xuICBjb25zdCBhYmJyZXZpYXRlZFZlcnNpb25zID0gT2JqZWN0LmtleXMobWFuaWZlc3QudmVyc2lvbnMpLnJlZHVjZShcbiAgICAoYWNjOiBBYmJyZXZpYXRlZFZlcnNpb25zLCB2ZXJzaW9uOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IF92ZXJzaW9uID0gbWFuaWZlc3QudmVyc2lvbnNbdmVyc2lvbl07XG4gICAgICAvLyBUaGlzIHNob3VsZCBiZSBhbGlnbiB3aXRoIHRoaXMgZG9jdW1lbnRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcmVnaXN0cnkvYmxvYi9tYXN0ZXIvZG9jcy9yZXNwb25zZXMvcGFja2FnZS1tZXRhZGF0YS5tZCNhYmJyZXZpYXRlZC12ZXJzaW9uLW9iamVjdFxuICAgICAgY29uc3QgX3ZlcnNpb25fYWJicmV2aWF0ZWQgPSB7XG4gICAgICAgIG5hbWU6IF92ZXJzaW9uLm5hbWUsXG4gICAgICAgIHZlcnNpb246IF92ZXJzaW9uLnZlcnNpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBfdmVyc2lvbi5kZXNjcmlwdGlvbixcbiAgICAgICAgZGVwcmVjYXRlZDogX3ZlcnNpb24uZGVwcmVjYXRlZCxcbiAgICAgICAgYmluOiBfdmVyc2lvbi5iaW4sXG4gICAgICAgIGRpc3Q6IF92ZXJzaW9uLmRpc3QsXG4gICAgICAgIGVuZ2luZXM6IF92ZXJzaW9uLmVuZ2luZXMsXG4gICAgICAgIGNwdTogX3ZlcnNpb24uY3B1LFxuICAgICAgICBvczogX3ZlcnNpb24ub3MsXG4gICAgICAgIGZ1bmRpbmc6IF92ZXJzaW9uLmZ1bmRpbmcsXG4gICAgICAgIGRpcmVjdG9yaWVzOiBfdmVyc2lvbi5kaXJlY3RvcmllcyxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBfdmVyc2lvbi5kZXBlbmRlbmNpZXMsXG4gICAgICAgIGRldkRlcGVuZGVuY2llczogX3ZlcnNpb24uZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgICBwZWVyRGVwZW5kZW5jaWVzOiBfdmVyc2lvbi5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgICBwZWVyRGVwZW5kZW5jaWVzTWV0YTogX3ZlcnNpb24ucGVlckRlcGVuZGVuY2llc01ldGEsXG4gICAgICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOiBfdmVyc2lvbi5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICAgICAgYnVuZGxlRGVwZW5kZW5jaWVzOiBfdmVyc2lvbi5idW5kbGVEZXBlbmRlbmNpZXMsXG4gICAgICAgIC8vIG5wbSBjbGkgc3BlY2lmaWNzXG4gICAgICAgIF9oYXNTaHJpbmt3cmFwOiBfdmVyc2lvbi5faGFzU2hyaW5rd3JhcCxcbiAgICAgICAgaGFzSW5zdGFsbFNjcmlwdDogaGFzSW5zdGFsbFNjcmlwdChfdmVyc2lvbiksXG4gICAgICB9O1xuICAgICAgYWNjW3ZlcnNpb25dID0gX3ZlcnNpb25fYWJicmV2aWF0ZWQ7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAge31cbiAgKTtcblxuICBjb25zdCBjb252ZXJ0ZWRNYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBtYW5pZmVzdFsnbmFtZSddLFxuICAgIFtESVNUX1RBR1NdOiBtYW5pZmVzdFtESVNUX1RBR1NdLFxuICAgIHZlcnNpb25zOiBhYmJyZXZpYXRlZFZlcnNpb25zLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBtb2RpZmllZDogbWFuaWZlc3Q/LnRpbWU/Lm1vZGlmaWVkLFxuICAgIC8vIE5PVEU6IHNwZWNpYWwgY2FzZSBmb3IgcG5wbSBodHRwczovL2dpdGh1Yi5jb20vcG5wbS9yZmNzL3B1bGwvMlxuICAgIHRpbWU6IG1hbmlmZXN0Py50aW1lLFxuICB9O1xuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGNvbnZlcnRlZE1hbmlmZXN0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUFpRSxTQUFBRCx1QkFBQVEsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUFBLFNBQUFHLFFBQUFILENBQUEsRUFBQUksQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEs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
;