UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

206 lines (205 loc) • 24.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _httpstatus = /*#__PURE__*/ _interop_require_default(require("http-status")); const _executeAccess = /*#__PURE__*/ _interop_require_default(require("../../auth/executeAccess")); const _combineQueries = require("../../database/combineQueries"); const _validateQueryPaths = require("../../database/queryValidation/validateQueryPaths"); const _errors = require("../../errors"); const _afterRead = require("../../fields/hooks/afterRead"); const _deleteUserPreferences = require("../../preferences/deleteUserPreferences"); const _deleteAssociatedFiles = require("../../uploads/deleteAssociatedFiles"); const _commitTransaction = require("../../utilities/commitTransaction"); const _initTransaction = require("../../utilities/initTransaction"); const _killTransaction = require("../../utilities/killTransaction"); const _deleteCollectionVersions = require("../../versions/deleteCollectionVersions"); const _utils = require("./utils"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function deleteOperation(incomingArgs) { let args = incomingArgs; try { const shouldCommit = await (0, _initTransaction.initTransaction)(args.req); // ///////////////////////////////////// // beforeOperation - Collection // ///////////////////////////////////// await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{ await priorHook; args = await hook({ args, collection: args.collection.config, context: args.req.context, operation: 'delete', req: args.req }) || args; }, Promise.resolve()); const { collection: { config: collectionConfig }, depth, overrideAccess, req: { fallbackLocale, locale, payload: { config }, payload, t }, req, showHiddenFields, where } = args; if (!where) { throw new _errors.APIError("Missing 'where' query of documents to delete.", _httpstatus.default.BAD_REQUEST); } // ///////////////////////////////////// // Access // ///////////////////////////////////// let accessResult; if (!overrideAccess) { accessResult = await (0, _executeAccess.default)({ req }, collectionConfig.access.delete); } await (0, _validateQueryPaths.validateQueryPaths)({ collectionConfig, overrideAccess, req, where }); const fullWhere = (0, _combineQueries.combineQueries)(where, accessResult); // ///////////////////////////////////// // Retrieve documents // ///////////////////////////////////// const { docs } = await payload.db.find({ collection: collectionConfig.slug, locale, req, where: fullWhere }); const errors = []; /* eslint-disable no-param-reassign */ const promises = docs.map(async (doc)=>{ let result; const { id } = doc; try { // ///////////////////////////////////// // beforeDelete - Collection // ///////////////////////////////////// await collectionConfig.hooks.beforeDelete.reduce(async (priorHook, hook)=>{ await priorHook; return hook({ id, collection: collectionConfig, context: req.context, req }); }, Promise.resolve()); await (0, _deleteAssociatedFiles.deleteAssociatedFiles)({ collectionConfig, config, doc, overrideDelete: true, t }); // ///////////////////////////////////// // Delete versions // ///////////////////////////////////// if (collectionConfig.versions) { await (0, _deleteCollectionVersions.deleteCollectionVersions)({ id, slug: collectionConfig.slug, payload, req }); } // ///////////////////////////////////// // Delete document // ///////////////////////////////////// await payload.db.deleteOne({ collection: collectionConfig.slug, req, where: { id: { equals: id } } }); // ///////////////////////////////////// // afterRead - Fields // ///////////////////////////////////// result = await (0, _afterRead.afterRead)({ collection: collectionConfig, context: req.context, depth, doc: result || doc, fallbackLocale, global: null, locale, overrideAccess, req, showHiddenFields }); // ///////////////////////////////////// // afterRead - Collection // ///////////////////////////////////// await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ collection: collectionConfig, context: req.context, doc: result || doc, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // afterDelete - Collection // ///////////////////////////////////// await collectionConfig.hooks.afterDelete.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ id, collection: collectionConfig, context: req.context, doc: result, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // 8. Return results // ///////////////////////////////////// return result; } catch (error) { errors.push({ id: doc.id, message: error.message }); } return null; }); const awaitedDocs = await Promise.all(promises); // ///////////////////////////////////// // Delete Preferences // ///////////////////////////////////// await (0, _deleteUserPreferences.deleteUserPreferences)({ collectionConfig, ids: docs.map(({ id })=>id), payload, req }); let result = { docs: awaitedDocs.filter(Boolean), errors }; // ///////////////////////////////////// // afterOperation - Collection // ///////////////////////////////////// result = await (0, _utils.buildAfterOperation)({ args, collection: collectionConfig, operation: 'delete', result }); if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req); return result; } catch (error) { await (0, _killTransaction.killTransaction)(args.req); throw error; } } const _default = deleteOperation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2RlbGV0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaHR0cFN0YXR1cyBmcm9tICdodHRwLXN0YXR1cydcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZWRUeXBlcyB9IGZyb20gJy4uLy4uLydcbmltcG9ydCB0eXBlIHsgQWNjZXNzUmVzdWx0IH0gZnJvbSAnLi4vLi4vY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkUmVxdWVzdCB9IGZyb20gJy4uLy4uL2V4cHJlc3MvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFdoZXJlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEJlZm9yZU9wZXJhdGlvbkhvb2ssIENvbGxlY3Rpb24gfSBmcm9tICcuLi9jb25maWcvdHlwZXMnXG5cbmltcG9ydCBleGVjdXRlQWNjZXNzIGZyb20gJy4uLy4uL2F1dGgvZXhlY3V0ZUFjY2VzcydcbmltcG9ydCB7IGNvbWJpbmVRdWVyaWVzIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvY29tYmluZVF1ZXJpZXMnXG5pbXBvcnQgeyB2YWxpZGF0ZVF1ZXJ5UGF0aHMgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9xdWVyeVZhbGlkYXRpb24vdmFsaWRhdGVRdWVyeVBhdGhzJ1xuaW1wb3J0IHsgQVBJRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnXG5pbXBvcnQgeyBhZnRlclJlYWQgfSBmcm9tICcuLi8uLi9maWVsZHMvaG9va3MvYWZ0ZXJSZWFkJ1xuaW1wb3J0IHsgZGVsZXRlVXNlclByZWZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vcHJlZmVyZW5jZXMvZGVsZXRlVXNlclByZWZlcmVuY2VzJ1xuaW1wb3J0IHsgZGVsZXRlQXNzb2NpYXRlZEZpbGVzIH0gZnJvbSAnLi4vLi4vdXBsb2Fkcy9kZWxldGVBc3NvY2lhdGVkRmlsZXMnXG5pbXBvcnQgeyBjb21taXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9jb21taXRUcmFuc2FjdGlvbidcbmltcG9ydCB7IGluaXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9pbml0VHJhbnNhY3Rpb24nXG5pbXBvcnQgeyBraWxsVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMva2lsbFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgZGVsZXRlQ29sbGVjdGlvblZlcnNpb25zIH0gZnJvbSAnLi4vLi4vdmVyc2lvbnMvZGVsZXRlQ29sbGVjdGlvblZlcnNpb25zJ1xuaW1wb3J0IHsgYnVpbGRBZnRlck9wZXJhdGlvbiB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50cyA9IHtcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblxuICBkZXB0aD86IG51bWJlclxuICBvdmVycmlkZUFjY2Vzcz86IGJvb2xlYW5cbiAgcmVxOiBQYXlsb2FkUmVxdWVzdFxuICBzaG93SGlkZGVuRmllbGRzPzogYm9vbGVhblxuICB3aGVyZTogV2hlcmVcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlT3BlcmF0aW9uPFRTbHVnIGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ10+KFxuICBpbmNvbWluZ0FyZ3M6IEFyZ3VtZW50cyxcbik6IFByb21pc2U8e1xuICBkb2NzOiBHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXVtUU2x1Z11bXVxuICBlcnJvcnM6IHtcbiAgICBpZDogR2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddWydpZCddXG4gICAgbWVzc2FnZTogc3RyaW5nXG4gIH1bXVxufT4ge1xuICBsZXQgYXJncyA9IGluY29taW5nQXJnc1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2hvdWxkQ29tbWl0ID0gYXdhaXQgaW5pdFRyYW5zYWN0aW9uKGFyZ3MucmVxKVxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBiZWZvcmVPcGVyYXRpb24gLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgYXJncy5jb2xsZWN0aW9uLmNvbmZpZy5ob29rcy5iZWZvcmVPcGVyYXRpb24ucmVkdWNlKFxuICAgICAgYXN5bmMgKHByaW9ySG9vazogQmVmb3JlT3BlcmF0aW9uSG9vayB8IFByb21pc2U8dm9pZD4sIGhvb2s6IEJlZm9yZU9wZXJhdGlvbkhvb2spID0+IHtcbiAgICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgICAgYXJncyA9XG4gICAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGFyZ3MuY29sbGVjdGlvbi5jb25maWcsXG4gICAgICAgICAgICBjb250ZXh0OiBhcmdzLnJlcS5jb250ZXh0LFxuICAgICAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHJlcTogYXJncy5yZXEsXG4gICAgICAgICAgfSkpIHx8IGFyZ3NcbiAgICAgIH0sXG4gICAgICBQcm9taXNlLnJlc29sdmUoKSxcbiAgICApXG5cbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uOiB7IGNvbmZpZzogY29sbGVjdGlvbkNvbmZpZyB9LFxuICAgICAgZGVwdGgsXG4gICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgIHJlcToge1xuICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBwYXlsb2FkOiB7IGNvbmZpZyB9LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICB0LFxuICAgICAgfSxcbiAgICAgIHJlcSxcbiAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICB3aGVyZSxcbiAgICB9ID0gYXJnc1xuXG4gICAgaWYgKCF3aGVyZSkge1xuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKFwiTWlzc2luZyAnd2hlcmUnIHF1ZXJ5IG9mIGRvY3VtZW50cyB0byBkZWxldGUuXCIsIGh0dHBTdGF0dXMuQkFEX1JFUVVFU1QpXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEFjY2Vzc1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGxldCBhY2Nlc3NSZXN1bHQ6IEFjY2Vzc1Jlc3VsdFxuXG4gICAgaWYgKCFvdmVycmlkZUFjY2Vzcykge1xuICAgICAgYWNjZXNzUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUFjY2Vzcyh7IHJlcSB9LCBjb2xsZWN0aW9uQ29uZmlnLmFjY2Vzcy5kZWxldGUpXG4gICAgfVxuXG4gICAgYXdhaXQgdmFsaWRhdGVRdWVyeVBhdGhzKHtcbiAgICAgIGNvbGxlY3Rpb25Db25maWcsXG4gICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgIHJlcSxcbiAgICAgIHdoZXJlLFxuICAgIH0pXG5cbiAgICBjb25zdCBmdWxsV2hlcmUgPSBjb21iaW5lUXVlcmllcyh3aGVyZSwgYWNjZXNzUmVzdWx0KVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFJldHJpZXZlIGRvY3VtZW50c1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGNvbnN0IHsgZG9jcyB9ID0gYXdhaXQgcGF5bG9hZC5kYi5maW5kPEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddW1RTbHVnXT4oe1xuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgbG9jYWxlLFxuICAgICAgcmVxLFxuICAgICAgd2hlcmU6IGZ1bGxXaGVyZSxcbiAgICB9KVxuXG4gICAgY29uc3QgZXJyb3JzID0gW11cblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgY29uc3QgcHJvbWlzZXMgPSBkb2NzLm1hcChhc3luYyAoZG9jKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0XG5cbiAgICAgIGNvbnN0IHsgaWQgfSA9IGRvY1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIGJlZm9yZURlbGV0ZSAtIENvbGxlY3Rpb25cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYmVmb3JlRGVsZXRlLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgICAgICByZXR1cm4gaG9vayh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICB9KVxuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICBhd2FpdCBkZWxldGVBc3NvY2lhdGVkRmlsZXMoe1xuICAgICAgICAgIGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGRvYyxcbiAgICAgICAgICBvdmVycmlkZURlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICB0LFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gRGVsZXRlIHZlcnNpb25zXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBpZiAoY29sbGVjdGlvbkNvbmZpZy52ZXJzaW9ucykge1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUNvbGxlY3Rpb25WZXJzaW9ucyh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHNsdWc6IGNvbGxlY3Rpb25Db25maWcuc2x1ZyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gRGVsZXRlIGRvY3VtZW50XG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBhd2FpdCBwYXlsb2FkLmRiLmRlbGV0ZU9uZSh7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgaWQ6IHtcbiAgICAgICAgICAgICAgZXF1YWxzOiBpZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIGFmdGVyUmVhZCAtIEZpZWxkc1xuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgYWZ0ZXJSZWFkKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIGRvYzogcmVzdWx0IHx8IGRvYyxcbiAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICBnbG9iYWw6IG51bGwsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gYWZ0ZXJSZWFkIC0gQ29sbGVjdGlvblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgYXdhaXQgY29sbGVjdGlvbkNvbmZpZy5ob29rcy5hZnRlclJlYWQucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgICAgICAgICBkb2M6IHJlc3VsdCB8fCBkb2MsXG4gICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIH0pKSB8fCByZXN1bHRcbiAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBhZnRlckRlbGV0ZSAtIENvbGxlY3Rpb25cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYWZ0ZXJEZWxldGUucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIH0pKSB8fCByZXN1bHRcbiAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyA4LiBSZXR1cm4gcmVzdWx0c1xuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIGlkOiBkb2MuaWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSlcblxuICAgIGNvbnN0IGF3YWl0ZWREb2NzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gRGVsZXRlIFByZWZlcmVuY2VzXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgZGVsZXRlVXNlclByZWZlcmVuY2VzKHtcbiAgICAgIGNvbGxlY3Rpb25Db25maWcsXG4gICAgICBpZHM6IGRvY3MubWFwKCh7IGlkIH0pID0+IGlkKSxcbiAgICAgIHBheWxvYWQsXG4gICAgICByZXEsXG4gICAgfSlcblxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBkb2NzOiBhd2FpdGVkRG9jcy5maWx0ZXIoQm9vbGVhbiksXG4gICAgICBlcnJvcnMsXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGFmdGVyT3BlcmF0aW9uIC0gQ29sbGVjdGlvblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHJlc3VsdCA9IGF3YWl0IGJ1aWxkQWZ0ZXJPcGVyYXRpb248R2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddPih7XG4gICAgICBhcmdzLFxuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgIG9wZXJhdGlvbjogJ2RlbGV0ZScsXG4gICAgICByZXN1bHQsXG4gICAgfSlcblxuICAgIGlmIChzaG91bGRDb21taXQpIGF3YWl0IGNvbW1pdFRyYW5zYWN0aW9uKHJlcSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBhd2FpdCBraWxsVHJhbnNhY3Rpb24oYXJncy5yZXEpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBkZWxldGVPcGVyYXRpb25cbiJdLCJuYW1lcyI6WyJkZWxldGVPcGVyYXRpb24iLCJpbmNvbWluZ0FyZ3MiLCJhcmdzIiwic2hvdWxkQ29tbWl0IiwiaW5pdFRyYW5zYWN0aW9uIiwicmVxIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImhvb2tzIiwiYmVmb3JlT3BlcmF0aW9uIiwicmVkdWNlIiwicHJpb3JIb29rIiwiaG9vayIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbGxlY3Rpb25Db25maWciLCJkZXB0aCIsIm92ZXJyaWRlQWNjZXNzIiwiZmFsbGJhY2tMb2NhbGUiLCJsb2NhbGUiLCJwYXlsb2FkIiwidCIsInNob3dIaWRkZW5GaWVsZHMiLCJ3aGVyZSIsIkFQSUVycm9yIiwiaHR0cFN0YXR1cyIsIkJBRF9SRVFVRVNUIiwiYWNjZXNzUmVzdWx0IiwiZXhlY3V0ZUFjY2VzcyIsImFjY2VzcyIsImRlbGV0ZSIsInZhbGlkYXRlUXVlcnlQYXRocyIsImZ1bGxXaGVyZSIsImNvbWJpbmVRdWVyaWVzIiwiZG9jcyIsImRiIiwiZmluZCIsInNsdWciLCJlcnJvcnMiLCJwcm9taXNlcyIsIm1hcCIsImRvYyIsInJlc3VsdCIsImlkIiwiYmVmb3JlRGVsZXRlIiwiZGVsZXRlQXNzb2NpYXRlZEZpbGVzIiwib3ZlcnJpZGVEZWxldGUiLCJ2ZXJzaW9ucyIsImRlbGV0ZUNvbGxlY3Rpb25WZXJzaW9ucyIsImRlbGV0ZU9uZSIsImVxdWFscyIsImFmdGVyUmVhZCIsImdsb2JhbCIsImFmdGVyRGVsZXRlIiwiZXJyb3IiLCJwdXNoIiwibWVzc2FnZSIsImF3YWl0ZWREb2NzIiwiYWxsIiwiZGVsZXRlVXNlclByZWZlcmVuY2VzIiwiaWRzIiwiZmlsdGVyIiwiQm9vbGVhbiIsImJ1aWxkQWZ0ZXJPcGVyYXRpb24iLCJjb21taXRUcmFuc2FjdGlvbiIsImtpbGxUcmFuc2FjdGlvbiJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFrUkE7OztlQUFBOzs7bUVBbFJ1QjtzRUFRRztnQ0FDSztvQ0FDSTt3QkFDVjsyQkFDQzt1Q0FDWTt1Q0FDQTttQ0FDSjtpQ0FDRjtpQ0FDQTswQ0FDUzt1QkFDTDs7Ozs7O0FBV3BDLGVBQWVBLGdCQUNiQyxZQUF1QjtJQVF2QixJQUFJQyxPQUFPRDtJQUVYLElBQUk7UUFDRixNQUFNRSxlQUFlLE1BQU1DLElBQUFBLGdDQUFlLEVBQUNGLEtBQUtHLEdBQUc7UUFDbkQsd0NBQXdDO1FBQ3hDLCtCQUErQjtRQUMvQix3Q0FBd0M7UUFFeEMsTUFBTUgsS0FBS0ksVUFBVSxDQUFDQyxNQUFNLENBQUNDLEtBQUssQ0FBQ0MsZUFBZSxDQUFDQyxNQUFNLENBQ3ZELE9BQU9DLFdBQWdEQztZQUNyRCxNQUFNRDtZQUVOVCxPQUNFLEFBQUMsTUFBTVUsS0FBSztnQkFDVlY7Z0JBQ0FJLFlBQVlKLEtBQUtJLFVBQVUsQ0FBQ0MsTUFBTTtnQkFDbENNLFNBQVNYLEtBQUtHLEdBQUcsQ0FBQ1EsT0FBTztnQkFDekJDLFdBQVc7Z0JBQ1hULEtBQUtILEtBQUtHLEdBQUc7WUFDZixN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