payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
311 lines (310 loc) • 35.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
const _reacti18next = require("react-i18next");
const _reactrouterdom = require("react-router-dom");
const _types = require("../../../../fields/config/types");
const _getTranslation = require("../../../../utilities/getTranslation");
const _usePayloadAPI = /*#__PURE__*/ _interop_require_default(require("../../../hooks/usePayloadAPI"));
const _formatDate = require("../../../utilities/formatDate");
const _Gutter = require("../../elements/Gutter");
const _StepNav = require("../../elements/StepNav");
const _ActionsProvider = require("../../utilities/ActionsProvider");
const _Auth = require("../../utilities/Auth");
const _Config = require("../../utilities/Config");
const _DocumentInfo = require("../../utilities/DocumentInfo");
const _Locale = require("../../utilities/Locale");
const _Meta = /*#__PURE__*/ _interop_require_default(require("../../utilities/Meta"));
const _NotFound = /*#__PURE__*/ _interop_require_default(require("../NotFound"));
const _Compare = /*#__PURE__*/ _interop_require_default(require("./Compare"));
const _RenderFieldsToDiff = /*#__PURE__*/ _interop_require_default(require("./RenderFieldsToDiff"));
const _fields = /*#__PURE__*/ _interop_require_default(require("./RenderFieldsToDiff/fields"));
const _Restore = /*#__PURE__*/ _interop_require_default(require("./Restore"));
const _SelectLocales = /*#__PURE__*/ _interop_require_default(require("./SelectLocales"));
require("./index.scss");
const _shared = require("./shared");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const baseClass = 'view-version';
const VersionView = ({ collection, global })=>{
const { admin: { dateFormat }, localization, routes: { admin, api }, serverURL } = (0, _Config.useConfig)();
const { setStepNav } = (0, _StepNav.useStepNav)();
const { setViewActions } = (0, _ActionsProvider.useActions)();
const { params: { id, versionID } } = (0, _reactrouterdom.useRouteMatch)();
const [compareValue, setCompareValue] = (0, _react.useState)(_shared.mostRecentVersionOption);
const [localeOptions] = (0, _react.useState)(()=>{
if (localization && localization?.locales) {
return localization.locales.map(({ code, label })=>({
label: label,
value: code
}));
}
return [];
});
const [locales, setLocales] = (0, _react.useState)(localeOptions);
const { permissions } = (0, _Auth.useAuth)();
const { code: locale } = (0, _Locale.useLocale)();
const { i18n, t } = (0, _reacti18next.useTranslation)('version');
const { docPermissions } = (0, _DocumentInfo.useDocumentInfo)();
let originalDocFetchURL;
let versionFetchURL;
let entityLabel;
let fields;
let fieldPermissions;
let compareBaseURL;
let slug;
let parentID;
if (collection) {
({ slug } = collection);
originalDocFetchURL = `${serverURL}${api}/${slug}/${id}`;
versionFetchURL = `${serverURL}${api}/${slug}/versions/${versionID}`;
compareBaseURL = `${serverURL}${api}/${slug}/versions`;
entityLabel = (0, _getTranslation.getTranslation)(collection.labels.singular, i18n);
parentID = id;
fields = collection.fields;
fieldPermissions = permissions.collections[collection.slug].fields;
}
if (global) {
({ slug } = global);
originalDocFetchURL = `${serverURL}${api}/globals/${slug}`;
versionFetchURL = `${serverURL}${api}/globals/${slug}/versions/${versionID}`;
compareBaseURL = `${serverURL}${api}/globals/${slug}/versions`;
entityLabel = (0, _getTranslation.getTranslation)(global.label, i18n);
fields = global.fields;
fieldPermissions = permissions.globals[global.slug].fields;
}
const compareFetchURL = compareValue?.value === 'mostRecent' || compareValue?.value === 'published' ? originalDocFetchURL : `${compareBaseURL}/${compareValue.value}`;
const [{ data: doc, isError }] = (0, _usePayloadAPI.default)(versionFetchURL, {
initialParams: {
depth: 1,
locale: '*'
}
});
const [{ data: publishedDoc }] = (0, _usePayloadAPI.default)(originalDocFetchURL, {
initialParams: {
depth: 1,
locale: '*'
}
});
const [{ data: mostRecentDoc }] = (0, _usePayloadAPI.default)(originalDocFetchURL, {
initialParams: {
depth: 1,
draft: true,
locale: '*'
}
});
const [{ data: compareDoc }] = (0, _usePayloadAPI.default)(compareFetchURL, {
initialParams: {
depth: 1,
draft: 'true',
locale: '*'
}
});
(0, _react.useEffect)(()=>{
let nav = [];
if (collection) {
let docLabel = '';
if (mostRecentDoc) {
const { useAsTitle } = collection.admin;
if (useAsTitle !== 'id') {
const titleField = collection.fields.find((field)=>(0, _types.fieldAffectsData)(field) && field.name === useAsTitle);
if (titleField && mostRecentDoc[useAsTitle]) {
if (titleField.localized) {
docLabel = mostRecentDoc[useAsTitle]?.[locale];
} else {
docLabel = mostRecentDoc[useAsTitle];
}
} else {
docLabel = `[${t('general:untitled')}]`;
}
} else {
docLabel = mostRecentDoc.id;
}
}
nav = [
{
label: (0, _getTranslation.getTranslation)(collection.labels.plural, i18n),
url: `${admin}/collections/${collection.slug}`
},
{
label: docLabel,
url: `${admin}/collections/${collection.slug}/${id}`
},
{
label: 'Versions',
url: `${admin}/collections/${collection.slug}/${id}/versions`
},
{
label: doc?.createdAt ? (0, _formatDate.formatDate)(doc.createdAt, dateFormat, i18n?.language) : ''
}
];
}
if (global) {
nav = [
{
label: global.label,
url: `${admin}/globals/${global.slug}`
},
{
label: 'Versions',
url: `${admin}/globals/${global.slug}/versions`
},
{
label: doc?.createdAt ? (0, _formatDate.formatDate)(doc.createdAt, dateFormat, i18n?.language) : ''
}
];
}
setStepNav(nav);
}, [
setStepNav,
collection,
global,
dateFormat,
doc,
mostRecentDoc,
admin,
id,
locale,
t,
i18n
]);
(0, _react.useEffect)(()=>{
const editConfig = (collection || global)?.admin?.components?.views?.Edit;
const versionActions = editConfig && 'Version' in editConfig && 'actions' in editConfig.Version ? editConfig.Version.actions : [];
setViewActions(versionActions);
return ()=>{
setViewActions([]);
};
}, [
collection,
global,
setViewActions
]);
let metaTitle;
let metaDesc;
const formattedCreatedAt = doc?.createdAt ? (0, _formatDate.formatDate)(doc.createdAt, dateFormat, i18n?.language) : '';
if (collection) {
const useAsTitle = collection?.admin?.useAsTitle || 'id';
metaTitle = `${t('version')} - ${formattedCreatedAt} - ${doc[useAsTitle]} - ${entityLabel}`;
metaDesc = t('viewingVersion', {
documentTitle: doc[useAsTitle],
entityLabel
});
}
if (global) {
metaTitle = `${t('version')} - ${formattedCreatedAt} - ${entityLabel}`;
metaDesc = t('viewingVersionGlobal', {
entityLabel
});
}
let comparison = compareDoc?.version;
if (compareValue?.value === 'mostRecent') {
comparison = mostRecentDoc;
}
if (compareValue?.value === 'published') {
comparison = publishedDoc;
}
const canUpdate = docPermissions?.update?.permission;
if (isError) {
return /*#__PURE__*/ _react.default.createElement(_NotFound.default, {
marginTop: "large"
});
}
return /*#__PURE__*/ _react.default.createElement("main", {
className: baseClass
}, /*#__PURE__*/ _react.default.createElement(_Meta.default, {
description: metaDesc,
title: metaTitle
}), /*#__PURE__*/ _react.default.createElement(_Gutter.Gutter, {
className: `${baseClass}__wrap`
}, /*#__PURE__*/ _react.default.createElement("div", {
className: `${baseClass}__header-wrap`
}, /*#__PURE__*/ _react.default.createElement("p", {
className: `${baseClass}__created-at`
}, t('versionCreatedOn', {
version: t(doc?.autosave ? 'autosavedVersion' : 'version')
})), /*#__PURE__*/ _react.default.createElement("header", {
className: `${baseClass}__header`
}, /*#__PURE__*/ _react.default.createElement("h2", null, formattedCreatedAt), canUpdate && /*#__PURE__*/ _react.default.createElement(_Restore.default, {
className: `${baseClass}__restore`,
collection: collection,
global: global,
originalDocID: id,
versionDate: formattedCreatedAt,
versionID: versionID
}))), /*#__PURE__*/ _react.default.createElement("div", {
className: `${baseClass}__controls`
}, /*#__PURE__*/ _react.default.createElement(_Compare.default, {
baseURL: compareBaseURL,
onChange: setCompareValue,
parentID: parentID,
publishedDoc: publishedDoc,
value: compareValue,
versionID: versionID
}), localization && /*#__PURE__*/ _react.default.createElement(_SelectLocales.default, {
onChange: setLocales,
options: localeOptions,
value: locales
})), doc?.version && /*#__PURE__*/ _react.default.createElement(_RenderFieldsToDiff.default, {
comparison: comparison,
fieldComponents: _fields.default,
fieldPermissions: fieldPermissions,
fields: fields,
locales: locales ? locales.map(({ label })=>typeof label === 'string' ? label : undefined) : [],
version: doc?.version
})));
};
const _default = VersionView;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3ZpZXdzL1ZlcnNpb24vVmVyc2lvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVJvdXRlTWF0Y2ggfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJ1xuXG5pbXBvcnQgdHlwZSB7IEZpZWxkUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9hdXRoJ1xuaW1wb3J0IHR5cGUgeyBGaWVsZCwgRmllbGRBZmZlY3RpbmdEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvUmVhY3RTZWxlY3QvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFN0ZXBOYXZJdGVtIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvU3RlcE5hdi90eXBlcydcbmltcG9ydCB0eXBlIHsgQ29tcGFyZU9wdGlvbiwgUHJvcHMgfSBmcm9tICcuL3R5cGVzJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCB7IGdldFRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbGl0aWVzL2dldFRyYW5zbGF0aW9uJ1xuaW1wb3J0IHVzZVBheWxvYWRBUEkgZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUGF5bG9hZEFQSSdcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMvZm9ybWF0RGF0ZSdcbmltcG9ydCB7IEd1dHRlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL0d1dHRlcidcbmltcG9ydCB7IHVzZVN0ZXBOYXYgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9TdGVwTmF2J1xuaW1wb3J0IHsgdXNlQWN0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9BY3Rpb25zUHJvdmlkZXInXG5pbXBvcnQgeyB1c2VBdXRoIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0F1dGgnXG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvQ29uZmlnJ1xuaW1wb3J0IHsgdXNlRG9jdW1lbnRJbmZvIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0RvY3VtZW50SW5mbydcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Mb2NhbGUnXG5pbXBvcnQgTWV0YSBmcm9tICcuLi8uLi91dGlsaXRpZXMvTWV0YSdcbmltcG9ydCBOb3RGb3VuZCBmcm9tICcuLi9Ob3RGb3VuZCdcbmltcG9ydCBDb21wYXJlVmVyc2lvbiBmcm9tICcuL0NvbXBhcmUnXG5pbXBvcnQgUmVuZGVyRmllbGRzVG9EaWZmIGZyb20gJy4vUmVuZGVyRmllbGRzVG9EaWZmJ1xuaW1wb3J0IGZpZWxkQ29tcG9uZW50cyBmcm9tICcuL1JlbmRlckZpZWxkc1RvRGlmZi9maWVsZHMnXG5pbXBvcnQgUmVzdG9yZSBmcm9tICcuL1Jlc3RvcmUnXG5pbXBvcnQgU2VsZWN0TG9jYWxlcyBmcm9tICcuL1NlbGVjdExvY2FsZXMnXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcbmltcG9ydCB7IG1vc3RSZWNlbnRWZXJzaW9uT3B0aW9uIH0gZnJvbSAnLi9zaGFyZWQnXG5cbmNvbnN0IGJhc2VDbGFzcyA9ICd2aWV3LXZlcnNpb24nXG5cbmNvbnN0IFZlcnNpb25WaWV3OiBSZWFjdC5GQzxQcm9wcz4gPSAoeyBjb2xsZWN0aW9uLCBnbG9iYWwgfSkgPT4ge1xuICBjb25zdCB7XG4gICAgYWRtaW46IHsgZGF0ZUZvcm1hdCB9LFxuICAgIGxvY2FsaXphdGlvbixcbiAgICByb3V0ZXM6IHsgYWRtaW4sIGFwaSB9LFxuICAgIHNlcnZlclVSTCxcbiAgfSA9IHVzZUNvbmZpZygpXG4gIGNvbnN0IHsgc2V0U3RlcE5hdiB9ID0gdXNlU3RlcE5hdigpXG5cbiAgY29uc3QgeyBzZXRWaWV3QWN0aW9ucyB9ID0gdXNlQWN0aW9ucygpXG5cbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBpZCwgdmVyc2lvbklEIH0sXG4gIH0gPSB1c2VSb3V0ZU1hdGNoPHsgaWQ/OiBzdHJpbmc7IHZlcnNpb25JRDogc3RyaW5nIH0+KClcblxuICBjb25zdCBbY29tcGFyZVZhbHVlLCBzZXRDb21wYXJlVmFsdWVdID0gdXNlU3RhdGU8Q29tcGFyZU9wdGlvbj4obW9zdFJlY2VudFZlcnNpb25PcHRpb24pXG4gIGNvbnN0IFtsb2NhbGVPcHRpb25zXSA9IHVzZVN0YXRlPE9wdGlvbltdPigoKSA9PiB7XG4gICAgaWYgKGxvY2FsaXphdGlvbiAmJiBsb2NhbGl6YXRpb24/LmxvY2FsZXMpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6YXRpb24ubG9jYWxlcy5tYXAoKHsgY29kZSwgbGFiZWwgfSkgPT4gKHtcbiAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICB2YWx1ZTogY29kZSxcbiAgICAgIH0pKVxuICAgIH1cbiAgICByZXR1cm4gW11cbiAgfSlcbiAgY29uc3QgW2xvY2FsZXMsIHNldExvY2FsZXNdID0gdXNlU3RhdGU8T3B0aW9uW10+KGxvY2FsZU9wdGlvbnMpXG4gIGNvbnN0IHsgcGVybWlzc2lvbnMgfSA9IHVzZUF1dGgoKVxuICBjb25zdCB7IGNvZGU6IGxvY2FsZSB9ID0gdXNlTG9jYWxlKClcbiAgY29uc3QgeyBpMThuLCB0IH0gPSB1c2VUcmFuc2xhdGlvbigndmVyc2lvbicpXG4gIGNvbnN0IHsgZG9jUGVybWlzc2lvbnMgfSA9IHVzZURvY3VtZW50SW5mbygpXG5cbiAgbGV0IG9yaWdpbmFsRG9jRmV0Y2hVUkw6IHN0cmluZ1xuICBsZXQgdmVyc2lvbkZldGNoVVJMOiBzdHJpbmdcbiAgbGV0IGVudGl0eUxhYmVsOiBzdHJpbmdcbiAgbGV0IGZpZWxkczogRmllbGRbXVxuICBsZXQgZmllbGRQZXJtaXNzaW9uczogUmVjb3JkPHN0cmluZywgRmllbGRQZXJtaXNzaW9ucz5cbiAgbGV0IGNvbXBhcmVCYXNlVVJMOiBzdHJpbmdcbiAgbGV0IHNsdWc6IHN0cmluZ1xuICBsZXQgcGFyZW50SUQ6IHN0cmluZ1xuXG4gIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgOyh7IHNsdWcgfSA9IGNvbGxlY3Rpb24pXG4gICAgb3JpZ2luYWxEb2NGZXRjaFVSTCA9IGAke3NlcnZlclVSTH0ke2FwaX0vJHtzbHVnfS8ke2lkfWBcbiAgICB2ZXJzaW9uRmV0Y2hVUkwgPSBgJHtzZXJ2ZXJVUkx9JHthcGl9LyR7c2x1Z30vdmVyc2lvbnMvJHt2ZXJzaW9uSUR9YFxuICAgIGNvbXBhcmVCYXNlVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS8ke3NsdWd9L3ZlcnNpb25zYFxuICAgIGVudGl0eUxhYmVsID0gZ2V0VHJhbnNsYXRpb24oY29sbGVjdGlvbi5sYWJlbHMuc2luZ3VsYXIsIGkxOG4pXG4gICAgcGFyZW50SUQgPSBpZFxuICAgIGZpZWxkcyA9IGNvbGxlY3Rpb24uZmllbGRzXG4gICAgZmllbGRQZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zLmNvbGxlY3Rpb25zW2NvbGxlY3Rpb24uc2x1Z10uZmllbGRzXG4gIH1cblxuICBpZiAoZ2xvYmFsKSB7XG4gICAgOyh7IHNsdWcgfSA9IGdsb2JhbClcbiAgICBvcmlnaW5hbERvY0ZldGNoVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7c2x1Z31gXG4gICAgdmVyc2lvbkZldGNoVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7c2x1Z30vdmVyc2lvbnMvJHt2ZXJzaW9uSUR9YFxuICAgIGNvbXBhcmVCYXNlVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7c2x1Z30vdmVyc2lvbnNgXG4gICAgZW50aXR5TGFiZWwgPSBnZXRUcmFuc2xhdGlvbihnbG9iYWwubGFiZWwsIGkxOG4pXG4gICAgZmllbGRzID0gZ2xvYmFsLmZpZWxkc1xuICAgIGZpZWxkUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucy5nbG9iYWxzW2dsb2JhbC5zbHVnXS5maWVsZHNcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcmVGZXRjaFVSTCA9XG4gICAgY29tcGFyZVZhbHVlPy52YWx1ZSA9PT0gJ21vc3RSZWNlbnQnIHx8IGNvbXBhcmVWYWx1ZT8udmFsdWUgPT09ICdwdWJsaXNoZWQnXG4gICAgICA/IG9yaWdpbmFsRG9jRmV0Y2hVUkxcbiAgICAgIDogYCR7Y29tcGFyZUJhc2VVUkx9LyR7Y29tcGFyZVZhbHVlLnZhbHVlfWBcblxuICBjb25zdCBbeyBkYXRhOiBkb2MsIGlzRXJyb3IgfV0gPSB1c2VQYXlsb2FkQVBJKHZlcnNpb25GZXRjaFVSTCwge1xuICAgIGluaXRpYWxQYXJhbXM6IHsgZGVwdGg6IDEsIGxvY2FsZTogJyonIH0sXG4gIH0pXG4gIGNvbnN0IFt7IGRhdGE6IHB1Ymxpc2hlZERvYyB9XSA9IHVzZVBheWxvYWRBUEkob3JpZ2luYWxEb2NGZXRjaFVSTCwge1xuICAgIGluaXRpYWxQYXJhbXM6IHsgZGVwdGg6IDEsIGxvY2FsZTogJyonIH0sXG4gIH0pXG4gIGNvbnN0IFt7IGRhdGE6IG1vc3RSZWNlbnREb2MgfV0gPSB1c2VQYXlsb2FkQVBJKG9yaWdpbmFsRG9jRmV0Y2hVUkwsIHtcbiAgICBpbml0aWFsUGFyYW1zOiB7IGRlcHRoOiAxLCBkcmFmdDogdHJ1ZSwgbG9jYWxlOiAnKicgfSxcbiAgfSlcbiAgY29uc3QgW3sgZGF0YTogY29tcGFyZURvYyB9XSA9IHVzZVBheWxvYWRBUEkoY29tcGFyZUZldGNoVVJMLCB7XG4gICAgaW5pdGlhbFBhcmFtczogeyBkZXB0aDogMSwgZHJhZnQ6ICd0cnVlJywgbG9jYWxlOiAnKicgfSxcbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBuYXY6IFN0ZXBOYXZJdGVtW10gPSBbXVxuXG4gICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgIGxldCBkb2NMYWJlbCA9ICcnXG5cbiAgICAgIGlmIChtb3N0UmVjZW50RG9jKSB7XG4gICAgICAgIGNvbnN0IHsgdXNlQXNUaXRsZSB9ID0gY29sbGVjdGlvbi5hZG1pblxuXG4gICAgICAgIGlmICh1c2VBc1RpdGxlICE9PSAnaWQnKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGVGaWVsZCA9IGNvbGxlY3Rpb24uZmllbGRzLmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09IHVzZUFzVGl0bGUsXG4gICAgICAgICAgKSBhcyBGaWVsZEFmZmVjdGluZ0RhdGFcblxuICAgICAgICAgIGlmICh0aXRsZUZpZWxkICYmIG1vc3RSZWNlbnREb2NbdXNlQXNUaXRsZV0pIHtcbiAgICAgICAgICAgIGlmICh0aXRsZUZpZWxkLmxvY2FsaXplZCkge1xuICAgICAgICAgICAgICBkb2NMYWJlbCA9IG1vc3RSZWNlbnREb2NbdXNlQXNUaXRsZV0/Lltsb2NhbGVdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkb2NMYWJlbCA9IG1vc3RSZWNlbnREb2NbdXNlQXNUaXRsZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jTGFiZWwgPSBgWyR7dCgnZ2VuZXJhbDp1bnRpdGxlZCcpfV1gXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY0xhYmVsID0gbW9zdFJlY2VudERvYy5pZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hdiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBnZXRUcmFuc2xhdGlvbihjb2xsZWN0aW9uLmxhYmVscy5wbHVyYWwsIGkxOG4pLFxuICAgICAgICAgIHVybDogYCR7YWRtaW59L2NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbi5zbHVnfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogZG9jTGFiZWwsXG4gICAgICAgICAgdXJsOiBgJHthZG1pbn0vY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uLnNsdWd9LyR7aWR9YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVmVyc2lvbnMnLFxuICAgICAgICAgIHVybDogYCR7YWRtaW59L2NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbi5zbHVnfS8ke2lkfS92ZXJzaW9uc2AsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogZG9jPy5jcmVhdGVkQXQgPyBmb3JtYXREYXRlKGRvYy5jcmVhdGVkQXQsIGRhdGVGb3JtYXQsIGkxOG4/Lmxhbmd1YWdlKSA6ICcnLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgIH1cblxuICAgIGlmIChnbG9iYWwpIHtcbiAgICAgIG5hdiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBnbG9iYWwubGFiZWwsXG4gICAgICAgICAgdXJsOiBgJHthZG1pbn0vZ2xvYmFscy8ke2dsb2JhbC5zbHVnfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1ZlcnNpb25zJyxcbiAgICAgICAgICB1cmw6IGAke2FkbWlufS9nbG9iYWxzLyR7Z2xvYmFsLnNsdWd9L3ZlcnNpb25zYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBkb2M/LmNyZWF0ZWRBdCA/IGZvcm1hdERhdGUoZG9jLmNyZWF0ZWRBdCwgZGF0ZUZvcm1hdCwgaTE4bj8ubGFuZ3VhZ2UpIDogJycsXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgfVxuXG4gICAgc2V0U3RlcE5hdihuYXYpXG4gIH0sIFtzZXRTdGVwTmF2LCBjb2xsZWN0aW9uLCBnbG9iYWwsIGRhdGVGb3JtYXQsIGRvYywgbW9zdFJlY2VudERvYywgYWRtaW4sIGlkLCBsb2NhbGUsIHQsIGkxOG5dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWRpdENvbmZpZyA9IChjb2xsZWN0aW9uIHx8IGdsb2JhbCk/LmFkbWluPy5jb21wb25lbnRzPy52aWV3cz8uRWRpdFxuICAgIGNvbnN0IHZlcnNpb25BY3Rpb25zID1cbiAgICAgIGVkaXRDb25maWcgJiYgJ1ZlcnNpb24nIGluIGVkaXRDb25maWcgJiYgJ2FjdGlvbnMnIGluIGVkaXRDb25maWcuVmVyc2lvblxuICAgICAgICA/IGVkaXRDb25maWcuVmVyc2lvbi5hY3Rpb25zXG4gICAgICAgIDogW11cblxuICAgIHNldFZpZXdBY3Rpb25zKHZlcnNpb25BY3Rpb25zKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNldFZpZXdBY3Rpb25zKFtdKVxuICAgIH1cbiAgfSwgW2NvbGxlY3Rpb24sIGdsb2JhbCwgc2V0Vmlld0FjdGlvbnNdKVxuXG4gIGxldCBtZXRhVGl0bGU6IHN0cmluZ1xuICBsZXQgbWV0YURlc2M6IHN0cmluZ1xuICBjb25zdCBmb3JtYXR0ZWRDcmVhdGVkQXQgPSBkb2M/LmNyZWF0ZWRBdFxuICAgID8gZm9ybWF0RGF0ZShkb2MuY3JlYXRlZEF0LCBkYXRlRm9ybWF0LCBpMThuPy5sYW5ndWFnZSlcbiAgICA6ICcnXG5cbiAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICBjb25zdCB1c2VBc1RpdGxlID0gY29sbGVjdGlvbj8uYWRtaW4/LnVzZUFzVGl0bGUgfHwgJ2lkJ1xuICAgIG1ldGFUaXRsZSA9IGAke3QoJ3ZlcnNpb24nKX0gLSAke2Zvcm1hdHRlZENyZWF0ZWRBdH0gLSAke2RvY1t1c2VBc1RpdGxlXX0gLSAke2VudGl0eUxhYmVsfWBcbiAgICBtZXRhRGVzYyA9IHQoJ3ZpZXdpbmdWZXJzaW9uJywgeyBkb2N1bWVudFRpdGxlOiBkb2NbdXNlQXNUaXRsZV0sIGVudGl0eUxhYmVsIH0pXG4gIH1cblxuICBpZiAoZ2xvYmFsKSB7XG4gICAgbWV0YVRpdGxlID0gYCR7dCgndmVyc2lvbicpfSAtICR7Zm9ybWF0dGVkQ3JlYXRlZEF0fSAtICR7ZW50aXR5TGFiZWx9YFxuICAgIG1ldGFEZXNjID0gdCgndmlld2luZ1ZlcnNpb25HbG9iYWwnLCB7IGVudGl0eUxhYmVsIH0pXG4gIH1cblxuICBsZXQgY29tcGFyaXNvbiA9IGNvbXBhcmVEb2M/LnZlcnNpb25cblxuICBpZiAoY29tcGFyZVZhbHVlPy52YWx1ZSA9PT0gJ21vc3RSZWNlbnQnKSB7XG4gICAgY29tcGFyaXNvbiA9IG1vc3RSZWNlbnREb2NcbiAgfVxuXG4gIGlmIChjb21wYXJlVmFsdWU/LnZhbHVlID09PSAncHVibGlzaGVkJykge1xuICAgIGNvbXBhcmlzb24gPSBwdWJsaXNoZWREb2NcbiAgfVxuXG4gIGNvbnN0IGNhblVwZGF0ZSA9IGRvY1Blcm1pc3Npb25zPy51cGRhdGU/LnBlcm1pc3Npb25cblxuICBpZiAoaXNFcnJvcikge1xuICAgIHJldHVybiA8Tm90Rm91bmQgbWFyZ2luVG9wPVwibGFyZ2VcIiAvPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9e2Jhc2VDbGFzc30+XG4gICAgICA8TWV0YSBkZXNjcmlwdGlvbj17bWV0YURlc2N9IHRpdGxlPXttZXRhVGl0bGV9IC8+XG4gICAgICA8R3V0dGVyIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fd3JhcGB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9faGVhZGVyLXdyYXBgfT5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2NyZWF0ZWQtYXRgfT5cbiAgICAgICAgICAgIHt0KCd2ZXJzaW9uQ3JlYXRlZE9uJywge1xuICAgICAgICAgICAgICB2ZXJzaW9uOiB0KGRvYz8uYXV0b3NhdmUgPyAnYXV0b3NhdmVkVmVyc2lvbicgOiAndmVyc2lvbicpLFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtgJHtiYXNlQ2xhc3N9X19oZWFkZXJgfT5cbiAgICAgICAgICAgIDxoMj57Zm9ybWF0dGVkQ3JlYXRlZEF0fTwvaDI+XG4gICAgICAgICAgICB7Y2FuVXBkYXRlICYmIChcbiAgICAgICAgICAgICAgPFJlc3RvcmVcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX3Jlc3RvcmVgfVxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb249e2NvbGxlY3Rpb259XG4gICAgICAgICAgICAgICAgZ2xvYmFsPXtnbG9iYWx9XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEb2NJRD17aWR9XG4gICAgICAgICAgICAgICAgdmVyc2lvbkRhdGU9e2Zvcm1hdHRlZENyZWF0ZWRBdH1cbiAgICAgICAgICAgICAgICB2ZXJzaW9uSUQ9e3ZlcnNpb25JRH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fY29udHJvbHNgfT5cbiAgICAgICAgICA8Q29tcGFyZVZlcnNpb25cbiAgICAgICAgICAgIGJhc2VVUkw9e2NvbXBhcmVCYXNlVVJMfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3NldENvbXBhcmVWYWx1ZX1cbiAgICAgICAgICAgIHBhcmVudElEPXtwYXJlbnRJRH1cbiAgICAgICAgICAgIHB1Ymxpc2hlZERvYz17cHVibGlzaGVkRG9jfVxuICAgICAgICAgICAgdmFsdWU9e2NvbXBhcmVWYWx1ZX1cbiAgICAgICAgICAgIHZlcnNpb25JRD17dmVyc2lvbklEfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge2xvY2FsaXphdGlvbiAmJiAoXG4gICAgICAgICAgICA8U2VsZWN0TG9jYWxlcyBvbkNoYW5nZT17c2V0TG9jYWxlc30gb3B0aW9ucz17bG9jYWxlT3B0aW9uc30gdmFsdWU9e2xvY2FsZXN9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAge2RvYz8udmVyc2lvbiAmJiAoXG4gICAgICAgICAgPFJlbmRlckZpZWxkc1RvRGlmZlxuICAgICAgICAgICAgY29tcGFyaXNvbj17Y29tcGFyaXNvbn1cbiAgICAgICAgICAgIGZpZWxkQ29tcG9uZW50cz17ZmllbGRDb21wb25lbnRzfVxuICAgICAgICAgICAgZmllbGRQZXJtaXNzaW9ucz17ZmllbGRQZXJtaXNzaW9uc31cbiAgICAgICAgICAgIGZpZWxkcz17ZmllbGRzfVxuICAgICAgICAgICAgbG9jYWxlcz17XG4gICAgICAgICAgICAgIGxvY2FsZXNcbiAgICAgICAgICAgICAgICA/IGxvY2FsZXMubWFwKCh7IGxhYmVsIH0pID0+ICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnID8gbGFiZWwgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIDogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnNpb249e2RvYz8udmVyc2lvbn1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9HdXR0ZXI+XG4gICAgPC9tYWluPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlcnNpb25WaWV3XG4iXSwibmFtZXMiOlsiYmFzZUNsYXNzIiwiVmVyc2lvblZpZXciLCJjb2xsZWN0aW9uIiwiZ2xvYmFsIiwiYWRtaW4iLCJkYXRlRm9ybWF0IiwibG9jYWxpemF0aW9uIiwicm91dGVzIiwiYXBpIiwic2VydmVyVVJMIiwidXNlQ29uZmlnIiwic2V0U3RlcE5hdiIsInVzZVN0ZXBOYXYiLCJzZXRWaWV3QWN0aW9ucyIsInVzZUFjdGlvbnMiLCJwYXJhbXMiLCJpZCIsInZlcnNpb25JRCIsInVzZVJvdXRlTWF0Y2giLCJjb21wYXJlVmFsdWUiLCJzZXRDb21wYXJlVmFsdWUiLCJ1c2VTdGF0ZSIsIm1vc3RSZWNlbnRWZXJzaW9uT3B0aW9uIiwibG9jYWxlT3B0aW9ucyIsImxvY2FsZXMiLCJtYXAiLCJjb2RlIiwibGFiZWwiLCJ2YWx1ZSIsInNldExvY2FsZXMiLCJwZXJtaXNzaW9ucyIsInVzZUF1dGgiLCJsb2NhbGUiLCJ1c2VMb2NhbGUiLCJpMThuIiwidCIsInVzZVRyYW5zbGF0aW9uIiwiZG9jUGVybWlzc2lvbnMiLCJ1c2VEb2N1bWVudEluZm8iLCJvcmlnaW5hbERvY0ZldGNoVVJMIiwidmVyc2lvbkZldGNoVVJMIiwiZW50aXR5TGFiZWwiLCJmaWVsZHMiLCJmaWVsZFBlcm1pc3Npb25zIiwiY29tcGFyZUJhc2VVUkwiLCJzbHVnIiwicGFyZW50SUQiLCJnZXRUcmFuc2xhdGlvbiIsImxhYmVscyIsInNpbmd1bGFyIiwiY29sbGVjdGlvbnMiLCJnbG9iYWxzIiwiY29tcGFyZUZldGNoVVJMIiwiZGF0YSIsImRvYyIsImlzRXJyb3IiLCJ1c2VQYXlsb2FkQVBJIiwiaW5pdGlhbFBhcmFtcyIsImRlcHRoIiwicHVibGlzaGVkRG9jIiwibW9zdFJlY2VudERvYyIsImRyYWZ0IiwiY29tcGFyZURvYyIsInVzZUVmZmVjdCIsIm5hdiIsImRvY0xhYmVsIiwidXNlQXNUaXRsZSIsInRpdGxlRmllbGQiLCJmaW5kIiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsImxvY2FsaXplZCIsInBsdXJhbCIsInVybCIsImNyZWF0ZWRBdCIsImZvcm1hdERhdGUiLCJsYW5ndWFnZSIsImVkaXRDb25maWciLCJjb21wb25lbnRzIiwidmlld3MiLCJFZGl0IiwidmVyc2lvbkFjdGlvbnMiLCJWZXJzaW9uIiwiYWN0aW9ucyIsIm1ldGFUaXRsZSIsIm1ldGFEZXNjIiwiZm9ybWF0dGVkQ3JlYXRlZEF0IiwiZG9jdW1lbnRUaXRsZSIsImNvbXBhcmlzb24iLCJ2ZXJzaW9uIiwiY2FuVXBkYXRlIiwidXBkYXRlIiwicGVybWlzc2lvbiIsIk5vdEZvdW5kIiwibWFyZ2luVG9wIiwibWFpbiIsImNsYXNzTmFtZSIsIk1ldGEiLCJkZXNjcmlwdGlvbiIsInRpdGxlIiwiR3V0dGVyIiwiZGl2IiwicCIsImF1dG9zYXZlIiwiaGVhZGVyIiwiaDIiLCJSZXN0b3JlIiwib3JpZ2luYWxEb2NJRCIsInZlcnNpb25EYXRlIiwiQ29tcGFyZVZlcnNpb24iLCJiYXNlVVJMIiwib25DaGFuZ2UiLCJTZWxlY3RMb2NhbGVzIiwib3B0aW9ucyIsIlJlbmRlckZpZWxkc1RvRGlmZiIsImZpZWxkQ29tcG9uZW50cyIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwUkE7OztlQUFBOzs7K0RBMVIyQzs4QkFDWjtnQ0FDRDt1QkFRRztnQ0FDRjtzRUFDTDs0QkFDQzt3QkFDSjt5QkFDSTtpQ0FDQTtzQkFDSDt3QkFDRTs4QkFDTTt3QkFDTjs2REFDVDtpRUFDSTtnRUFDTTsyRUFDSTsrREFDSDtnRUFDUjtzRUFDTTtRQUNuQjt3QkFDaUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXhDLE1BQU1BLFlBQVk7QUFFbEIsTUFBTUMsY0FBK0IsQ0FBQyxFQUFFQyxVQUFVLEVBQUVDLE1BQU0sRUFBRTtJQUMxRCxNQUFNLEVBQ0pDLE9BQU8sRUFBRUMsVUFBVSxFQUFFLEVBQ3JCQyxZQUFZLEVBQ1pDLFFBQVEsRUFBRUgsS0FBSyxFQUFFSSxHQUFHLEVBQUUsRUFDdEJDLFNBQVMsRUFDVixHQUFHQyxJQUFBQSxpQkFBUztJQUNiLE1BQU0sRUFBRUMsVUFBVSxFQUFFLEdBQUdDLElBQUFBLG1CQUFVO0lBRWpDLE1BQU0sRUFBRUMsY0FBYyxFQUFFLEdBQUdDLElBQUFBLDJCQUFVO0lBRXJDLE1BQU0sRUFDSkMsUUFBUSxFQUFFQyxFQUFFLEVBQUVDLFNBQVMsRUFBRSxFQUMxQixHQUFHQyxJQUFBQSw2QkFBYTtJQUVqQixNQUFNLENBQUNDLGNBQWNDLGdCQUFnQixHQUFHQyxJQUFBQSxlQUFRLEVBQWdCQywrQkFBdUI7SUFDdkYsTUFBTSxDQUFDQyxjQUFjLEdBQUdGLElBQUFBLGVBQVEsRUFBVztRQUN6QyxJQUFJZixnQkFBZ0JBLGNBQWNrQixTQUFTO1lBQ3pDLE9BQU9sQixhQUFha0IsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRSxH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