UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

520 lines (519 loc) • 57.1 kB
/* eslint-disable no-param-reassign */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _graphql = require("graphql"); const _forgotPassword = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/forgotPassword")); const _init = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/init")); const _login = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/login")); const _logout = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/logout")); const _me = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/me")); const _refresh = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/refresh")); const _resetPassword = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/resetPassword")); const _unlock = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/unlock")); const _verifyEmail = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/verifyEmail")); const _types = require("../../fields/config/types"); const _buildMutationInputType = /*#__PURE__*/ _interop_require_wildcard(require("../../graphql/schema/buildMutationInputType")); const _buildObjectType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildObjectType")); const _buildPaginatedListType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildPaginatedListType")); const _buildPoliciesType = require("../../graphql/schema/buildPoliciesType"); const _buildWhereInputType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildWhereInputType")); const _formatName = /*#__PURE__*/ _interop_require_default(require("../../graphql/utilities/formatName")); const _formatLabels = require("../../utilities/formatLabels"); const _buildCollectionFields = require("../../versions/buildCollectionFields"); const _create = /*#__PURE__*/ _interop_require_default(require("./resolvers/create")); const _delete = /*#__PURE__*/ _interop_require_default(require("./resolvers/delete")); const _docAccess = require("./resolvers/docAccess"); const _find = /*#__PURE__*/ _interop_require_default(require("./resolvers/find")); const _findByID = /*#__PURE__*/ _interop_require_default(require("./resolvers/findByID")); const _findVersionByID = /*#__PURE__*/ _interop_require_default(require("./resolvers/findVersionByID")); const _findVersions = /*#__PURE__*/ _interop_require_default(require("./resolvers/findVersions")); const _restoreVersion = /*#__PURE__*/ _interop_require_default(require("./resolvers/restoreVersion")); const _update = /*#__PURE__*/ _interop_require_default(require("./resolvers/update")); const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/flattenTopLevelFields")); 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; } function initCollectionsGraphQL(payload) { Object.keys(payload.collections).forEach((slug)=>{ const collection = payload.collections[slug]; const { config, config: { fields, graphQL = {}, versions } } = collection; if (!graphQL) return; let singularName; let pluralName; const fromSlug = (0, _formatLabels.formatNames)(collection.config.slug); if (graphQL.singularName) { singularName = (0, _formatLabels.toWords)(graphQL.singularName, true); } else { singularName = fromSlug.singular; } if (graphQL.pluralName) { pluralName = (0, _formatLabels.toWords)(graphQL.pluralName, true); } else { pluralName = fromSlug.plural; } // For collections named 'Media' or similar, // there is a possibility that the singular name // will equal the plural name. Append `all` to the beginning // of potential conflicts if (singularName === pluralName) { pluralName = `all${singularName}`; } collection.graphQL = {}; const hasIDField = (0, _flattenTopLevelFields.default)(fields).findIndex((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id') > -1; const idType = (0, _buildMutationInputType.getCollectionIDType)(payload, config); const baseFields = {}; const whereInputFields = [ ...fields ]; if (!hasIDField) { baseFields.id = { type: idType }; whereInputFields.push({ name: 'id', type: payload.db.defaultIDType }); } const forceNullableObjectType = Boolean(versions?.drafts); collection.graphQL.type = (0, _buildObjectType.default)({ name: singularName, baseFields, fields, forceNullable: forceNullableObjectType, parentName: singularName, payload }); collection.graphQL.paginatedType = (0, _buildPaginatedListType.default)(pluralName, collection.graphQL.type); collection.graphQL.whereInputType = (0, _buildWhereInputType.default)({ name: singularName, fields: whereInputFields, parentName: singularName, payload }); if (config.auth && !config.auth.disableLocalStrategy) { fields.push({ name: 'password', label: 'Password', required: true, type: 'text' }); } const createMutationInputType = (0, _buildMutationInputType.default)(payload, singularName, fields, singularName); if (createMutationInputType) { collection.graphQL.mutationInputType = new _graphql.GraphQLNonNull(createMutationInputType); } const updateMutationInputType = (0, _buildMutationInputType.default)(payload, `${singularName}Update`, fields.filter((field)=>!((0, _types.fieldAffectsData)(field) && field.name === 'id')), `${singularName}Update`, true); if (updateMutationInputType) { collection.graphQL.updateMutationInputType = new _graphql.GraphQLNonNull(updateMutationInputType); } payload.Query.fields[singularName] = { args: { id: { type: new _graphql.GraphQLNonNull(idType) }, draft: { type: _graphql.GraphQLBoolean }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _findByID.default)(collection), type: collection.graphQL.type }; payload.Query.fields[pluralName] = { args: { draft: { type: _graphql.GraphQLBoolean }, where: { type: collection.graphQL.whereInputType }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {}, limit: { type: _graphql.GraphQLInt }, page: { type: _graphql.GraphQLInt }, sort: { type: _graphql.GraphQLString } }, resolve: (0, _find.default)(collection), type: (0, _buildPaginatedListType.default)(pluralName, collection.graphQL.type) }; payload.Query.fields[`docAccess${singularName}`] = { args: { id: { type: new _graphql.GraphQLNonNull(idType) } }, resolve: (0, _docAccess.docAccessResolver)(), type: (0, _buildPoliciesType.buildPolicyType)({ entity: config, scope: 'docAccess', type: 'collection', typeSuffix: 'DocAccess' }) }; payload.Mutation.fields[`create${singularName}`] = { args: { ...createMutationInputType ? { data: { type: collection.graphQL.mutationInputType } } : {}, draft: { type: _graphql.GraphQLBoolean }, ...payload.config.localization ? { locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _create.default)(collection), type: collection.graphQL.type }; payload.Mutation.fields[`update${singularName}`] = { args: { id: { type: new _graphql.GraphQLNonNull(idType) }, autosave: { type: _graphql.GraphQLBoolean }, ...updateMutationInputType ? { data: { type: collection.graphQL.updateMutationInputType } } : {}, draft: { type: _graphql.GraphQLBoolean }, ...payload.config.localization ? { locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _update.default)(collection), type: collection.graphQL.type }; payload.Mutation.fields[`delete${singularName}`] = { args: { id: { type: new _graphql.GraphQLNonNull(idType) } }, resolve: (0, _delete.default)(collection), type: collection.graphQL.type }; if (config.versions) { const versionIDType = payload.db.defaultIDType === 'text' ? _graphql.GraphQLString : _graphql.GraphQLInt; const versionCollectionFields = [ ...(0, _buildCollectionFields.buildVersionCollectionFields)(config), { name: 'id', type: payload.db.defaultIDType }, { name: 'createdAt', label: 'Created At', type: 'date' }, { name: 'updatedAt', label: 'Updated At', type: 'date' } ]; collection.graphQL.versionType = (0, _buildObjectType.default)({ name: `${singularName}Version`, fields: versionCollectionFields, forceNullable: forceNullableObjectType, parentName: `${singularName}Version`, payload }); payload.Query.fields[`version${(0, _formatName.default)(singularName)}`] = { args: { id: { type: versionIDType }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _findVersionByID.default)(collection), type: collection.graphQL.versionType }; payload.Query.fields[`versions${pluralName}`] = { args: { where: { type: (0, _buildWhereInputType.default)({ name: `versions${singularName}`, fields: versionCollectionFields, parentName: `versions${singularName}`, payload }) }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {}, limit: { type: _graphql.GraphQLInt }, page: { type: _graphql.GraphQLInt }, sort: { type: _graphql.GraphQLString } }, resolve: (0, _findVersions.default)(collection), type: (0, _buildPaginatedListType.default)(`versions${(0, _formatName.default)(pluralName)}`, collection.graphQL.versionType) }; payload.Mutation.fields[`restoreVersion${(0, _formatName.default)(singularName)}`] = { args: { id: { type: versionIDType } }, resolve: (0, _restoreVersion.default)(collection), type: collection.graphQL.type }; } if (config.auth) { const authFields = config.auth.disableLocalStrategy ? [] : [ { name: 'email', required: true, type: 'email' } ]; collection.graphQL.JWT = (0, _buildObjectType.default)({ name: (0, _formatName.default)(`${slug}JWT`), fields: [ ...config.fields.filter((field)=>(0, _types.fieldAffectsData)(field) && field.saveToJWT), ...authFields, { name: 'collection', required: true, type: 'text' } ], parentName: (0, _formatName.default)(`${slug}JWT`), payload }); payload.Query.fields[`me${singularName}`] = { resolve: (0, _me.default)(collection), type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}Me`), fields: { collection: { type: _graphql.GraphQLString }, exp: { type: _graphql.GraphQLInt }, token: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.type } } }) }; payload.Query.fields[`initialized${singularName}`] = { resolve: (0, _init.default)(collection.config.slug), type: _graphql.GraphQLBoolean }; payload.Mutation.fields[`refreshToken${singularName}`] = { args: { token: { type: _graphql.GraphQLString } }, resolve: (0, _refresh.default)(collection), type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}Refreshed${singularName}`), fields: { exp: { type: _graphql.GraphQLInt }, refreshedToken: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.JWT } } }) }; payload.Mutation.fields[`logout${singularName}`] = { resolve: (0, _logout.default)(collection), type: _graphql.GraphQLString }; if (!config.auth.disableLocalStrategy) { if (config.auth.maxLoginAttempts > 0) { payload.Mutation.fields[`unlock${singularName}`] = { args: { email: { type: new _graphql.GraphQLNonNull(_graphql.GraphQLString) } }, resolve: (0, _unlock.default)(collection), type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean) }; } payload.Mutation.fields[`login${singularName}`] = { args: { email: { type: _graphql.GraphQLString }, password: { type: _graphql.GraphQLString } }, resolve: (0, _login.default)(collection), type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}LoginResult`), fields: { exp: { type: _graphql.GraphQLInt }, token: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.type } } }) }; payload.Mutation.fields[`forgotPassword${singularName}`] = { args: { disableEmail: { type: _graphql.GraphQLBoolean }, email: { type: new _graphql.GraphQLNonNull(_graphql.GraphQLString) }, expiration: { type: _graphql.GraphQLInt } }, resolve: (0, _forgotPassword.default)(collection), type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean) }; payload.Mutation.fields[`resetPassword${singularName}`] = { args: { password: { type: _graphql.GraphQLString }, token: { type: _graphql.GraphQLString } }, resolve: (0, _resetPassword.default)(collection), type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}ResetPassword`), fields: { token: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.type } } }) }; payload.Mutation.fields[`verifyEmail${singularName}`] = { args: { token: { type: _graphql.GraphQLString } }, resolve: (0, _verifyEmail.default)(collection), type: _graphql.GraphQLBoolean }; } } }); } const _default = initCollectionsGraphQL; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9ncmFwaHFsL2luaXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7XG4gIEdyYXBoUUxCb29sZWFuLFxuICBHcmFwaFFMSW50LFxuICBHcmFwaFFMTm9uTnVsbCxcbiAgR3JhcGhRTE9iamVjdFR5cGUsXG4gIEdyYXBoUUxTdHJpbmcsXG59IGZyb20gJ2dyYXBocWwnXG5cbmltcG9ydCB0eXBlIHsgRmllbGQgfSBmcm9tICcuLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RUeXBlQ29uZmlnIH0gZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRPYmplY3RUeXBlJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vLi4vcGF5bG9hZCdcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbiwgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy90eXBlcydcblxuaW1wb3J0IGZvcmdvdFBhc3N3b3JkIGZyb20gJy4uLy4uL2F1dGgvZ3JhcGhxbC9yZXNvbHZlcnMvZm9yZ290UGFzc3dvcmQnXG5pbXBvcnQgaW5pdCBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL2luaXQnXG5pbXBvcnQgbG9naW4gZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9sb2dpbidcbmltcG9ydCBsb2dvdXQgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9sb2dvdXQnXG5pbXBvcnQgbWUgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9tZSdcbmltcG9ydCByZWZyZXNoIGZyb20gJy4uLy4uL2F1dGgvZ3JhcGhxbC9yZXNvbHZlcnMvcmVmcmVzaCdcbmltcG9ydCByZXNldFBhc3N3b3JkIGZyb20gJy4uLy4uL2F1dGgvZ3JhcGhxbC9yZXNvbHZlcnMvcmVzZXRQYXNzd29yZCdcbmltcG9ydCB1bmxvY2sgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy91bmxvY2snXG5pbXBvcnQgdmVyaWZ5RW1haWwgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy92ZXJpZnlFbWFpbCdcbmltcG9ydCB7IGZpZWxkQWZmZWN0c0RhdGEgfSBmcm9tICcuLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUsIHtcbiAgZ2V0Q29sbGVjdGlvbklEVHlwZSxcbn0gZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRNdXRhdGlvbklucHV0VHlwZSdcbmltcG9ydCBidWlsZE9iamVjdFR5cGUgZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRPYmplY3RUeXBlJ1xuaW1wb3J0IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUgZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRQYWdpbmF0ZWRMaXN0VHlwZSdcbmltcG9ydCB7IGJ1aWxkUG9saWN5VHlwZSB9IGZyb20gJy4uLy4uL2dyYXBocWwvc2NoZW1hL2J1aWxkUG9saWNpZXNUeXBlJ1xuaW1wb3J0IGJ1aWxkV2hlcmVJbnB1dFR5cGUgZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRXaGVyZUlucHV0VHlwZSdcbmltcG9ydCBmb3JtYXROYW1lIGZyb20gJy4uLy4uL2dyYXBocWwvdXRpbGl0aWVzL2Zvcm1hdE5hbWUnXG5pbXBvcnQgeyBmb3JtYXROYW1lcywgdG9Xb3JkcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9mb3JtYXRMYWJlbHMnXG5pbXBvcnQgeyBidWlsZFZlcnNpb25Db2xsZWN0aW9uRmllbGRzIH0gZnJvbSAnLi4vLi4vdmVyc2lvbnMvYnVpbGRDb2xsZWN0aW9uRmllbGRzJ1xuaW1wb3J0IGNyZWF0ZVJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2NyZWF0ZSdcbmltcG9ydCBnZXREZWxldGVSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVycy9kZWxldGUnXG5pbXBvcnQgeyBkb2NBY2Nlc3NSZXNvbHZlciB9IGZyb20gJy4vcmVzb2x2ZXJzL2RvY0FjY2VzcydcbmltcG9ydCBmaW5kUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvZmluZCdcbmltcG9ydCBmaW5kQnlJRFJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2ZpbmRCeUlEJ1xuaW1wb3J0IGZpbmRWZXJzaW9uQnlJRFJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2ZpbmRWZXJzaW9uQnlJRCdcbmltcG9ydCBmaW5kVmVyc2lvbnNSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVycy9maW5kVmVyc2lvbnMnXG5pbXBvcnQgcmVzdG9yZVZlcnNpb25SZXNvbHZlciBmcm9tICcuL3Jlc29sdmVycy9yZXN0b3JlVmVyc2lvbidcbmltcG9ydCB1cGRhdGVSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVycy91cGRhdGUnXG5pbXBvcnQgZmxhdHRlbkZpZWxkcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvZmxhdHRlblRvcExldmVsRmllbGRzJ1xuXG5mdW5jdGlvbiBpbml0Q29sbGVjdGlvbnNHcmFwaFFMKHBheWxvYWQ6IFBheWxvYWQpOiB2b2lkIHtcbiAgT2JqZWN0LmtleXMocGF5bG9hZC5jb2xsZWN0aW9ucykuZm9yRWFjaCgoc2x1ZykgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb246IENvbGxlY3Rpb24gPSBwYXlsb2FkLmNvbGxlY3Rpb25zW3NsdWddXG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnOiB7IGZpZWxkcywgZ3JhcGhRTCA9IHt9IGFzIFNhbml0aXplZENvbGxlY3Rpb25Db25maWdbJ2dyYXBoUUwnXSwgdmVyc2lvbnMgfSxcbiAgICB9ID0gY29sbGVjdGlvblxuXG4gICAgaWYgKCFncmFwaFFMKSByZXR1cm5cblxuICAgIGxldCBzaW5ndWxhck5hbWVcbiAgICBsZXQgcGx1cmFsTmFtZVxuICAgIGNvbnN0IGZyb21TbHVnID0gZm9ybWF0TmFtZXMoY29sbGVjdGlvbi5jb25maWcuc2x1ZylcbiAgICBpZiAoZ3JhcGhRTC5zaW5ndWxhck5hbWUpIHtcbiAgICAgIHNpbmd1bGFyTmFtZSA9IHRvV29yZHMoZ3JhcGhRTC5zaW5ndWxhck5hbWUsIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNpbmd1bGFyTmFtZSA9IGZyb21TbHVnLnNpbmd1bGFyXG4gICAgfVxuICAgIGlmIChncmFwaFFMLnBsdXJhbE5hbWUpIHtcbiAgICAgIHBsdXJhbE5hbWUgPSB0b1dvcmRzKGdyYXBoUUwucGx1cmFsTmFtZSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGx1cmFsTmFtZSA9IGZyb21TbHVnLnBsdXJhbFxuICAgIH1cblxuICAgIC8vIEZvciBjb2xsZWN0aW9ucyBuYW1lZCAnTWVkaWEnIG9yIHNpbWlsYXIsXG4gICAgLy8gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBzaW5ndWxhciBuYW1lXG4gICAgLy8gd2lsbCBlcXVhbCB0aGUgcGx1cmFsIG5hbWUuIEFwcGVuZCBgYWxsYCB0byB0aGUgYmVnaW5uaW5nXG4gICAgLy8gb2YgcG90ZW50aWFsIGNvbmZsaWN0c1xuICAgIGlmIChzaW5ndWxhck5hbWUgPT09IHBsdXJhbE5hbWUpIHtcbiAgICAgIHBsdXJhbE5hbWUgPSBgYWxsJHtzaW5ndWxhck5hbWV9YFxuICAgIH1cblxuICAgIGNvbGxlY3Rpb24uZ3JhcGhRTCA9IHt9IGFzIENvbGxlY3Rpb25bJ2dyYXBoUUwnXVxuXG4gICAgY29uc3QgaGFzSURGaWVsZCA9XG4gICAgICBmbGF0dGVuRmllbGRzKGZpZWxkcykuZmluZEluZGV4KChmaWVsZCkgPT4gZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgZmllbGQubmFtZSA9PT0gJ2lkJykgPlxuICAgICAgLTFcblxuICAgIGNvbnN0IGlkVHlwZSA9IGdldENvbGxlY3Rpb25JRFR5cGUocGF5bG9hZCwgY29uZmlnKVxuXG4gICAgY29uc3QgYmFzZUZpZWxkczogT2JqZWN0VHlwZUNvbmZpZyA9IHt9XG5cbiAgICBjb25zdCB3aGVyZUlucHV0RmllbGRzID0gWy4uLmZpZWxkc11cblxuICAgIGlmICghaGFzSURGaWVsZCkge1xuICAgICAgYmFzZUZpZWxkcy5pZCA9IHsgdHlwZTogaWRUeXBlIH1cbiAgICAgIHdoZXJlSW5wdXRGaWVsZHMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdpZCcsXG4gICAgICAgIHR5cGU6IHBheWxvYWQuZGIuZGVmYXVsdElEVHlwZSBhcyAndGV4dCcsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGZvcmNlTnVsbGFibGVPYmplY3RUeXBlID0gQm9vbGVhbih2ZXJzaW9ucz8uZHJhZnRzKVxuXG4gICAgY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUgPSBidWlsZE9iamVjdFR5cGUoe1xuICAgICAgbmFtZTogc2luZ3VsYXJOYW1lLFxuICAgICAgYmFzZUZpZWxkcyxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGZvcmNlTnVsbGFibGU6IGZvcmNlTnVsbGFibGVPYmplY3RUeXBlLFxuICAgICAgcGFyZW50TmFtZTogc2luZ3VsYXJOYW1lLFxuICAgICAgcGF5bG9hZCxcbiAgICB9KVxuXG4gICAgY29sbGVjdGlvbi5ncmFwaFFMLnBhZ2luYXRlZFR5cGUgPSBidWlsZFBhZ2luYXRlZExpc3RUeXBlKHBsdXJhbE5hbWUsIGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlKVxuXG4gICAgY29sbGVjdGlvbi5ncmFwaFFMLndoZXJlSW5wdXRUeXBlID0gYnVpbGRXaGVyZUlucHV0VHlwZSh7XG4gICAgICBuYW1lOiBzaW5ndWxhck5hbWUsXG4gICAgICBmaWVsZHM6IHdoZXJlSW5wdXRGaWVsZHMsXG4gICAgICBwYXJlbnROYW1lOiBzaW5ndWxhck5hbWUsXG4gICAgICBwYXlsb2FkLFxuICAgIH0pXG5cbiAgICBpZiAoY29uZmlnLmF1dGggJiYgIWNvbmZpZy5hdXRoLmRpc2FibGVMb2NhbFN0cmF0ZWd5KSB7XG4gICAgICBmaWVsZHMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgIGxhYmVsOiAnUGFzc3dvcmQnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVNdXRhdGlvbklucHV0VHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoXG4gICAgICBwYXlsb2FkLFxuICAgICAgc2luZ3VsYXJOYW1lLFxuICAgICAgZmllbGRzLFxuICAgICAgc2luZ3VsYXJOYW1lLFxuICAgIClcbiAgICBpZiAoY3JlYXRlTXV0YXRpb25JbnB1dFR5cGUpIHtcbiAgICAgIGNvbGxlY3Rpb24uZ3JhcGhRTC5tdXRhdGlvbklucHV0VHlwZSA9IG5ldyBHcmFwaFFMTm9uTnVsbChjcmVhdGVNdXRhdGlvbklucHV0VHlwZSlcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVNdXRhdGlvbklucHV0VHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoXG4gICAgICBwYXlsb2FkLFxuICAgICAgYCR7c2luZ3VsYXJOYW1lfVVwZGF0ZWAsXG4gICAgICBmaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIShmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnKSksXG4gICAgICBgJHtzaW5ndWxhck5hbWV9VXBkYXRlYCxcbiAgICAgIHRydWUsXG4gICAgKVxuICAgIGlmICh1cGRhdGVNdXRhdGlvbklucHV0VHlwZSkge1xuICAgICAgY29sbGVjdGlvbi5ncmFwaFFMLnVwZGF0ZU11dGF0aW9uSW5wdXRUeXBlID0gbmV3IEdyYXBoUUxOb25OdWxsKHVwZGF0ZU11dGF0aW9uSW5wdXRUeXBlKVxuICAgIH1cblxuICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW3Npbmd1bGFyTmFtZV0gPSB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChpZFR5cGUpIH0sXG4gICAgICAgIGRyYWZ0OiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGU6IHsgdHlwZTogcGF5bG9hZC50eXBlcy5mYWxsYmFja0xvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICBsb2NhbGU6IHsgdHlwZTogcGF5bG9hZC50eXBlcy5sb2NhbGVJbnB1dFR5cGUgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiBmaW5kQnlJRFJlc29sdmVyKGNvbGxlY3Rpb24pLFxuICAgICAgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUsXG4gICAgfVxuXG4gICAgcGF5bG9hZC5RdWVyeS5maWVsZHNbcGx1cmFsTmFtZV0gPSB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIGRyYWZ0OiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgIHdoZXJlOiB7IHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC53aGVyZUlucHV0VHlwZSB9LFxuICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZhbGxiYWNrTG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMuZmFsbGJhY2tMb2NhbGVJbnB1dFR5cGUgfSxcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIGxpbWl0OiB7IHR5cGU6IEdyYXBoUUxJbnQgfSxcbiAgICAgICAgcGFnZTogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgIHNvcnQ6IHsgdHlwZTogR3JhcGhRTFN0cmluZyB9LFxuICAgICAgfSxcbiAgICAgIHJlc29sdmU6IGZpbmRSZXNvbHZlcihjb2xsZWN0aW9uKSxcbiAgICAgIHR5cGU6IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUocGx1cmFsTmFtZSwgY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUpLFxuICAgIH1cblxuICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2Bkb2NBY2Nlc3Mke3Npbmd1bGFyTmFtZX1gXSA9IHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgaWQ6IHsgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKGlkVHlwZSkgfSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiBkb2NBY2Nlc3NSZXNvbHZlcigpLFxuICAgICAgdHlwZTogYnVpbGRQb2xpY3lUeXBlKHtcbiAgICAgICAgZW50aXR5OiBjb25maWcsXG4gICAgICAgIHNjb3BlOiAnZG9jQWNjZXNzJyxcbiAgICAgICAgdHlwZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICB0eXBlU3VmZml4OiAnRG9jQWNjZXNzJyxcbiAgICAgIH0pLFxuICAgIH1cblxuICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2BjcmVhdGUke3Npbmd1bGFyTmFtZX1gXSA9IHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgLi4uKGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlXG4gICAgICAgICAgPyB7IGRhdGE6IHsgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLm11dGF0aW9uSW5wdXRUeXBlIH0gfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICAgIHJlc29sdmU6IGNyZWF0ZVJlc29sdmVyKGNvbGxlY3Rpb24pLFxuICAgICAgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUsXG4gICAgfVxuXG4gICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHVwZGF0ZSR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgYXJnczoge1xuICAgICAgICBpZDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoaWRUeXBlKSB9LFxuICAgICAgICBhdXRvc2F2ZTogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAuLi4odXBkYXRlTXV0YXRpb25JbnB1dFR5cGVcbiAgICAgICAgICA/IHsgZGF0YTogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudXBkYXRlTXV0YXRpb25JbnB1dFR5cGUgfSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIGRyYWZ0OiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogdXBkYXRlUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgZGVsZXRlJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChpZFR5cGUpIH0sXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZ2V0RGVsZXRlUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnZlcnNpb25zKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uSURUeXBlID0gcGF5bG9hZC5kYi5kZWZhdWx0SURUeXBlID09PSAndGV4dCcgPyBHcmFwaFFMU3RyaW5nIDogR3JhcGhRTEludFxuICAgICAgY29uc3QgdmVyc2lvbkNvbGxlY3Rpb25GaWVsZHM6IEZpZWxkW10gPSBbXG4gICAgICAgIC4uLmJ1aWxkVmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMoY29uZmlnKSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdpZCcsXG4gICAgICAgICAgdHlwZTogcGF5bG9hZC5kYi5kZWZhdWx0SURUeXBlIGFzICd0ZXh0JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdjcmVhdGVkQXQnLFxuICAgICAgICAgIGxhYmVsOiAnQ3JlYXRlZCBBdCcsXG4gICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3VwZGF0ZWRBdCcsXG4gICAgICAgICAgbGFiZWw6ICdVcGRhdGVkIEF0JyxcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgIH0sXG4gICAgICBdXG5cbiAgICAgIGNvbGxlY3Rpb24uZ3JhcGhRTC52ZXJzaW9uVHlwZSA9IGJ1aWxkT2JqZWN0VHlwZSh7XG4gICAgICAgIG5hbWU6IGAke3Npbmd1bGFyTmFtZX1WZXJzaW9uYCxcbiAgICAgICAgZmllbGRzOiB2ZXJzaW9uQ29sbGVjdGlvbkZpZWxkcyxcbiAgICAgICAgZm9yY2VOdWxsYWJsZTogZm9yY2VOdWxsYWJsZU9iamVjdFR5cGUsXG4gICAgICAgIHBhcmVudE5hbWU6IGAke3Npbmd1bGFyTmFtZX1WZXJzaW9uYCxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgIH0pXG5cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2B2ZXJzaW9uJHtmb3JtYXROYW1lKHNpbmd1bGFyTmFtZSl9YF0gPSB7XG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBpZDogeyB0eXBlOiB2ZXJzaW9uSURUeXBlIH0sXG4gICAgICAgICAgLi4uKHBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvblxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGU6IHsgdHlwZTogcGF5bG9hZC50eXBlcy5mYWxsYmFja0xvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZTogZmluZFZlcnNpb25CeUlEUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC52ZXJzaW9uVHlwZSxcbiAgICAgIH1cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2B2ZXJzaW9ucyR7cGx1cmFsTmFtZX1gXSA9IHtcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBidWlsZFdoZXJlSW5wdXRUeXBlKHtcbiAgICAgICAgICAgICAgbmFtZTogYHZlcnNpb25zJHtzaW5ndWxhck5hbWV9YCxcbiAgICAgICAgICAgICAgZmllbGRzOiB2ZXJzaW9uQ29sbGVjdGlvbkZpZWxkcyxcbiAgICAgICAgICAgICAgcGFyZW50TmFtZTogYHZlcnNpb25zJHtzaW5ndWxhck5hbWV9YCxcbiAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKHBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvblxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGU6IHsgdHlwZTogcGF5bG9hZC50eXBlcy5mYWxsYmFja0xvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICBsaW1pdDogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgICAgcGFnZTogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgICAgc29ydDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmU6IGZpbmRWZXJzaW9uc1Jlc29sdmVyKGNvbGxlY3Rpb24pLFxuICAgICAgICB0eXBlOiBidWlsZFBhZ2luYXRlZExpc3RUeXBlKFxuICAgICAgICAgIGB2ZXJzaW9ucyR7Zm9ybWF0TmFtZShwbHVyYWxOYW1lKX1gLFxuICAgICAgICAgIGNvbGxlY3Rpb24uZ3JhcGhRTC52ZXJzaW9uVHlwZSxcbiAgICAgICAgKSxcbiAgICAgIH1cbiAgICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2ByZXN0b3JlVmVyc2lvbiR7Zm9ybWF0TmFtZShzaW5ndWxhck5hbWUpfWBdID0ge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgaWQ6IHsgdHlwZTogdmVyc2lvbklEVHlwZSB9LFxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlOiByZXN0b3JlVmVyc2lvblJlc29sdmVyKGNvbGxlY3Rpb24pLFxuICAgICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIGNvbnN0IGF1dGhGaWVsZHM6IEZpZWxkW10gPSBjb25maWcuYXV0aC5kaXNhYmxlTG9jYWxTdHJhdGVneVxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZW1haWwnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2VtYWlsJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgY29sbGVjdGlvbi5ncmFwaFFMLkpXVCA9IGJ1aWxkT2JqZWN0VHlwZSh7XG4gICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31KV1RgKSxcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgLi4uY29uZmlnLmZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5zYXZlVG9KV1QpLFxuICAgICAgICAgIC4uLmF1dGhGaWVsZHMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFyZW50TmFtZTogZm9ybWF0TmFtZShgJHtzbHVnfUpXVGApLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgfSlcblxuICAgICAgcGF5bG9hZC5RdWVyeS5maWVsZHNbYG1lJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgIHJlc29sdmU6IG1lKGNvbGxlY3Rpb24pLFxuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31NZWApLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMU3RyaW5nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRva2VuOiB7XG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9XG5cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2Bpbml0aWFsaXplZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICByZXNvbHZlOiBpbml0KGNvbGxlY3Rpb24uY29uZmlnLnNsdWcpLFxuICAgICAgICB0eXBlOiBHcmFwaFFMQm9vbGVhbixcbiAgICAgIH1cblxuICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHJlZnJlc2hUb2tlbiR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgdG9rZW46IHsgdHlwZTogR3JhcGhRTFN0cmluZyB9LFxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlOiByZWZyZXNoKGNvbGxlY3Rpb24pLFxuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31SZWZyZXNoZWQke3Npbmd1bGFyTmFtZX1gKSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZnJlc2hlZFRva2VuOiB7XG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwuSldULFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH1cblxuICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYGxvZ291dCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICByZXNvbHZlOiBsb2dvdXQoY29sbGVjdGlvbiksXG4gICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICB9XG5cbiAgICAgIGlmICghY29uZmlnLmF1dGguZGlzYWJsZUxvY2FsU3RyYXRlZ3kpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5hdXRoLm1heExvZ2luQXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHVubG9jayR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZykgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNvbHZlOiB1bmxvY2soY29sbGVjdGlvbiksXG4gICAgICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEJvb2xlYW4pLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2Bsb2dpbiR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIGVtYWlsOiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IGxvZ2luKGNvbGxlY3Rpb24pLFxuICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gICAgICAgICAgICBuYW1lOiBmb3JtYXROYW1lKGAke3NsdWd9TG9naW5SZXN1bHRgKSxcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBleHA6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0b2tlbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgZm9yZ290UGFzc3dvcmQke3Npbmd1bGFyTmFtZX1gXSA9IHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBkaXNhYmxlRW1haWw6IHsgdHlwZTogR3JhcGhRTEJvb2xlYW4gfSxcbiAgICAgICAgICAgIGVtYWlsOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMU3RyaW5nKSB9LFxuICAgICAgICAgICAgZXhwaXJhdGlvbjogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiBmb3Jnb3RQYXNzd29yZChjb2xsZWN0aW9uKSxcbiAgICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEJvb2xlYW4pLFxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHJlc2V0UGFzc3dvcmQke3Npbmd1bGFyTmFtZX1gXSA9IHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBwYXNzd29yZDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgICB0b2tlbjogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiByZXNldFBhc3N3b3JkKGNvbGxlY3Rpb24pLFxuICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gICAgICAgICAgICBuYW1lOiBmb3JtYXROYW1lKGAke3NsdWd9UmVzZXRQYXNzd29yZGApLFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHRva2VuOiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgICAgICAgdXNlcjogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2B2ZXJpZnlFbWFpbCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHRva2VuOiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IHZlcmlmeUVtYWlsKGNvbGxlY3Rpb24pLFxuICAgICAgICAgIHR5cGU6IEdyYXBoUUxCb29sZWFuLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0Q29sbGVjdGlvbnNHcmFwaFFMXG4iXSwibmFtZXMiOlsiaW5pdENvbGxlY3Rpb25zR3JhcGhRTCIsInBheWxvYWQiLCJPYmplY3QiLCJrZXlzIiwiY29sbGVjdGlvbnMiLCJmb3JFYWNoIiwic2x1ZyIsImNvbGxlY3Rpb24iLCJjb25maWciLCJmaWVsZHMiLCJncmFwaFFMIiwidmVyc2lvbnMiLCJzaW5ndWxhck5hbWUiLCJwbHVyYWxOYW1lIiwiZnJvbVNsdWciLCJmb3JtYXROYW1lcyIsInRvV29yZHMiLCJzaW5ndWxhciIsInBsdXJhbCIsImhhc0lERmllbGQiLCJmbGF0dGVuRmllbGRzIiwiZmluZEluZGV4IiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsImlkVHlwZSIsImdldENvbGxlY3Rpb25JRFR5cGUiLCJiYXNlRmllbGRzIiwid2hlcmVJbnB1dEZpZWxkcyIsImlkIiwidHlwZSIsInB1c2giLCJkYiIsImRlZmF1bHRJRFR5cGUiLCJmb3JjZU51bGxhYmxlT2JqZWN0VHlwZSIsIkJvb2xlYW4iLCJkcmFmdHMiLCJidWlsZE9iamVjdFR5cGUiLCJmb3JjZU51bGxhYmxlIiwicGFyZW50TmFtZSIsInBhZ2luYXRlZFR5cGUiLCJidWlsZFBhZ2luYXRlZExpc3RUeXBlIiwid2hlcmVJbnB1dFR5cGUiLCJidWlsZFdoZXJlSW5wdXRUeXBlIiwiYXV0aCIsImRpc2FibGVMb2NhbFN0cmF0ZWd5IiwibGFiZWwiLCJyZXF1aXJlZCIsImNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlIiwiYnVpbGRNdXRhdGlvbklucHV0VHlwZSIsIm11dGF0aW9uSW5wdXRUeXBlIiwiR3JhcGhRTE5vbk51bGwiLCJ1cGRhdGVNdXRhdGlvbklucHV0VHlwZSIsImZpbHRlciIsIlF1ZXJ5IiwiYXJncyIsImRyYWZ0IiwiR3JhcGhRTEJvb2xlYW4iLCJsb2NhbGl6YXRpb24iLCJmYWxsYmFja0xvY2FsZSIsInR5cGVzIiwiZmFsbGJhY2tMb2NhbGVJbnB1dFR5cGUiLCJsb2NhbGUiLCJsb2NhbGVJbnB1dFR5cGUiLCJyZXNvbHZlIiwiZmluZEJ5SURSZXNvbHZlciIsIndoZXJlIiwibGltaXQiLCJHcmFwaFFMSW50IiwicGFnZSIsInNvcnQiLCJHcmFwaFFMU3RyaW5nIiwiZmluZFJlc29sdmVyIiwiZG9jQWNjZXNzUmVzb2x2ZXIiLCJidWlsZFBvbGljeVR5cGUiLCJlbnRpdHkiLCJzY29wZSIsInR5cGVTdWZmaXgiLCJNdXRhdGlvbiIsImRhdGEiLCJjcmVhdGVSZXNvbHZlciIsImF1dG9zYXZlIiwidXBkYXRlUmVzb2x2ZXIiLCJnZXREZWxldGVSZXNvbHZlciIsInZlcnNpb25JRFR5cGUiLCJ2ZXJzaW9uQ29sbGVjdGlvbkZpZWxkcyIsImJ1aWxkVmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMiLCJ2ZXJzaW9uVHlwZSIsImZvcm1hdE5hbWUiLCJmaW5kVmVyc2lvbkJ5SURSZXNvbHZlciIsImZpbmRWZXJzaW9uc1Jlc29sdmVyIiwicmVzdG9yZVZlcnNpb25SZXNvbHZlciIsImF1dGhGaWVsZHMiLCJKV1QiLCJzYXZlVG9KV1QiLCJtZSIsIkdyYXBoUUxPYmplY3RUeXBlIiwiZXhwIiwidG9rZW4iLCJ1c2VyIiwiaW5pdCIsInJlZnJlc2giLCJyZWZyZXNoZWRUb2tlbiIsImxvZ291dCIsIm1heExvZ2luQXR0ZW1wdHMiLCJlbWFpbCIsInVubG9jayIsInBhc3N3b3JkIiwibG9naW4iLCJkaXNhYmxlRW1haWwiLCJleHBpcmF0aW9uIiwiZm9yZ290UGFzc3dvcmQiLCJyZXNldFBhc3N3b3JkIiwidmVyaWZ5RW1haWwiXSwibWFwcGluZ3MiOiJBQUFBLG9DQUFvQzs7OzsrQkEwY3BDOzs7ZUFBQTs7O3lCQW5jTzt1RUFPb0I7NkRBQ1Y7OERBQ0M7K0RBQ0M7MkRBQ0o7Z0VBQ0s7c0VBQ007K0RBQ1A7b0VBQ0s7dUJBQ1M7Z0ZBRzFCO3dFQUNxQjsrRUFDTzttQ0FDSDs0RUFDQTttRUFDVDs4QkFDYzt1Q0FDUTsrREFDbEI7K0RBQ0c7MkJBQ0k7NkRBQ1Q7aUVBQ0k7d0VBQ087cUVBQ0g7dUVBQ0U7K0RBQ1I7OEVBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTFCLFNBQVNBLHVCQUF1QkMsT0FBZ0I7SUFDOUNDLE9BQU9DLElBQUksQ0FBQ0YsUUFBUUcsV0FBVyxFQUFFQyxPQUFPLENBQUMsQ0FBQ0M7UUFDeEMsTUFBTUMsYUFBeUJOLFFBQVFHLFdBQVcsQ0FBQ0UsS0FBSztRQUN4RCxNQUFNLEVBQ0pFLE1BQU0sRUFDTkEsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLFVBQVUsQ0FBQyxDQUF5QyxFQUFFQyxRQUFRLEVBQUUsRUFDbkYsR0FBR0o7UUFFSixJQUFJLENBQUNHLFNBQVM7UUFFZCxJQUFJRTtRQUNKLElBQUlDO1FBQ0osTUFBTUMsV0FBV0MsSUFBQUEseUJBQVcsRUFBQ1IsV0FBV0MsTUFBTSxDQUFDRixJQUFJO1FBQ25ELElBQUlJLFFBQVFFLFlBQVksRUFBRTtZQUN4QkEsZUFBZUksSUFBQUEscUJBQU8sRUFBQ04sUUFBUUUsWUFBWSxFQUFFO1FBQy9DLE9BQU87WUFDTEEsZUFBZUUsU0FBU0csUUFBUTtRQUNsQztRQUNBLElBQUlQLFFBQVFHLFVBQVUsRUFBRTtZQUN0QkEsYUFBYUcsSUFBQUEscUJBQU8sRUFBQ04sUUFBUUcsVUFBVSxFQUFFO1FBQzNDLE9BQU87WUFDTEEsYUFBYUMsU0FBU0ksTUFBTTtRQUM5QjtRQUVBLDRDQUE0QztRQUM1QyxnREFBZ0Q7UUFDaEQsNERBQTREO1FBQzVELHlCQUF5QjtRQUN6QixJQUFJTixpQkFBaUJDLFlBQVk7WUFDL0JBLGFBQWEsQ0FBQyxHQUFHLEVBQUVELGFBQWEsQ0FBQztRQUNuQztRQUVBTCxXQUFXRyxPQUFPLEdBQUcsQ0FBQztRQUV0QixNQUFNUyxhQUNKQyxJQUFBQSw4QkFBYSxFQUFDWCxRQUFRWSxTQUFTLENBQUMsQ0FBQ0MsUUFBVUMsSUFBQUEsdUJBQWdCLEVBQUNELFVBQVVBLE1BQU1FLElBQUksS0FBSyxRQUNyRixDQUFDO1FBRUgsTUFBTUMsU0FBU0MsSUFBQUEsMkNBQW1CLEVBQUN6QixTQUFTTztRQUU1QyxNQUFNbUIsYUFBK0IsQ0FBQztRQUV0QyxNQUFNQyxtQkFBbUI7ZUFBSW5CO1NBQU87UUFFcEMsSUFBSSxDQUFDVSxZQUFZO1lBQ2ZRLFdBQVdFLEVBQUUsR0FBRztnQkFBRUMsTUFBTUw7WUFBTztZQUMvQkcsaUJBQWlCRyxJQUFJLENBQUM7Z0JBQ3BCUCxNQUFNO2dCQUNOTSxNQUFNN0IsUUFBUStCLEVBQUUsQ0FBQ0MsYUFBYTtZQUNoQztRQUNGO1FBRUEsTUFBTUMsMEJBQTBCQyxRQUFReEIsVUFBVXlCO1FBRWxEN0IsV0FBV0csT0FBTyxDQUFDb0IsSUFBSSxHQUFHTyxJQUFBQSx3QkFBZSxFQUFDO1lBQ3hDYixNQUFNWjtZQUNOZTtZQUNBbEI7WUFDQTZCLGVBQWVKO1lBQ2ZLLFlBQVkzQjtZQUNaWDtRQUNGO1FBRUFNLFdBQVdHLE9BQU8sQ0FBQzhCLGFBQWEsR0FBR0MsSUFBQUEsK0JBQXNCLEVBQUM1QixZQUFZTixXQUFXRyxPQUFPLENBQUNvQixJQUFJO1FBRTdGdkIsV0FBV0csT0FBTyxDQUFDZ0MsY0FBYyxHQUFHQyxJQUFBQSw0QkFBbUIsRUFBQztZQUN0RG5CLE1BQU1aO1lBQ05ILFFBQVFtQjtZQUNSVyxZQUFZM0I7WUFDWlg7UUFDRjtRQUVBLElBQUlPLE9BQU9vQyxJQUFJLElBQUksQ0FBQ3BDLE9BQU9vQyxJQUFJLENBQUNDLG9CQUFvQixFQUFFO1lBQ3BEcEMsT0FBT3NCLElBQUksQ0FBQztnQkFDVlAsTUFBTTtnQkFDTnNCLE9BQU87Z0JBQ1BDLFVBQVU7Z0JBQ1ZqQixNQUFNO1lBQ1I7UUFDRjtRQUVBLE1BQU1rQiwwQkFBMEJDLElBQUFBLCtCQUFzQixFQUNwRGhELFNBQ0FXLGNBQ0FILFFBQ0FHO1FBRUYsSUFBSW9DLHlCQUF5QjtZQUMzQnpDLFdBQVdHLE9BQU8sQ0FBQ3dDLGlCQUFpQixHQUFHLElBQUlDLHVCQUFjLENBQUNIO1FBQzVEO1FBRUEsTUFBTUksMEJBQTBCSCxJQUFBQSwrQkFBc0IsRUFDcERoRCxTQUNBLENBQUMsRUFBRVcsYUFBYSxNQUFNLENBQUMsRUFDdkJILE9BQU80QyxNQUFNLENBQUMsQ0FBQy9CLFFBQVUsQ0FBRUMsQ0FBQUEsSUFBQUEsdUJBQWdCLEVBQUNELFVBQVVBLE1BQU1FLElBQUksS0FBSyxJQUFHLElBQ3hFLENBQUMsRUFBRVosYUFBYSxNQUFNLENBQUMsRUFDdkI7UUFFRixJQUFJd0MseUJBQXlCO1lBQzNCN0MsV0FBV0csT0FBTyxDQUFDMEMsdUJBQXVCLEdBQUcsSUFBSUQsdUJBQWMsQ0FBQ0M7UUFDbEU7UUFFQW5ELFFBQVFxRCxLQUFLLENBQUM3QyxNQUFNLENBQUNHLGFBQWEsR0FBRztZQUNuQzJDLE1BQU07Z0JBQ0oxQixJQUFJO29CQUFFQyxNQUFNLElBQUlxQix1QkFBYyxDQUFDMUI7Z0JBQVE7Z0JBQ3ZDK0IsT0FBTztvQkFBRTFCLE1BQU0yQix1QkFBYztnQkFBQztnQkFDOUIsR0FBSXhELFFBQVFPLE1BQU0sQ0FBQ2tELFlBQVksR0FDM0I7b0JBQ0VDLGdCQUFnQjt3QkFBRTdCLE1BQU03QixRQUFRMkQsS0FBSyxDQUFDQyx1QkFBdUI7b0JBQUM7b0JBQzlEQyxRQUFRO3dCQUFFaEMsTUFBTTdCLFFBQVEyRCxLQUFLLENBQUNHLGVBQWU7b0JBQUM7Z0JBQ2hELElBQ0EsQ0FBQyxDQUFDO1lBQ1I7WUFDQUMsU0FBU0MsSUFBQUEsaUJBQWdCLEVBQUMxRDtZQUMxQnVCLE1BQU12QixXQUFXRyxPQUFPLENBQUNvQixJQUFJO1FBQy9CO1FBRUE3QixRQUFRcUQsS0FBSyxDQUFDN0MsTUFBTSxDQUFDSSxXQUFXLEdBQUc7WUFDakMwQyxNQUFNO2dCQUNKQyxPQUFPO29CQUFFMUIsTUFBTTJCLHVCQUFjO2dCQUFDO2dCQUM5QlMsT0FBTztvQkFBRXBDLE1BQU12QixXQUFXRyxPQUFPLENBQUNnQyxjQUFjO2dCQUFDO2dCQUNqRCxHQUFJekMsUUFBUU8sTUFBTSxDQUFDa0QsWUFBWSxHQUMzQjtvQkFDRUMsZ0JBQWdCO3dCQUFFN0IsTUFBTTdCLFFBQVEyRCxLQUFLLENBQUNDLHVCQUF1QjtvQkFBQztvQkFDOURDLFFBQVE7d0JBQUVoQyxNQUFNN0IsUUFBUTJELEtBQUssQ0FBQ0csZUFBZTtvQkFBQztnQkFDaEQsSUFDQSxDQUFDLENBQUM7Z0JBQ05JLE9BQU87b0JBQUVyQyxNQUFNc0MsbUJBQVU7Z0JBQUM7Z0JBQzFCQyxNQUFNO29CQUFFdkMsTUFBTXNDLG1CQUFVO2dCQUFDO2dCQUN6QkUsTUFBTTtvQkFBRXhDLE1BQU15QyxzQkFBYTtnQkFBQztZQUM5QjtZQUNBUCxTQUFTUSxJQUFBQSxhQUFZLEVBQUNqRTtZQUN0QnVCLE1BQU1XLElBQUFBLCtCQUFzQixFQUFDNUIsWUFBWU4sV0FBV0csT0FBTyxDQUFDb0IsSUFBSTtRQUNsRTtRQUVBN0IsUUFBUXFELEtBQUssQ0FBQzdDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRUcsYUFBYSxDQUFDLENBQUMsR0FBRztZQUNqRDJDLE1BQU07Z0JBQ0oxQixJQUFJO29CQUFFQyxNQUFNLElBQUlxQix1QkFBYyxDQUFDMUI7Z0JBQVE7WUFDekM7WUFDQXVDLFNBQVNTLElBQUFBLDRCQUFpQjtZQUMxQjNDLE1BQU00QyxJQUFBQSxrQ0FBZSxFQUFDO2dCQUNwQkMsUUFBUW5FO2dCQUNSb0UsT0FBTztnQkFDUDlDLE1BQU07Z0JBQ04rQyxZQUFZO1lBQ2Q7UUFDRjtRQUVBNUUsUUFBUTZFLFFBQVEsQ0FBQ3JFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRUcsYUFBYSxDQUFDLENBQUMsR0FBRztZQUNqRDJDLE1BQU07Z0JBQ0osR0FBSVAsMEJBQ0E7b0JBQUUrQixNQUFNO3dCQUFFakQsTUFBTXZCLFdBQVdHLE9BQU8sQ0FBQ3dDLGlCQUFpQjtvQkFBQztnQkFBRSxJQUN2RCxDQUFDLENBQUM7Z0JBQ05NLE9BQU87b0JBQUUxQixNQUFNMkIsdUJBQWM7Z0JBQUM7Z0JBQzlCLEdBQUl4RCxRQUFRTyxNQUFNLENBQUNrRCxZQUFZLEdBQzNCO29CQUNFSSxRQUFRO3dCQUFFaEMsTUFBTTdCLFFBQVEyRCxLQUFLLENBQUNHLGVBQWU7b0JBQUM7Z0JBQ2hELElBQ0EsQ0FBQyxDQUFDO1lBQ1I7WUFDQUMsU0FBU2dCLElBQUFBLGVBQWMsRUFBQ3pFO1lBQ3hCdUIsTUFBTXZCLFdBQVdHLE9BQU8sQ0FBQ29CLElBQUk7UUFDL0I7UUFFQTdCLFFBQVE2RSxRQUFRLENBQUNyRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUVHLGFBQWEsQ0FBQyxDQUFDLEdBQUc7WUFDakQyQyxNQUFNO2dCQUNKMUIsSUFBSTtvQkFBRUMsTUFBTSxJQUFJcUIsdUJBQWMsQ0FBQzFCO2dCQUFRO2dCQUN2Q3dELFVBQVU7b0JBQUVuRCxNQUFNMkIsdUJBQWM7Z0JBQUM7Z0JBQ2pDLEdBQUlMLDBCQUNBO29CQUFFMkIsTUFBTTt3QkFBRWpELE1BQU12QixXQUFXRyxPQUFPLENBQUMwQyx1QkFBdUI7b0JBQUM7Z0JBQUUsSUFDN0QsQ0FBQyxDQUFDO2dCQUNOSSxPQUFPO29CQUFFMUIsTUFBTTJCLHVCQUFjO2dCQUFDO2dCQUM5QixHQUFJeEQsUUFBUU8sTUFBTSxDQUFDa0QsWUFBWSxHQUMzQjtvQkFDRUksUUFBUTt3QkFBRWhDLE1BQU03QixRQUFRMkQsS0FBSyxDQUFDRyxlQUFlO29CQUFDO2dCQUNoRCxJQUNBLENBQUMsQ0FBQztZQUNSO1lBQ0FDLFNBQVNrQixJQUFBQSxlQUFjLEVBQUMzRTtZQUN4QnVCLE1BQU12QixXQUFXRyxPQUFPLENBQUNvQixJQUFJO1FBQy9CO1FBRUE3QixRQUFRNkUsUUFBUSxDQUFDckUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFRyxhQUFhLENBQUMsQ0FBQyxHQUFHO1lBQ2pEMkMsTUFBTTtnQkFDSjFCLElBQUk7b0JBQUVDLE1BQU0sSUFBSXFCLHVCQUFjLENBQUMxQjtnQkFBUTtZQUN6QztZQUNBdUMsU0FBU21C