"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformTypes = void 0; var _node = _interopRequireDefault(require("parse/node")); var _graphqlRelay = require("graphql-relay"); var _filesMutations = require("../loaders/filesMutations"); var objectsMutations = _interopRequireWildcard(require("../helpers/objectsMutations")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } 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); } const transformTypes = async (inputType, fields, { className, parseGraphQLSchema, req, originalFields }) => { const { classGraphQLCreateType, classGraphQLUpdateType, config: { isCreateEnabled, isUpdateEnabled } } = parseGraphQLSchema.parseClassTypes[className]; const parseClass = parseGraphQLSchema.parseClasses[className]; if (fields) { const classGraphQLCreateTypeFields = isCreateEnabled && classGraphQLCreateType ? classGraphQLCreateType.getFields() : null; const classGraphQLUpdateTypeFields = isUpdateEnabled && classGraphQLUpdateType ? classGraphQLUpdateType.getFields() : null; const promises = Object.keys(fields).map(async field => { let inputTypeField; if (inputType === 'create' && classGraphQLCreateTypeFields) { inputTypeField = classGraphQLCreateTypeFields[field]; } else if (classGraphQLUpdateTypeFields) { inputTypeField = classGraphQLUpdateTypeFields[field]; } if (inputTypeField) { const parseFieldType = parseClass.fields[field].type; switch (parseFieldType) { case 'GeoPoint': if (fields[field] === null) { fields[field] = { __op: 'Delete' }; break; } fields[field] = transformers.geoPoint(fields[field]); break; case 'Polygon': if (fields[field] === null) { fields[field] = { __op: 'Delete' }; break; } fields[field] = transformers.polygon(fields[field]); break; case 'File': // We need to use the originalFields to handle the file upload // since fields are a deepcopy and do not keep the file object fields[field] = await transformers.file(originalFields[field], req); break; case 'Relation': fields[field] = await transformers.relation(parseClass.fields[field].targetClass, field, fields[field], originalFields[field], parseGraphQLSchema, req); break; case 'Pointer': if (fields[field] === null) { fields[field] = { __op: 'Delete' }; break; } fields[field] = await transformers.pointer(parseClass.fields[field].targetClass, field, fields[field], originalFields[field], parseGraphQLSchema, req); break; default: if (fields[field] === null) { fields[field] = { __op: 'Delete' }; return; } break; } } }); await Promise.all(promises); if (fields.ACL) fields.ACL = transformers.ACL(fields.ACL); } return fields; }; exports.transformTypes = transformTypes; const transformers = { file: async (input, { config }) => { if (input === null) { return { __op: 'Delete' }; } const { file, upload } = input; if (upload) { const { fileInfo } = await (0, _filesMutations.handleUpload)(upload, config); return _objectSpread(_objectSpread({}, fileInfo), {}, { __type: 'File' }); } else if (file && file.name) { return { name: file.name, __type: 'File', url: file.url }; } throw new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'Invalid file upload.'); }, polygon: value => ({ __type: 'Polygon', coordinates: value.map(geoPoint => [geoPoint.latitude, geoPoint.longitude]) }), geoPoint: value => _objectSpread(_objectSpread({}, value), {}, { __type: 'GeoPoint' }), ACL: value => { const parseACL = {}; if (value.public) { parseACL['*'] = { read: value.public.read, write: value.public.write }; } if (value.users) { value.users.forEach(rule => { const globalIdObject = (0, _graphqlRelay.fromGlobalId)(rule.userId); if (globalIdObject.type === '_User') { rule.userId = globalIdObject.id; } parseACL[rule.userId] = { read: rule.read, write: rule.write }; }); } if (value.roles) { value.roles.forEach(rule => { parseACL[`role:${rule.roleName}`] = { read: rule.read, write: rule.write }; }); } return parseACL; }, relation: async (targetClass, field, value, originalValue, parseGraphQLSchema, { config, auth, info }) => { if (Object.keys(value).length === 0) throw new _node.default.Error(_node.default.Error.INVALID_POINTER, `You need to provide at least one operation on the relation mutation of field ${field}`); const op = { __op: 'Batch', ops: [] }; let nestedObjectsToAdd = []; if (value.createAndAdd) { nestedObjectsToAdd = (await Promise.all(value.createAndAdd.map(async (input, i) => { const parseFields = await transformTypes('create', input, { className: targetClass, originalFields: originalValue.createAndAdd[i], parseGraphQLSchema, req: { config, auth, info } }); return objectsMutations.createObject(targetClass, parseFields, config, auth, info); }))).map(object => ({ __type: 'Pointer', className: targetClass, objectId: object.objectId })); } if (value.add || nestedObjectsToAdd.length > 0) { if (!value.add) value.add = []; value.add = value.add.map(input => { const globalIdObject = (0, _graphqlRelay.fromGlobalId)(input); if (globalIdObject.type === targetClass) { input = globalIdObject.id; } return { __type: 'Pointer', className: targetClass, objectId: input }; }); op.ops.push({ __op: 'AddRelation', objects: [...value.add, ...nestedObjectsToAdd] }); } if (value.remove) { op.ops.push({ __op: 'RemoveRelation', objects: value.remove.map(input => { const globalIdObject = (0, _graphqlRelay.fromGlobalId)(input); if (globalIdObject.type === targetClass) { input = globalIdObject.id; } return { __type: 'Pointer', className: targetClass, objectId: input }; }) }); } return op; }, pointer: async (targetClass, field, value, originalValue, parseGraphQLSchema, { config, auth, info }) => { if (Object.keys(value).length > 1 || Object.keys(value).length === 0) throw new _node.default.Error(_node.default.Error.INVALID_POINTER, `You need to provide link OR createLink on the pointer mutation of field ${field}`); let nestedObjectToAdd; if (value.createAndLink) { const parseFields = await transformTypes('create', value.createAndLink, { className: targetClass, parseGraphQLSchema, originalFields: originalValue.createAndLink, req: { config, auth, info } }); nestedObjectToAdd = await objectsMutations.createObject(targetClass, parseFields, config, auth, info); return { __type: 'Pointer', className: targetClass, objectId: nestedObjectToAdd.objectId }; } if (value.link) { let objectId = value.link; const globalIdObject = (0, _graphqlRelay.fromGlobalId)(objectId); if (globalIdObject.type === targetClass) { objectId = globalIdObject.id; } return { __type: 'Pointer', className: targetClass, objectId }; } } }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2dyYXBocWxSZWxheSIsIl9maWxlc011dGF0aW9ucyIsIm9iamVjdHNNdXRhdGlvbnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJ0cmFuc2Zvcm1UeXBlcyIsImlucHV0VHlwZSIsImZpZWxkcyIsImNsYXNzTmFtZSIsInBhcnNlR3JhcGhRTFNjaGVtYSIsInJlcSIsIm9yaWdpbmFsRmllbGRzIiwiY2xhc3NHcmFwaFFMQ3JlYXRlVHlwZSIsImNsYXNzR3JhcGhRTFVwZGF0ZVR5cGUiLCJjb25maWciLCJpc0NyZWF0ZUVuYWJsZWQiLCJpc1VwZGF0ZUVuYWJsZWQiLCJwYXJzZUNsYXNzVHlwZXMiLCJwYXJzZUNsYXNzIiwicGFyc2VDbGFzc2VzIiwiY2xhc3NHcmFwaFFMQ3JlYXRlVHlwZUZpZWxkcyIsImdldEZpZWxkcyIsImNsYXNzR3JhcGhRTFVwZGF0ZVR5cGVGaWVsZHMiLCJwcm9taXNlcyIsIm1hcCIsImZpZWxkIiwiaW5wdXRUeXBlRmllbGQiLCJwYXJzZUZpZWxkVHlwZSIsInR5cGUiLCJfX29wIiwidHJhbnNmb3JtZXJzIiwiZ2VvUG9pbnQiLCJwb2x5Z29uIiwiZmlsZSIsInJlbGF0aW9uIiwidGFyZ2V0Q2xhc3MiLCJwb2ludGVyIiwiUHJvbWlzZSIsImFsbCIsIkFDTCIsImV4cG9ydHMiLCJpbnB1dCIsInVwbG9hZCIsImZpbGVJbmZvIiwiaGFuZGxlVXBsb2FkIiwiX190eXBlIiwibmFtZSIsInVybCIsIlBhcnNlIiwiRXJyb3IiLCJGSUxFX1NBVkVfRVJST1IiLCJjb29yZGluYXRlcyIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwicGFyc2VBQ0wiLCJwdWJsaWMiLCJyZWFkIiwid3JpdGUiLCJ1c2VycyIsInJ1bGUiLCJnbG9iYWxJZE9iamVjdCIsImZyb21HbG9iYWxJZCIsInVzZXJJZCIsImlkIiwicm9sZXMiLCJyb2xlTmFtZSIsIm9yaWdpbmFsVmFsdWUiLCJhdXRoIiwiaW5mbyIsIklOVkFMSURfUE9JTlRFUiIsIm9wIiwib3BzIiwibmVzdGVkT2JqZWN0c1RvQWRkIiwiY3JlYXRlQW5kQWRkIiwicGFyc2VGaWVsZHMiLCJjcmVhdGVPYmplY3QiLCJvYmplY3QiLCJvYmplY3RJZCIsImFkZCIsIm9iamVjdHMiLCJyZW1vdmUiLCJuZXN0ZWRPYmplY3RUb0FkZCIsImNyZWF0ZUFuZExpbmsiLCJsaW5rIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0dyYXBoUUwvdHJhbnNmb3JtZXJzL211dGF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCB7IGZyb21HbG9iYWxJZCB9IGZyb20gJ2dyYXBocWwtcmVsYXknO1xuaW1wb3J0IHsgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi4vbG9hZGVycy9maWxlc011dGF0aW9ucyc7XG5pbXBvcnQgKiBhcyBvYmplY3RzTXV0YXRpb25zIGZyb20gJy4uL2hlbHBlcnMvb2JqZWN0c011dGF0aW9ucyc7XG5cbmNvbnN0IHRyYW5zZm9ybVR5cGVzID0gYXN5bmMgKFxuICBpbnB1dFR5cGU6ICdjcmVhdGUnIHwgJ3VwZGF0ZScsXG4gIGZpZWxkcyxcbiAgeyBjbGFzc05hbWUsIHBhcnNlR3JhcGhRTFNjaGVtYSwgcmVxLCBvcmlnaW5hbEZpZWxkcyB9XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGNsYXNzR3JhcGhRTENyZWF0ZVR5cGUsXG4gICAgY2xhc3NHcmFwaFFMVXBkYXRlVHlwZSxcbiAgICBjb25maWc6IHsgaXNDcmVhdGVFbmFibGVkLCBpc1VwZGF0ZUVuYWJsZWQgfSxcbiAgfSA9IHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzVHlwZXNbY2xhc3NOYW1lXTtcbiAgY29uc3QgcGFyc2VDbGFzcyA9IHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzZXNbY2xhc3NOYW1lXTtcbiAgaWYgKGZpZWxkcykge1xuICAgIGNvbnN0IGNsYXNzR3JhcGhRTENyZWF0ZVR5cGVGaWVsZHMgPVxuICAgICAgaXNDcmVhdGVFbmFibGVkICYmIGNsYXNzR3JhcGhRTENyZWF0ZVR5cGUgPyBjbGFzc0dyYXBoUUxDcmVhdGVUeXBlLmdldEZpZWxkcygpIDogbnVsbDtcbiAgICBjb25zdCBjbGFzc0dyYXBoUUxVcGRhdGVUeXBlRmllbGRzID1cbiAgICAgIGlzVXBkYXRlRW5hYmxlZCAmJiBjbGFzc0dyYXBoUUxVcGRhdGVUeXBlID8gY2xhc3NHcmFwaFFMVXBkYXRlVHlwZS5nZXRGaWVsZHMoKSA6IG51bGw7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3Qua2V5cyhmaWVsZHMpLm1hcChhc3luYyBmaWVsZCA9PiB7XG4gICAgICBsZXQgaW5wdXRUeXBlRmllbGQ7XG4gICAgICBpZiAoaW5wdXRUeXBlID09PSAnY3JlYXRlJyAmJiBjbGFzc0dyYXBoUUxDcmVhdGVUeXBlRmllbGRzKSB7XG4gICAgICAgIGlucHV0VHlwZUZpZWxkID0gY2xhc3NHcmFwaFFMQ3JlYXRlVHlwZUZpZWxkc1tmaWVsZF07XG4gICAgICB9IGVsc2UgaWYgKGNsYXNzR3JhcGhRTFVwZGF0ZVR5cGVGaWVsZHMpIHtcbiAgICAgICAgaW5wdXRUeXBlRmllbGQgPSBjbGFzc0dyYXBoUUxVcGRhdGVUeXBlRmllbGRzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dFR5cGVGaWVsZCkge1xuICAgICAgICBjb25zdCBwYXJzZUZpZWxkVHlwZSA9IHBhcnNlQ2xhc3MuZmllbGRzW2ZpZWxkXS50eXBlO1xuICAgICAgICBzd2l0Y2ggKHBhcnNlRmllbGRUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnR2VvUG9pbnQnOlxuICAgICAgICAgICAgaWYgKGZpZWxkc1tmaWVsZF0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZHNbZmllbGRdID0gdHJhbnNmb3JtZXJzLmdlb1BvaW50KGZpZWxkc1tmaWVsZF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgICAgICBpZiAoZmllbGRzW2ZpZWxkXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBmaWVsZHNbZmllbGRdID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSB0cmFuc2Zvcm1lcnMucG9seWdvbihmaWVsZHNbZmllbGRdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0ZpbGUnOlxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1c2UgdGhlIG9yaWdpbmFsRmllbGRzIHRvIGhhbmRsZSB0aGUgZmlsZSB1cGxvYWRcbiAgICAgICAgICAgIC8vIHNpbmNlIGZpZWxkcyBhcmUgYSBkZWVwY29weSBhbmQgZG8gbm90IGtlZXAgdGhlIGZpbGUgb2JqZWN0XG4gICAgICAgICAgICBmaWVsZHNbZmllbGRdID0gYXdhaXQgdHJhbnNmb3JtZXJzLmZpbGUob3JpZ2luYWxGaWVsZHNbZmllbGRdLCByZXEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnUmVsYXRpb24nOlxuICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IGF3YWl0IHRyYW5zZm9ybWVycy5yZWxhdGlvbihcbiAgICAgICAgICAgICAgcGFyc2VDbGFzcy5maWVsZHNbZmllbGRdLnRhcmdldENsYXNzLFxuICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSxcbiAgICAgICAgICAgICAgb3JpZ2luYWxGaWVsZHNbZmllbGRdLFxuICAgICAgICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEsXG4gICAgICAgICAgICAgIHJlcVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ1BvaW50ZXInOlxuICAgICAgICAgICAgaWYgKGZpZWxkc1tmaWVsZF0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZHNbZmllbGRdID0gYXdhaXQgdHJhbnNmb3JtZXJzLnBvaW50ZXIoXG4gICAgICAgICAgICAgIHBhcnNlQ2xhc3MuZmllbGRzW2ZpZWxkXS50YXJnZXRDbGFzcyxcbiAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0sXG4gICAgICAgICAgICAgIG9yaWdpbmFsRmllbGRzW2ZpZWxkXSxcbiAgICAgICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLFxuICAgICAgICAgICAgICByZXFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGZpZWxkc1tmaWVsZF0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgaWYgKGZpZWxkcy5BQ0wpIGZpZWxkcy5BQ0wgPSB0cmFuc2Zvcm1lcnMuQUNMKGZpZWxkcy5BQ0wpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1lcnMgPSB7XG4gIGZpbGU6IGFzeW5jIChpbnB1dCwgeyBjb25maWcgfSkgPT4ge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICB9XG4gICAgY29uc3QgeyBmaWxlLCB1cGxvYWQgfSA9IGlucHV0O1xuICAgIGlmICh1cGxvYWQpIHtcbiAgICAgIGNvbnN0IHsgZmlsZUluZm8gfSA9IGF3YWl0IGhhbmRsZVVwbG9hZCh1cGxvYWQsIGNvbmZpZyk7XG4gICAgICByZXR1cm4geyAuLi5maWxlSW5mbywgX190eXBlOiAnRmlsZScgfTtcbiAgICB9IGVsc2UgaWYgKGZpbGUgJiYgZmlsZS5uYW1lKSB7XG4gICAgICByZXR1cm4geyBuYW1lOiBmaWxlLm5hbWUsIF9fdHlwZTogJ0ZpbGUnLCB1cmw6IGZpbGUudXJsIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsICdJbnZhbGlkIGZpbGUgdXBsb2FkLicpO1xuICB9LFxuICBwb2x5Z29uOiB2YWx1ZSA9PiAoe1xuICAgIF9fdHlwZTogJ1BvbHlnb24nLFxuICAgIGNvb3JkaW5hdGVzOiB2YWx1ZS5tYXAoZ2VvUG9pbnQgPT4gW2dlb1BvaW50LmxhdGl0dWRlLCBnZW9Qb2ludC5sb25naXR1ZGVdKSxcbiAgfSksXG4gIGdlb1BvaW50OiB2YWx1ZSA9PiAoe1xuICAgIC4uLnZhbHVlLFxuICAgIF9fdHlwZTogJ0dlb1BvaW50JyxcbiAgfSksXG4gIEFDTDogdmFsdWUgPT4ge1xuICAgIGNvbnN0IHBhcnNlQUNMID0ge307XG4gICAgaWYgKHZhbHVlLnB1YmxpYykge1xuICAgICAgcGFyc2VBQ0xbJyonXSA9IHtcbiAgICAgICAgcmVhZDogdmFsdWUucHVibGljLnJlYWQsXG4gICAgICAgIHdyaXRlOiB2YWx1ZS5wdWJsaWMud3JpdGUsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUudXNlcnMpIHtcbiAgICAgIHZhbHVlLnVzZXJzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgIGNvbnN0IGdsb2JhbElkT2JqZWN0ID0gZnJvbUdsb2JhbElkKHJ1bGUudXNlcklkKTtcbiAgICAgICAgaWYgKGdsb2JhbElkT2JqZWN0LnR5cGUgPT09ICdfVXNlcicpIHtcbiAgICAgICAgICBydWxlLnVzZXJJZCA9IGdsb2JhbElkT2JqZWN0LmlkO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlQUNMW3J1bGUudXNlcklkXSA9IHtcbiAgICAgICAgICByZWFkOiBydWxlLnJlYWQsXG4gICAgICAgICAgd3JpdGU6IHJ1bGUud3JpdGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnJvbGVzKSB7XG4gICAgICB2YWx1ZS5yb2xlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICBwYXJzZUFDTFtgcm9sZToke3J1bGUucm9sZU5hbWV9YF0gPSB7XG4gICAgICAgICAgcmVhZDogcnVsZS5yZWFkLFxuICAgICAgICAgIHdyaXRlOiBydWxlLndyaXRlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUFDTDtcbiAgfSxcbiAgcmVsYXRpb246IGFzeW5jIChcbiAgICB0YXJnZXRDbGFzcyxcbiAgICBmaWVsZCxcbiAgICB2YWx1ZSxcbiAgICBvcmlnaW5hbFZhbHVlLFxuICAgIHBhcnNlR3JhcGhRTFNjaGVtYSxcbiAgICB7IGNvbmZpZywgYXV0aCwgaW5mbyB9XG4gICkgPT4ge1xuICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX1BPSU5URVIsXG4gICAgICAgIGBZb3UgbmVlZCB0byBwcm92aWRlIGF0IGxlYXN0IG9uZSBvcGVyYXRpb24gb24gdGhlIHJlbGF0aW9uIG11dGF0aW9uIG9mIGZpZWxkICR7ZmllbGR9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IG9wID0ge1xuICAgICAgX19vcDogJ0JhdGNoJyxcbiAgICAgIG9wczogW10sXG4gICAgfTtcbiAgICBsZXQgbmVzdGVkT2JqZWN0c1RvQWRkID0gW107XG5cbiAgICBpZiAodmFsdWUuY3JlYXRlQW5kQWRkKSB7XG4gICAgICBuZXN0ZWRPYmplY3RzVG9BZGQgPSAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHZhbHVlLmNyZWF0ZUFuZEFkZC5tYXAoYXN5bmMgKGlucHV0LCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZUZpZWxkcyA9IGF3YWl0IHRyYW5zZm9ybVR5cGVzKCdjcmVhdGUnLCBpbnB1dCwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IHRhcmdldENsYXNzLFxuICAgICAgICAgICAgICBvcmlnaW5hbEZpZWxkczogb3JpZ2luYWxWYWx1ZS5jcmVhdGVBbmRBZGRbaV0sXG4gICAgICAgICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYSxcbiAgICAgICAgICAgICAgcmVxOiB7IGNvbmZpZywgYXV0aCwgaW5mbyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0c011dGF0aW9ucy5jcmVhdGVPYmplY3QodGFyZ2V0Q2xhc3MsIHBhcnNlRmllbGRzLCBjb25maWcsIGF1dGgsIGluZm8pO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkubWFwKG9iamVjdCA9PiAoe1xuICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgY2xhc3NOYW1lOiB0YXJnZXRDbGFzcyxcbiAgICAgICAgb2JqZWN0SWQ6IG9iamVjdC5vYmplY3RJZCxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuYWRkIHx8IG5lc3RlZE9iamVjdHNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIXZhbHVlLmFkZCkgdmFsdWUuYWRkID0gW107XG4gICAgICB2YWx1ZS5hZGQgPSB2YWx1ZS5hZGQubWFwKGlucHV0ID0+IHtcbiAgICAgICAgY29uc3QgZ2xvYmFsSWRPYmplY3QgPSBmcm9tR2xvYmFsSWQoaW5wdXQpO1xuICAgICAgICBpZiAoZ2xvYmFsSWRPYmplY3QudHlwZSA9PT0gdGFyZ2V0Q2xhc3MpIHtcbiAgICAgICAgICBpbnB1dCA9IGdsb2JhbElkT2JqZWN0LmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgICAgY2xhc3NOYW1lOiB0YXJnZXRDbGFzcyxcbiAgICAgICAgICBvYmplY3RJZDogaW5wdXQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIG9wLm9wcy5wdXNoKHtcbiAgICAgICAgX19vcDogJ0FkZFJlbGF0aW9uJyxcbiAgICAgICAgb2JqZWN0czogWy4uLnZhbHVlLmFkZCwgLi4ubmVzdGVkT2JqZWN0c1RvQWRkXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5yZW1vdmUpIHtcbiAgICAgIG9wLm9wcy5wdXNoKHtcbiAgICAgICAgX19vcDogJ1JlbW92ZVJlbGF0aW9uJyxcbiAgICAgICAgb2JqZWN0czogdmFsdWUucmVtb3ZlLm1hcChpbnB1dCA9PiB7XG4gICAgICAgICAgY29uc3QgZ2xvYmFsSWRPYmplY3QgPSBmcm9tR2xvYmFsSWQoaW5wdXQpO1xuICAgICAgICAgIGlmIChnbG9iYWxJZE9iamVjdC50eXBlID09PSB0YXJnZXRDbGFzcykge1xuICAgICAgICAgICAgaW5wdXQgPSBnbG9iYWxJZE9iamVjdC5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgIG9iamVjdElkOiBpbnB1dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3A7XG4gIH0sXG4gIHBvaW50ZXI6IGFzeW5jIChcbiAgICB0YXJnZXRDbGFzcyxcbiAgICBmaWVsZCxcbiAgICB2YWx1ZSxcbiAgICBvcmlnaW5hbFZhbHVlLFxuICAgIHBhcnNlR3JhcGhRTFNjaGVtYSxcbiAgICB7IGNvbmZpZywgYXV0aCwgaW5mbyB9XG4gICkgPT4ge1xuICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMSB8fCBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX1BPSU5URVIsXG4gICAgICAgIGBZb3UgbmVlZCB0byBwcm92aWRlIGxpbmsgT1IgY3JlYXRlTGluayBvbiB0aGUgcG9pbnRlciBtdXRhdGlvbiBvZiBmaWVsZCAke2ZpZWxkfWBcbiAgICAgICk7XG5cbiAgICBsZXQgbmVzdGVkT2JqZWN0VG9BZGQ7XG4gICAgaWYgKHZhbHVlLmNyZWF0ZUFuZExpbmspIHtcbiAgICAgIGNvbnN0IHBhcnNlRmllbGRzID0gYXdhaXQgdHJhbnNmb3JtVHlwZXMoJ2NyZWF0ZScsIHZhbHVlLmNyZWF0ZUFuZExpbmssIHtcbiAgICAgICAgY2xhc3NOYW1lOiB0YXJnZXRDbGFzcyxcbiAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLFxuICAgICAgICBvcmlnaW5hbEZpZWxkczogb3JpZ2luYWxWYWx1ZS5jcmVhdGVBbmRMaW5rLFxuICAgICAgICByZXE6IHsgY29uZmlnLCBhdXRoLCBpbmZvIH0sXG4gICAgICB9KTtcbiAgICAgIG5lc3RlZE9iamVjdFRvQWRkID0gYXdhaXQgb2JqZWN0c011dGF0aW9ucy5jcmVhdGVPYmplY3QoXG4gICAgICAgIHRhcmdldENsYXNzLFxuICAgICAgICBwYXJzZUZpZWxkcyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBhdXRoLFxuICAgICAgICBpbmZvXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgIG9iamVjdElkOiBuZXN0ZWRPYmplY3RUb0FkZC5vYmplY3RJZCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZS5saW5rKSB7XG4gICAgICBsZXQgb2JqZWN0SWQgPSB2YWx1ZS5saW5rO1xuICAgICAgY29uc3QgZ2xvYmFsSWRPYmplY3QgPSBmcm9tR2xvYmFsSWQob2JqZWN0SWQpO1xuICAgICAgaWYgKGdsb2JhbElkT2JqZWN0LnR5cGUgPT09IHRhcmdldENsYXNzKSB7XG4gICAgICAgIG9iamVjdElkID0gZ2xvYmFsSWRPYmplY3QuaWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgY2xhc3NOYW1lOiB0YXJnZXRDbGFzcyxcbiAgICAgICAgb2JqZWN0SWQsXG4gICAgICB9O1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCB7IHRyYW5zZm9ybVR5cGVzIH07XG4iXSwi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