payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
144 lines (143 loc) • 18.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _deepmerge = /*#__PURE__*/ _interop_require_default(require("deepmerge"));
const _isplainobject = require("is-plain-object");
const _accountLock = /*#__PURE__*/ _interop_require_default(require("../../auth/baseFields/accountLock"));
const _apiKey = /*#__PURE__*/ _interop_require_default(require("../../auth/baseFields/apiKey"));
const _auth = /*#__PURE__*/ _interop_require_default(require("../../auth/baseFields/auth"));
const _verification = /*#__PURE__*/ _interop_require_default(require("../../auth/baseFields/verification"));
const _TimestampsRequired = /*#__PURE__*/ _interop_require_default(require("../../errors/TimestampsRequired"));
const _sanitize = require("../../fields/config/sanitize");
const _types = require("../../fields/config/types");
const _mergeBaseFields = /*#__PURE__*/ _interop_require_default(require("../../fields/mergeBaseFields"));
const _extractTranslations = require("../../translations/extractTranslations");
const _getBaseFields = /*#__PURE__*/ _interop_require_default(require("../../uploads/getBaseFields"));
const _formatLabels = require("../../utilities/formatLabels");
const _baseFields = /*#__PURE__*/ _interop_require_default(require("../../versions/baseFields"));
const _defaults = require("./defaults");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const translations = (0, _extractTranslations.extractTranslations)([
'general:createdAt',
'general:updatedAt'
]);
const sanitizeCollection = (config, collection)=>{
// /////////////////////////////////
// Make copy of collection config
// /////////////////////////////////
const sanitized = (0, _deepmerge.default)(_defaults.defaults, collection, {
isMergeableObject: _isplainobject.isPlainObject
});
if (sanitized.timestamps !== false) {
// add default timestamps fields only as needed
let hasUpdatedAt = null;
let hasCreatedAt = null;
sanitized.fields.some((field)=>{
if ((0, _types.fieldAffectsData)(field)) {
if (field.name === 'updatedAt') hasUpdatedAt = true;
if (field.name === 'createdAt') hasCreatedAt = true;
}
return hasCreatedAt && hasUpdatedAt;
});
if (!hasUpdatedAt) {
sanitized.fields.push({
name: 'updatedAt',
admin: {
disableBulkEdit: true,
hidden: true
},
label: translations['general:updatedAt'],
type: 'date'
});
}
if (!hasCreatedAt) {
sanitized.fields.push({
name: 'createdAt',
admin: {
disableBulkEdit: true,
hidden: true
},
// The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.
index: true,
label: translations['general:createdAt'],
type: 'date'
});
}
}
sanitized.labels = sanitized.labels || (0, _formatLabels.formatLabels)(sanitized.slug);
if (sanitized.versions) {
if (sanitized.versions === true) sanitized.versions = {
drafts: false
};
if (sanitized.timestamps === false) {
throw new _TimestampsRequired.default(collection);
}
if (sanitized.versions.drafts) {
if (sanitized.versions.drafts === true) {
sanitized.versions.drafts = {
autosave: false
};
}
if (sanitized.versions.drafts.autosave === true) {
sanitized.versions.drafts.autosave = {
interval: 2000
};
}
sanitized.fields = (0, _mergeBaseFields.default)(sanitized.fields, _baseFields.default);
}
}
if (sanitized.upload) {
if (sanitized.upload === true) sanitized.upload = {};
sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug;
sanitized.upload.staticURL = sanitized.upload.staticURL || `/${sanitized.slug}`;
sanitized.admin.useAsTitle = sanitized.admin.useAsTitle && sanitized.admin.useAsTitle !== 'id' ? sanitized.admin.useAsTitle : 'filename';
const uploadFields = (0, _getBaseFields.default)({
collection: sanitized,
config
});
sanitized.fields = (0, _mergeBaseFields.default)(sanitized.fields, uploadFields);
}
if (sanitized.auth) {
sanitized.auth = (0, _deepmerge.default)(_defaults.authDefaults, typeof sanitized.auth === 'object' ? sanitized.auth : {}, {
isMergeableObject: _isplainobject.isPlainObject
});
let authFields = [];
if (sanitized.auth.useAPIKey) {
authFields = authFields.concat(_apiKey.default);
}
if (!sanitized.auth.disableLocalStrategy) {
authFields = authFields.concat(_auth.default);
if (sanitized.auth.verify) {
if (sanitized.auth.verify === true) sanitized.auth.verify = {};
authFields = authFields.concat(_verification.default);
}
if (sanitized.auth.maxLoginAttempts > 0) {
authFields = authFields.concat(_accountLock.default);
}
}
sanitized.fields = (0, _mergeBaseFields.default)(sanitized.fields, authFields);
}
// /////////////////////////////////
// Sanitize fields
// /////////////////////////////////
const validRelationships = config.collections.map((c)=>c.slug) || [];
sanitized.fields = (0, _sanitize.sanitizeFields)({
config,
fields: sanitized.fields,
validRelationships
});
return sanitized;
};
const _default = sanitizeCollection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9jb25maWcvc2FuaXRpemUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSdcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdpcy1wbGFpbi1vYmplY3QnXG5cbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29uZmlnLCBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi90eXBlcydcblxuaW1wb3J0IGJhc2VBY2NvdW50TG9ja0ZpZWxkcyBmcm9tICcuLi8uLi9hdXRoL2Jhc2VGaWVsZHMvYWNjb3VudExvY2snXG5pbXBvcnQgYmFzZUFQSUtleUZpZWxkcyBmcm9tICcuLi8uLi9hdXRoL2Jhc2VGaWVsZHMvYXBpS2V5J1xuaW1wb3J0IGJhc2VBdXRoRmllbGRzIGZyb20gJy4uLy4uL2F1dGgvYmFzZUZpZWxkcy9hdXRoJ1xuaW1wb3J0IGJhc2VWZXJpZmljYXRpb25GaWVsZHMgZnJvbSAnLi4vLi4vYXV0aC9iYXNlRmllbGRzL3ZlcmlmaWNhdGlvbidcbmltcG9ydCBUaW1lc3RhbXBzUmVxdWlyZWQgZnJvbSAnLi4vLi4vZXJyb3JzL1RpbWVzdGFtcHNSZXF1aXJlZCdcbmltcG9ydCB7IHNhbml0aXplRmllbGRzIH0gZnJvbSAnLi4vLi4vZmllbGRzL2NvbmZpZy9zYW5pdGl6ZSdcbmltcG9ydCB7IGZpZWxkQWZmZWN0c0RhdGEgfSBmcm9tICcuLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IG1lcmdlQmFzZUZpZWxkcyBmcm9tICcuLi8uLi9maWVsZHMvbWVyZ2VCYXNlRmllbGRzJ1xuaW1wb3J0IHsgZXh0cmFjdFRyYW5zbGF0aW9ucyB9IGZyb20gJy4uLy4uL3RyYW5zbGF0aW9ucy9leHRyYWN0VHJhbnNsYXRpb25zJ1xuaW1wb3J0IGdldEJhc2VVcGxvYWRGaWVsZHMgZnJvbSAnLi4vLi4vdXBsb2Fkcy9nZXRCYXNlRmllbGRzJ1xuaW1wb3J0IHsgZm9ybWF0TGFiZWxzIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2Zvcm1hdExhYmVscydcbmltcG9ydCBiYXNlVmVyc2lvbkZpZWxkcyBmcm9tICcuLi8uLi92ZXJzaW9ucy9iYXNlRmllbGRzJ1xuaW1wb3J0IHsgYXV0aERlZmF1bHRzLCBkZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMnXG5cbmNvbnN0IHRyYW5zbGF0aW9ucyA9IGV4dHJhY3RUcmFuc2xhdGlvbnMoWydnZW5lcmFsOmNyZWF0ZWRBdCcsICdnZW5lcmFsOnVwZGF0ZWRBdCddKVxuXG5jb25zdCBzYW5pdGl6ZUNvbGxlY3Rpb24gPSAoXG4gIGNvbmZpZzogQ29uZmlnLFxuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnLFxuKTogU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyA9PiB7XG4gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBNYWtlIGNvcHkgb2YgY29sbGVjdGlvbiBjb25maWdcbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgY29uc3Qgc2FuaXRpemVkOiBDb2xsZWN0aW9uQ29uZmlnID0gbWVyZ2UoZGVmYXVsdHMsIGNvbGxlY3Rpb24sIHtcbiAgICBpc01lcmdlYWJsZU9iamVjdDogaXNQbGFpbk9iamVjdCxcbiAgfSlcblxuICBpZiAoc2FuaXRpemVkLnRpbWVzdGFtcHMgIT09IGZhbHNlKSB7XG4gICAgLy8gYWRkIGRlZmF1bHQgdGltZXN0YW1wcyBmaWVsZHMgb25seSBhcyBuZWVkZWRcbiAgICBsZXQgaGFzVXBkYXRlZEF0ID0gbnVsbFxuICAgIGxldCBoYXNDcmVhdGVkQXQgPSBudWxsXG4gICAgc2FuaXRpemVkLmZpZWxkcy5zb21lKChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpKSB7XG4gICAgICAgIGlmIChmaWVsZC5uYW1lID09PSAndXBkYXRlZEF0JykgaGFzVXBkYXRlZEF0ID0gdHJ1ZVxuICAgICAgICBpZiAoZmllbGQubmFtZSA9PT0gJ2NyZWF0ZWRBdCcpIGhhc0NyZWF0ZWRBdCA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNDcmVhdGVkQXQgJiYgaGFzVXBkYXRlZEF0XG4gICAgfSlcbiAgICBpZiAoIWhhc1VwZGF0ZWRBdCkge1xuICAgICAgc2FuaXRpemVkLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ3VwZGF0ZWRBdCcsXG4gICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgZGlzYWJsZUJ1bGtFZGl0OiB0cnVlLFxuICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1snZ2VuZXJhbDp1cGRhdGVkQXQnXSxcbiAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKCFoYXNDcmVhdGVkQXQpIHtcbiAgICAgIHNhbml0aXplZC5maWVsZHMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdjcmVhdGVkQXQnLFxuICAgICAgICBhZG1pbjoge1xuICAgICAgICAgIGRpc2FibGVCdWxrRWRpdDogdHJ1ZSxcbiAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFRoZSBkZWZhdWx0IHNvcnQgZm9yIGxpc3QgdmlldyBpcyBjcmVhdGVkQXQuIFRodXMsIGVuYWJsaW5nIGluZGV4aW5nIGJ5IGRlZmF1bHQsIGlzIGEgbWFqb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQsIGVzcGVjaWFsbHkgZm9yIGxhcmdlIG9yIGEgbGFyZ2UgYW1vdW50IG9mIGNvbGxlY3Rpb25zLlxuICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1snZ2VuZXJhbDpjcmVhdGVkQXQnXSxcbiAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBzYW5pdGl6ZWQubGFiZWxzID0gc2FuaXRpemVkLmxhYmVscyB8fCBmb3JtYXRMYWJlbHMoc2FuaXRpemVkLnNsdWcpXG5cbiAgaWYgKHNhbml0aXplZC52ZXJzaW9ucykge1xuICAgIGlmIChzYW5pdGl6ZWQudmVyc2lvbnMgPT09IHRydWUpIHNhbml0aXplZC52ZXJzaW9ucyA9IHsgZHJhZnRzOiBmYWxzZSB9XG5cbiAgICBpZiAoc2FuaXRpemVkLnRpbWVzdGFtcHMgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgVGltZXN0YW1wc1JlcXVpcmVkKGNvbGxlY3Rpb24pXG4gICAgfVxuXG4gICAgaWYgKHNhbml0aXplZC52ZXJzaW9ucy5kcmFmdHMpIHtcbiAgICAgIGlmIChzYW5pdGl6ZWQudmVyc2lvbnMuZHJhZnRzID09PSB0cnVlKSB7XG4gICAgICAgIHNhbml0aXplZC52ZXJzaW9ucy5kcmFmdHMgPSB7XG4gICAgICAgICAgYXV0b3NhdmU6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzYW5pdGl6ZWQudmVyc2lvbnMuZHJhZnRzLmF1dG9zYXZlID09PSB0cnVlKSB7XG4gICAgICAgIHNhbml0aXplZC52ZXJzaW9ucy5kcmFmdHMuYXV0b3NhdmUgPSB7XG4gICAgICAgICAgaW50ZXJ2YWw6IDIwMDAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2FuaXRpemVkLmZpZWxkcyA9IG1lcmdlQmFzZUZpZWxkcyhzYW5pdGl6ZWQuZmllbGRzLCBiYXNlVmVyc2lvbkZpZWxkcylcbiAgICB9XG4gIH1cblxuICBpZiAoc2FuaXRpemVkLnVwbG9hZCkge1xuICAgIGlmIChzYW5pdGl6ZWQudXBsb2FkID09PSB0cnVlKSBzYW5pdGl6ZWQudXBsb2FkID0ge31cblxuICAgIHNhbml0aXplZC51cGxvYWQuc3RhdGljRGlyID0gc2FuaXRpemVkLnVwbG9hZC5zdGF0aWNEaXIgfHwgc2FuaXRpemVkLnNsdWdcbiAgICBzYW5pdGl6ZWQudXBsb2FkLnN0YXRpY1VSTCA9IHNhbml0aXplZC51cGxvYWQuc3RhdGljVVJMIHx8IGAvJHtzYW5pdGl6ZWQuc2x1Z31gXG4gICAgc2FuaXRpemVkLmFkbWluLnVzZUFzVGl0bGUgPVxuICAgICAgc2FuaXRpemVkLmFkbWluLnVzZUFzVGl0bGUgJiYgc2FuaXRpemVkLmFkbWluLnVzZUFzVGl0bGUgIT09ICdpZCdcbiAgICAgICAgPyBzYW5pdGl6ZWQuYWRtaW4udXNlQXNUaXRsZVxuICAgICAgICA6ICdmaWxlbmFtZSdcblxuICAgIGNvbnN0IHVwbG9hZEZpZWxkcyA9IGdldEJhc2VVcGxvYWRGaWVsZHMoe1xuICAgICAgY29sbGVjdGlvbjogc2FuaXRpemVkLFxuICAgICAgY29uZmlnLFxuICAgIH0pXG5cbiAgICBzYW5pdGl6ZWQuZmllbGRzID0gbWVyZ2VCYXNlRmllbGRzKHNhbml0aXplZC5maWVsZHMsIHVwbG9hZEZpZWxkcylcbiAgfVxuXG4gIGlmIChzYW5pdGl6ZWQuYXV0aCkge1xuICAgIHNhbml0aXplZC5hdXRoID0gbWVyZ2UoYXV0aERlZmF1bHRzLCB0eXBlb2Ygc2FuaXRpemVkLmF1dGggPT09ICdvYmplY3QnID8gc2FuaXRpemVkLmF1dGggOiB7fSwge1xuICAgICAgaXNNZXJnZWFibGVPYmplY3Q6IGlzUGxhaW5PYmplY3QsXG4gICAgfSlcblxuICAgIGxldCBhdXRoRmllbGRzID0gW11cblxuICAgIGlmIChzYW5pdGl6ZWQuYXV0aC51c2VBUElLZXkpIHtcbiAgICAgIGF1dGhGaWVsZHMgPSBhdXRoRmllbGRzLmNvbmNhdChiYXNlQVBJS2V5RmllbGRzKVxuICAgIH1cblxuICAgIGlmICghc2FuaXRpemVkLmF1dGguZGlzYWJsZUxvY2FsU3RyYXRlZ3kpIHtcbiAgICAgIGF1dGhGaWVsZHMgPSBhdXRoRmllbGRzLmNvbmNhdChiYXNlQXV0aEZpZWxkcylcblxuICAgICAgaWYgKHNhbml0aXplZC5hdXRoLnZlcmlmeSkge1xuICAgICAgICBpZiAoc2FuaXRpemVkLmF1dGgudmVyaWZ5ID09PSB0cnVlKSBzYW5pdGl6ZWQuYXV0aC52ZXJpZnkgPSB7fVxuICAgICAgICBhdXRoRmllbGRzID0gYXV0aEZpZWxkcy5jb25jYXQoYmFzZVZlcmlmaWNhdGlvbkZpZWxkcylcbiAgICAgIH1cblxuICAgICAgaWYgKHNhbml0aXplZC5hdXRoLm1heExvZ2luQXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgIGF1dGhGaWVsZHMgPSBhdXRoRmllbGRzLmNvbmNhdChiYXNlQWNjb3VudExvY2tGaWVsZHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2FuaXRpemVkLmZpZWxkcyA9IG1lcmdlQmFzZUZpZWxkcyhzYW5pdGl6ZWQuZmllbGRzLCBhdXRoRmllbGRzKVxuICB9XG5cbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFNhbml0aXplIGZpZWxkc1xuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICBjb25zdCB2YWxpZFJlbGF0aW9uc2hpcHMgPSBjb25maWcuY29sbGVjdGlvbnMubWFwKChjKSA9PiBjLnNsdWcpIHx8IFtdXG4gIHNhbml0aXplZC5maWVsZHMgPSBzYW5pdGl6ZUZpZWxkcyh7XG4gICAgY29uZmlnLFxuICAgIGZpZWxkczogc2FuaXRpemVkLmZpZWxkcyxcbiAgICB2YWxpZFJlbGF0aW9uc2hpcHMsXG4gIH0pXG5cbiAgcmV0dXJuIHNhbml0aXplZCBhcyBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplQ29sbGVjdGlvblxuIl0sIm5hbWVzIjpbInRyYW5zbGF0aW9ucyIsImV4dHJhY3RUcmFuc2xhdGlvbnMiLCJzYW5pdGl6ZUNvbGxlY3Rpb24iLCJjb25maWciLCJjb2xsZWN0aW9uIiwic2FuaXRpemVkIiwibWVyZ2UiLCJkZWZhdWx0cyIsImlzTWVyZ2VhYmxlT2JqZWN0IiwiaXNQbGFpbk9iamVjdCIsInRpbWVzdGFtcHMiLCJoYXNVcGRhdGVkQXQiLCJoYXNDcmVhdGVkQXQiLCJmaWVsZHMiLCJzb21lIiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsInB1c2giLCJhZG1pbiIsImRpc2FibGVCdWxrRWRpdCIsImhpZGRlbiIsImxhYmVsIiwidHlwZSIsImluZGV4IiwibGFiZWxzIiwiZm9ybWF0TGFiZWxzIiwic2x1ZyIsInZlcnNpb25zIiwiZHJhZnRzIiwiVGltZXN0YW1wc1JlcXVpcmVkIiwiYXV0b3NhdmUiLCJpbnRlcnZhbCIsIm1lcmdlQmFzZUZpZWxkcyIsImJhc2VWZXJzaW9uRmllbGRzIiwidXBsb2FkIiwic3RhdGljRGlyIiwic3RhdGljVVJMIiwidXNlQXNUaXRsZSIsInVwbG9hZEZpZWxkcyIsImdldEJhc2VVcGxvYWRGaWVsZHMiLCJhdXRoIiwiYXV0aERlZmF1bHRzIiwiYXV0aEZpZWxkcyIsInVzZUFQSUtleSIsImNvbmNhdCIsImJhc2VBUElLZXlGaWVsZHMiLCJkaXNhYmxlTG9jYWxTdHJhdGVneSIsImJhc2VBdXRoRmllbGRzIiwidmVyaWZ5IiwiYmFzZVZlcmlmaWNhdGlvbkZpZWxkcyIsIm1heExvZ2luQXR0ZW1wdHMiLCJiYXNlQWNjb3VudExvY2tGaWVsZHMiLCJ2YWxpZFJlbGF0aW9uc2hpcHMiLCJjb2xsZWN0aW9ucyIsIm1hcCIsImMiLCJzYW5pdGl6ZUZpZWxkcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkE0SkE7OztlQUFBOzs7a0VBNUprQjsrQkFDWTtvRUFLSTsrREFDTDs2REFDRjtxRUFDUTsyRUFDSjswQkFDQTt1QkFDRTt3RUFDTDtxQ0FDUTtzRUFDSjs4QkFDSDttRUFDQzswQkFDUzs7Ozs7O0FBRXZDLE1BQU1BLGVBQWVDLElBQUFBLHdDQUFtQixFQUFDO0lBQUM7SUFBcUI7Q0FBb0I7QUFFbkYsTUFBTUMscUJBQXFCLENBQ3pCQyxRQUNBQztJQUVBLG9DQUFvQztJQUNwQyxpQ0FBaUM7SUFDakMsb0NBQW9DO0lBRXBDLE1BQU1DLFlBQThCQyxJQUFBQSxrQkFBSyxFQUFDQyxrQkFBUSxF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