{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n !isNil(subPopulate.populate) &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(key, schema?.attributes);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(searchQuery)) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","ValidationError","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","Error","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","message","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":";;;;;;;;AAwCA,MAAM,EAAEA,YAAY,EAAEC,gBAAgB,EAAEC,sBAAsB,EAAE,GAAGC,SAAAA;AAUnE,MAAMC,aAAAA,GAAgB,CAACC,KAAAA,GAAqDC,UAAAA,CAAEF,aAAa,CAACC,KAAAA,CAAAA;AAE5F,SAASE,eAAeC,OAAgB,EAAA;IACtC,MAAMC,IAAAA,GAAOC,MAAAA,CAAOD,IAAI,CAACD,OAAAA,CAAAA;IAEzB,IAAIC,IAAAA,CAAKE,MAAM,KAAK,CAAA,EAAG;QACrB,OAAO,IAAA;AACT,IAAA;IAEA,OAAOF,IAAAA,CAAKG,KAAK,CAAC,CAACC,GAAAA,GAAAA;QACjB,MAAMR,KAAAA,GAAQG,OAAO,CAACK,GAAAA,CAAI;QAE1B,IAAI,OAAOR,UAAU,QAAA,EAAU;AAC7B,YAAA,OAAOA,KAAAA,CAAMS,IAAI,EAAA,CAAGH,MAAM,KAAK,CAAA;AACjC,QAAA;AAEA,QAAA,IAAIP,cAAcC,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOE,cAAAA,CAAeF,KAAAA,CAAAA;AACxB,QAAA;QAEA,OAAO,IAAA;AACT,IAAA,CAAA,CAAA;AACF;AAEA,oGACA,SAASU,gBAAAA,CAAiBC,OAAqB,EAAA;IAC7C,IAAIC,KAAAA,CAAMC,OAAO,CAACF,OAAAA,CAAAA,EAAU;AAC1B,QAAA,MAAMG,WAAWH,OAAAA,CAAQI,MAAM,CAAC,CAACZ,OAAAA,GAAY,CAACD,cAAAA,CAAeC,OAAAA,CAAAA,CAAAA;AAE7D,QAAA,OAAOW,QAAAA,CAASR,MAAM,GAAG,CAAA,GAAIQ,QAAAA,GAAWE,SAAAA;AAC1C,IAAA;IAEA,OAAOd,cAAAA,CAAeS,WAAWK,SAAAA,GAAYL,OAAAA;AAC/C;AA6EA,MAAMM,iBAAAA,SAA0BC,eAAAA,CAAAA;IAC9B,WAAA,EAAc;AACZ,QAAA,KAAK,CAAC,2DAAA,CAAA;AACR,IAAA;AACF;AAEA,MAAMC,gBAAAA,SAAyBD,eAAAA,CAAAA;IAC7B,WAAA,EAAc;AACZ,QAAA,KAAK,CACH,2GAAA,CAAA;AAEJ,IAAA;AACF;AAEA,SAASE,cAAcC,KAAa,EAAA;IAClC,IAAI,CAACC,QAAAA,CAASD,KAAAA,CAAAA,IAAU,CAAC;AAAC,QAAA,KAAA;AAAO,QAAA;AAAO,KAAA,CAACE,QAAQ,CAACF,KAAAA,CAAMG,iBAAiB,EAAA,CAAA,EAAK;AAC5E,QAAA,MAAM,IAAIP,iBAAAA,EAAAA;AACZ,IAAA;AACF;AAEA,MAAMQ,0BAA0B,CAACC,UAAAA,GAAAA;AAC/B,IAAA,OAAOC,SAAAA,CAAU;QAAEC,IAAAA,EAAM,SAAA;QAAW5B,KAAAA,EAAO0B;AAAW,KAAA,CAAA;AACxD,CAAA;AAEA,MAAMG,6BAA6B,CAACC,QAAAA,GAAAA;IAClC,OAAOA,QAAAA;AACT,CAAA;AAEA,MAAMC,gBAAgB,CAAC/B,KAAAA,GACrBa,QAAQb,KAAAA,CAAAA,IAAUA,KAAAA,CAAMO,KAAK,CAACe,QAAAA,CAAAA;AAMhC,MAAMU,iBAAAA,GAAoB,CAAC,EAAEC,QAAQ,EAAsB,GAAA;AACzD;;MAGA,MAAMC,yBAAyB,CAACC,SAAAA,GAAAA;QAC9B,IAAI,OAAOA,cAAc,QAAA,EAAU;AACjC,YAAA,OAAOC,2BAAAA,CAA4BD,SAAAA,CAAAA;AACrC,QAAA;AAEA,QAAA,IAAIJ,cAAcI,SAAAA,CAAAA,EAAY;AAC5B,YAAA,OAAOA,SAAAA,CAAUE,OAAO,CAAC,CAACC,YAAsBF,2BAAAA,CAA4BE,SAAAA,CAAAA,CAAAA;AAC9E,QAAA;QAEA,IAAI1B,KAAAA,CAAMC,OAAO,CAACsB,SAAAA,CAAAA,EAAY;AAC5B,YAAA,OAAOA,SAAAA,CAAUI,GAAG,CAAC,CAACD,YAAcE,2BAAAA,CAA4BF,SAAAA,CAAAA,CAAAA;AAClE,QAAA;AAEA,QAAA,IAAIvC,cAAcoC,SAAAA,CAAAA,EAAY;AAC5B,YAAA,OAAOK,2BAAAA,CAA4BL,SAAAA,CAAAA;AACrC,QAAA;AAEA,QAAA,MAAM,IAAIhB,gBAAAA,EAAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAMiB,8BAA8B,CAACD,SAAAA,GAAAA;AACnC,QAAA,OAAOM,0BAA0BN,SAAAA,CAAAA,CAAWI,GAAG,CAAC,CAACG,UAC/CC,2BAAAA,CAA4BD,OAAAA,CAAAA,CAAAA;AAEhC,IAAA,CAAA;AAEA,IAAA,MAAMC,8BAA8B,CAACR,SAAAA,GAAAA;QACnC,MAAMS,OAAAA,GAAUT,UAAU1B,IAAI,EAAA;AAE9B,QAAA,IAAI,CAACmC,OAAAA,EAAS;AACZ,YAAA,OAAO,EAAC;AACV,QAAA;QAEA,IAAI,CAACtB,SAASsB,OAAAA,CAAAA,EAAU;AACtB,YAAA,MAAM,IAAIC,KAAAA,CAAM,oBAAA,CAAA;AAClB,QAAA;;QAGA,MAAM,CAACC,UAAUzB,KAAAA,GAAQ,KAAK,CAAC,GAAGuB,OAAAA,CAAQG,KAAK,CAAC,GAAA,CAAA;QAChD,MAAMC,KAAAA,GAAQF,SAASrC,IAAI,EAAA;QAE3B,IAAIuC,KAAAA,CAAM1C,MAAM,KAAK,CAAA,EAAG;AACtB,YAAA,MAAM,IAAIuC,KAAAA,CAAM,uBAAA,CAAA;AAClB,QAAA;AAEAzB,QAAAA,aAAAA,CAAcC,MAAMZ,IAAI,EAAA,CAAA;;AAIxB,QAAA,OAAOR,WAAEgD,GAAG,CAAC,EAAC,EAAGD,KAAAA,EAAO3B,MAAMZ,IAAI,EAAA,CAAA;AACpC,IAAA,CAAA;AAEA,IAAA,MAAM+B,8BAA8B,CAACL,SAAAA,GAAAA;AACnC,QAAA,MAAMe,kBAA2B,EAAC;AAClC,QAAA,KAAK,MAAMF,KAAAA,IAAS3C,MAAAA,CAAOD,IAAI,CAAC+B,SAAAA,CAAAA,CAAY;YAC1C,MAAMd,KAAAA,GAAQc,SAAS,CAACa,KAAAA,CAAM;;AAG9B,YAAA,IAAIjD,cAAcsB,KAAAA,CAAAA,EAAQ;AACxB,gBAAA,MAAM8B,SAASX,2BAAAA,CAA4BnB,KAAAA,CAAAA;gBAE3C,IAAI,CAACnB,eAAeiD,MAAAA,CAAAA,EAAS;oBAC3BD,eAAe,CAACF,MAAM,GAAGG,MAAAA;AAC3B,gBAAA;YACF,CAAA,MAAO,IAAI,OAAO9B,KAAAA,KAAU,QAAA,EAAU;gBACpC,MAAM+B,YAAAA,GAAe/B,MAAMZ,IAAI,EAAA;gBAE/B,IAAI2C,YAAAA,CAAa9C,MAAM,GAAG,CAAA,EAAG;oBAC3Bc,aAAAA,CAAcgC,YAAAA,CAAAA;oBACdF,eAAe,CAACF,MAAM,GAAGI,YAAAA;AAC3B,gBAAA;YACF,CAAA,MAAO;AACL,gBAAA,MAAMP,KAAAA,CAAM,CAAC,gDAAgD,EAAE,OAAOxB,KAAAA,CAAAA,CAAO,CAAA;AAC/E,YAAA;AACF,QAAA;QAEA,OAAO6B,eAAAA;AACT,IAAA,CAAA;IAEA,MAAMG,gBAAAA,GAAmB,CAACC,KAAAA,EAAcC,SAAAA,GAAAA;QACtC,IAAI,CAACC,QAAQD,SAAAA,CAAAA,EAAY;AACvB,YAAA;AACF,QAAA;QAEA,MAAM5C,OAAAA,GAAUD,iBAAiBwB,sBAAAA,CAAuBqB,SAAAA,CAAAA,CAAAA;AAExD,QAAA,IAAI5C,YAAYK,SAAAA,EAAW;AACzBsC,YAAAA,KAAAA,CAAM3C,OAAO,GAAGA,OAAAA;AAClB,QAAA;AACF,IAAA,CAAA;AAEA;;MAGA,MAAM8C,0BAA0B,CAACC,UAAAA,GAAAA;AAC/B,QAAA,MAAMC,iBAAiBC,QAAAA,CAASF,UAAAA,CAAAA;AAEhC,QAAA,IAAI,CAACzD,UAAAA,CAAE4D,SAAS,CAACF,cAAAA,CAAAA,IAAmBA,iBAAiB,CAAA,EAAG;AACtD,YAAA,MAAM,IAAIzC,eAAAA,CACR,CAAC,wDAAwD,EAAEyC,cAAAA,CAAAA,CAAgB,CAAA;AAE/E,QAAA;QAEA,OAAOA,cAAAA;AACT,IAAA,CAAA;AAEA;;MAGA,MAAMG,0BAA0B,CAACC,UAAAA,GAAAA;AAC/B,QAAA,MAAMC,iBAAiBJ,QAAAA,CAASG,UAAAA,CAAAA;QAEhC,IAAI,CAAC9D,WAAE4D,SAAS,CAACG,mBAAoBA,cAAAA,KAAmB,EAAC,IAAKA,cAAAA,GAAiB,CAAA,EAAI;AACjF,YAAA,MAAM,IAAI9C,eAAAA,CACR,CAAC,wDAAwD,EAAE8C,cAAAA,CAAAA,CAAgB,CAAA;AAE/E,QAAA;QAEA,IAAIA,cAAAA,KAAmB,EAAC,EAAG;YACzB,OAAOhD,SAAAA;AACT,QAAA;QAEA,OAAOgD,cAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMC,yBAAyB,CAACC,IAAAA,GAAAA;AAC9B,QAAA,MAAMC,UAAUP,QAAAA,CAASM,IAAAA,CAAAA;AAEzB,QAAA,IAAI,CAACL,SAAAA,CAAUM,OAAAA,CAAAA,IAAYA,OAAAA,IAAW,CAAA,EAAG;AACvC,YAAA,MAAM,IAAIC,eAAAA,CACR,CAAC,6DAA6D,EAAEF,IAAAA,CAAAA,CAAM,CAAA;AAE1E,QAAA;QAEA,OAAOC,OAAAA;AACT,IAAA,CAAA;;IAGA,MAAME,0BAAAA,GAA6B,CAACC,QAAAA,EAAmBC,KAAAA,GAAAA;AACrD,QAAA,MAAMC,cAAcZ,QAAAA,CAASU,QAAAA,CAAAA;AAE7B,QAAA,IAAI,CAACT,SAAAA,CAAUW,WAAAA,CAAAA,IAAgBA,WAAAA,IAAe,CAAA,EAAG;AAC/C,YAAA,MAAM,IAAIJ,eAAAA,CACR,CAAC,iEAAiE,EAAEE,QAAAA,CAAAA,CAAU,CAAA;AAElF,QAAA;QAEA,OAAOE,WAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMC,wBAAAA,GAA2B,CAC/BP,IAAAA,EACAI,QAAAA,EACAI,KAAAA,EACAC,KAAAA,GAAAA;AAEA,QAAA,MAAMC,gBAAAA,GAAmB,CAACC,KAAAA,CAAMX,IAAAA,CAAAA,IAAS,CAACW,KAAAA,CAAMP,QAAAA,CAAAA;AAChD,QAAA,MAAMQ,kBAAAA,GAAqB,CAACD,KAAAA,CAAMH,KAAAA,CAAAA,IAAU,CAACG,KAAAA,CAAMF,KAAAA,CAAAA;AAEnD,QAAA,IAAIC,oBAAoBE,kBAAAA,EAAoB;AAC1C,YAAA,MAAM,IAAIV,eAAAA,CACR,uGAAA,CAAA;AAEJ,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMW,oBAAAA,SAA6BlC,KAAAA,CAAAA;QACjC,WAAA,EAAc;YACZ,KAAK,EAAA;YACL,IAAI,CAACmC,OAAO,GACV,uFAAA;AACJ,QAAA;AACF;;AAGA,IAAA,MAAMC,0BAAAA,GAA6B,CACjCC,QAAAA,EACAC,MAAAA,EACAC,QAAQ,CAAC,GAAA;QAET,IAAIA,KAAAA,KAAU,CAAA,IAAKF,QAAAA,KAAa,GAAA,EAAK;YACnC,OAAO,IAAA;AACT,QAAA;QAEA,IAAI,OAAOA,aAAa,QAAA,EAAU;YAChC,OAAOA,QAAAA,CAASnC,KAAK,CAAC,GAAA,CAAA,CAAKR,GAAG,CAAC,CAACvC,KAAAA,GAAUC,UAAAA,CAAEQ,IAAI,CAACT,KAAAA,CAAAA,CAAAA;AACnD,QAAA;QAEA,IAAIY,KAAAA,CAAMC,OAAO,CAACqE,QAAAA,CAAAA,EAAW;;AAE3B,YAAA,OAAOjF,WAAEoF,IAAI,CACXH,QAAAA,CAAS7C,OAAO,CAAC,CAACrC,KAAAA,GAAAA;gBAChB,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,oBAAA,MAAM,IAAI+E,oBAAAA,EAAAA;AACZ,gBAAA;gBAEA,OAAO/E,KAAAA,CAAM+C,KAAK,CAAC,GAAA,CAAA,CAAKR,GAAG,CAAC,CAACvC,KAAAA,GAAUC,UAAAA,CAAEQ,IAAI,CAACT,KAAAA,CAAAA,CAAAA;AAChD,YAAA,CAAA,CAAA,CAAA;AAEJ,QAAA;QAEA,IAAIC,UAAAA,CAAEF,aAAa,CAACmF,QAAAA,CAAAA,EAAW;AAC7B,YAAA,OAAOI,sBAAsBJ,QAAAA,EAAUC,MAAAA,CAAAA;AACzC,QAAA;AAEA,QAAA,MAAM,IAAIJ,oBAAAA,EAAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAMQ,6BAA6B,CACjCL,QAAAA,GAAAA;QAEA,OAAO,OAAOA,aAAa,QAAA,IAAY,IAAA,IAAQA,YAAY,CAACL,KAAAA,CAAMK,SAASM,EAAE,CAAA;AAC/E,IAAA,CAAA;AAEA,IAAA,MAAMC,kBAAkB,CACtBP,QAAAA,GAAAA;QAEA,OACE,OAAOA,aAAa,QAAA,IAAY,OAAA,IAAWA,YAAY,OAAOA,QAAAA,CAASQ,KAAK,KAAK,SAAA;AAErF,IAAA,CAAA;IAEA,MAAMJ,qBAAAA,GAAwB,CAACJ,QAAAA,EAAoCC,MAAAA,GAAAA;AACjE,QAAA,IAAI,CAACA,MAAAA,EAAQ;AACX,YAAA,OAAO,EAAC;AACV,QAAA;QAEA,MAAM,EAAEQ,UAAU,EAAE,GAAGR,MAAAA;QACvB,OAAO9E,MAAAA,CAAOuF,OAAO,CAACV,QAAAA,CAAAA,CAAUW,MAAM,CAAC,CAACC,GAAAA,EAAK,CAACtF,GAAAA,EAAKuF,WAAAA,CAAY,GAAA;;YAE7D,IAAI9F,UAAAA,CAAEqB,QAAQ,CAACyE,WAAAA,CAAAA,EAAc;gBAC3B,IAAI;AACF,oBAAA,MAAMC,uBAAuBrE,SAAAA,CAAU;wBAAEC,IAAAA,EAAM,SAAA;wBAAW5B,KAAAA,EAAO+F;AAAY,qBAAA,CAAA;;AAE7E,oBAAA,OAAOC,oBAAAA,GAAuB;AAAE,wBAAA,GAAGF,GAAG;AAAE,wBAAA,CAACtF,MAAM;qBAAK,GAAIsF,GAAAA;AAC1D,gBAAA,CAAA,CAAE,OAAM;;AAER,gBAAA;AACF,YAAA;YAEA,IAAI7F,UAAAA,CAAEgG,SAAS,CAACF,WAAAA,CAAAA,EAAc;;AAE5B,gBAAA,OAAOA,gBAAgB,IAAA,GAAO;AAAE,oBAAA,GAAGD,GAAG;AAAE,oBAAA,CAACtF,MAAM;iBAAK,GAAIsF,GAAAA;AAC1D,YAAA;YAEA,MAAMI,SAAAA,GAAYP,UAAU,CAACnF,GAAAA,CAAI;AAEjC,YAAA,IAAI,CAAC0F,SAAAA,EAAW;gBACd,OAAOJ,GAAAA;AACT,YAAA;;YAGA,MAAMK,8BAAAA,GACJC,sBAAAA,CAAuBF,SAAAA,CAAAA,IAAcG,4BAAAA,CAA6BH,SAAAA,CAAAA;AAEpE,YAAA,IAAIC,8BAAAA,EAAgC;gBAClC,MAAMG,oBAAAA,GAAuBjG,OAAOD,IAAI,CAAC2F,aAAaQ,IAAI,CACxD,CAAC/F,GAAAA,GAAQ,CAAC;AAAC,wBAAA,UAAA;AAAY,wBAAA,IAAA;AAAM,wBAAA;AAAQ,qBAAA,CAACe,QAAQ,CAACf,GAAAA,CAAAA,CAAAA;AAGjD,gBAAA,IAAI8F,oBAAAA,EAAsB;oBACxB,MAAM,IAAIpF,gBACR,CAAC,4BAA4B,EAAEiE,MAAAA,CAAOqB,IAAI,EAAEC,YAAAA,CAAa,CAAC,EAAEjG,IAAI,EAAE,EAAE2E,OAAOuB,GAAG,CAAC,mDAAmD,EAAEC,IAAAA,CAAKC,SAAS,CAACb,WAAAA,CAAAA,CAAAA,CAAc,CAAA;AAErK,gBAAA;AAEA;;;;YAKA,IACE,UAAA,IAAcA,WAAAA,IACd,CAAClB,KAAAA,CAAMkB,WAAAA,CAAYb,QAAQ,CAAA,IAC3Ba,WAAAA,CAAYb,QAAQ,KAAK,GAAA,EACzB;AACA,oBAAA,MAAM,IAAIhE,eAAAA,CACR,CAAC,+FAA+F,CAAC,GAC/F,CAAC,0GAA0G,CAAC,GAC5G,CAAC,qEAAqE,CAAC,CAAA;AAE7E,gBAAA;;AAGA,gBAAA,MAAM2F,iBAAiB,EAAC;;AAGxB,gBAAA,IAAI,UAAA,IAAcd,WAAAA,IAAeA,WAAAA,CAAYb,QAAQ,KAAK,GAAA,EAAK;oBAC7D7E,MAAAA,CAAOyG,MAAM,CAACD,cAAAA,EAAgB;wBAAE3B,QAAAA,EAAU;AAAK,qBAAA,CAAA;AACjD,gBAAA;;AAGA,gBAAA,IAAIK,2BAA2BQ,WAAAA,CAAAA,EAAc;;;oBAG3C1F,MAAAA,CAAOyG,MAAM,CAACD,cAAAA,EAAgB;AAC5BrB,wBAAAA,EAAAA,EAAInF,MAAAA,CAAOuF,OAAO,CAACG,WAAAA,CAAYP,EAAE,CAAA,CAAEK,MAAM,CACvC,CAACC,GAAAA,EAAK,CAAClE,IAAAA,EAAMmF,eAAAA,CAAgB,IAAM;AACjC,gCAAA,GAAGjB,GAAG;AACN,gCAAA,CAAClE,IAAAA,GAAOoF,qBAAAA,CAAsBD,eAAAA,EAAiB9E,QAAAA,CAASL,IAAAA,CAAAA;AAC1D,6BAAA,GACA,EAAC;AAEL,qBAAA,CAAA;AACF,gBAAA;;AAGA,gBAAA,IAAI6D,gBAAgBM,WAAAA,CAAAA,EAAc;oBAChC1F,MAAAA,CAAOyG,MAAM,CAACD,cAAAA,EAAgB;AAAEnB,wBAAAA,KAAAA,EAAOK,YAAYL;AAAM,qBAAA,CAAA;AAC3D,gBAAA;gBAEA,OAAO;AAAE,oBAAA,GAAGI,GAAG;AAAE,oBAAA,CAACtF,MAAMqG;AAAe,iBAAA;AACzC,YAAA;;YAGA,IAAI,CAACV,8BAAAA,IAAkCZ,0BAAAA,CAA2BQ,WAAAA,CAAAA,EAAc;AAC9E,gBAAA,MAAM,IAAI7E,eAAAA,CACR,CAAC,8CAA8C,EAAEV,GAAAA,CAAI,MAAM,EAAE2E,MAAAA,CAAOuB,GAAG,CAAC,CAAC,CAAC,CAAA;AAE9E,YAAA;;;;YAKA,IAAIO,eAAAA;YAEJ,IAAIf,SAAAA,CAAUtE,IAAI,KAAK,UAAA,EAAY;AACjCqF,gBAAAA,eAAAA,GAAkBf,UAAUgB,MAAM;AACpC,YAAA,CAAA,MAAO,IAAIhB,SAAAA,CAAUtE,IAAI,KAAK,WAAA,EAAa;AACzCqF,gBAAAA,eAAAA,GAAkBf,UAAUiB,SAAS;AACvC,YAAA,CAAA,MAAO,IAAIjB,SAAAA,CAAUtE,IAAI,KAAK,OAAA,EAAS;gBACrCqF,eAAAA,GAAkB,qBAAA;YACpB,CAAA,MAAO;gBACL,OAAOnB,GAAAA;AACT,YAAA;AAEA,YAAA,MAAMsB,eAAenF,QAAAA,CAASgF,eAAAA,CAAAA;;AAG9B,YAAA,IAAI,CAACG,YAAAA,EAAc;gBACjB,OAAOtB,GAAAA;AACT,YAAA;YAEA,MAAMuB,cAAAA,GAAiBL,sBAAsBjB,WAAAA,EAAaqB,YAAAA,CAAAA;AAE1D,YAAA,IAAI,CAACC,cAAAA,EAAgB;gBACnB,OAAOvB,GAAAA;AACT,YAAA;YAEA,OAAO;AACL,gBAAA,GAAGA,GAAG;AACN,gBAAA,CAACtF,MAAM6G;AACT,aAAA;AACF,QAAA,CAAA,EAAG,EAAC,CAAA;AACN,IAAA,CAAA;IAEA,MAAML,qBAAAA,GAAwB,CAACjB,WAAAA,EAA6CZ,MAAAA,GAAAA;QAC1E,IAAIlF,UAAAA,CAAEqB,QAAQ,CAACyE,WAAAA,CAAAA,EAAc;AAC3B,YAAA,OAAOpE,SAAAA,CAAU;gBAAEC,IAAAA,EAAM,SAAA;gBAAW5B,KAAAA,EAAO+F,WAAAA;gBAAauB,SAAAA,EAAW;AAAK,aAAA,CAAA;AAC1E,QAAA;QAEA,IAAIrH,UAAAA,CAAEgG,SAAS,CAACF,WAAAA,CAAAA,EAAc;YAC5B,OAAOA,WAAAA;AACT,QAAA;QAEA,IAAI,CAAChG,cAAcgG,WAAAA,CAAAA,EAAc;AAC/B,YAAA,MAAM,IAAI7E,eAAAA,CAAgB,CAAC,kDAAkD,CAAC,CAAA;AAChF,QAAA;QAEA,MAAM,EAAEqG,IAAI,EAAEC,OAAO,EAAEC,MAAM,EAAEvC,QAAQ,EAAEQ,KAAK,EAAE5D,QAAQ,EAAEoC,IAAI,EAAEI,QAAQ,EAAEI,KAAK,EAAEC,KAAK,EAAE,GACtFoB,WAAAA;AAEF,QAAA,MAAMzC,QAAe,EAAC;AAEtBD,QAAAA,gBAAAA,CAAiBC,KAAAA,EAAOiE,IAAAA,CAAAA;AAExB,QAAA,IAAIC,OAAAA,EAAS;YACXlE,KAAAA,CAAMoE,KAAK,GAAGC,yBAAAA,CAA0BH,OAAAA,EAASrC,MAAAA,CAAAA;AACnD,QAAA;AAEA,QAAA,IAAIsC,MAAAA,EAAQ;YACVnE,KAAAA,CAAMsE,MAAM,GAAGC,wBAAAA,CAAyBJ,MAAAA,EAAQtC,MAAAA,CAAAA;AAClD,QAAA;AAEA,QAAA,IAAID,QAAAA,EAAU;YACZ5B,KAAAA,CAAM4B,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAAA,EAAUC,MAAAA,CAAAA;AACxD,QAAA;AAEA,QAAA,IAAIO,KAAAA,EAAO;YACTpC,KAAAA,CAAMoC,KAAK,GAAGjE,uBAAAA,CAAwBiE,KAAAA,CAAAA;AACxC,QAAA;AAEA,QAAA,IAAI5D,QAAAA,EAAU;YACZwB,KAAAA,CAAMxB,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAAA,CAAAA;AAC9C,QAAA;QAEA2C,wBAAAA,CAAyBP,IAAAA,EAAMI,UAAUI,KAAAA,EAAOC,KAAAA,CAAAA;QAEhD,IAAI,CAACE,MAAMX,IAAAA,CAAAA,EAAO;YAChBZ,KAAAA,CAAMY,IAAI,GAAGD,sBAAAA,CAAuBC,IAAAA,CAAAA;AACtC,QAAA;QAEA,IAAI,CAACW,MAAMP,QAAAA,CAAAA,EAAW;YACpBhB,KAAAA,CAAMgB,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAUJ,CAAAA;AACxD,QAAA;QAEA,IAAI,CAACW,MAAMH,KAAAA,CAAAA,EAAQ;YACjBpB,KAAAA,CAAMwE,MAAM,GAAGrE,uBAAAA,CAAwBiB,KAAAA,CAAAA;AACzC,QAAA;QAEA,IAAI,CAACG,MAAMF,KAAAA,CAAAA,EAAQ;YACjBrB,KAAAA,CAAMqB,KAAK,GAAGb,uBAAAA,CAAwBa,KAAAA,CAAAA;AACxC,QAAA;QAEA,OAAOrB,KAAAA;AACT,IAAA,CAAA;;AAGA,IAAA,MAAMuE,wBAAAA,GAA2B,CAC/BJ,MAAAA,EACAtC,MAAAA,EACAC,QAAQ,CAAC,GAAA;QAET,IAAIA,KAAAA,KAAU,CAAA,IAAKqC,MAAAA,KAAW,GAAA,EAAK;YACjC,OAAOzG,SAAAA;AACT,QAAA;QAEA,IAAI,OAAOyG,WAAW,QAAA,EAAU;YAC9B,MAAMM,YAAAA,GAAeN,MAAAA,CAAO1E,KAAK,CAAC,GAAA,CAAA,CAAKR,GAAG,CAAC,CAACvC,KAAAA,GAAUC,UAAAA,CAAEQ,IAAI,CAACT,KAAAA,CAAAA,CAAAA;;YAG7D,IAAImF,MAAAA,EAAQ6C,cAAc,aAAA,EAAe;gBACvC,OAAO/H,UAAAA,CAAEoF,IAAI,CAAC;AAAC1F,oBAAAA,YAAAA;AAAcC,oBAAAA,gBAAAA;AAAqBmI,oBAAAA,GAAAA;AAAa,iBAAA,CAAA;AACjE,YAAA;YACA,OAAO9H,UAAAA,CAAEoF,IAAI,CAAC;AAAC1F,gBAAAA,YAAAA;AAAiBoI,gBAAAA,GAAAA;AAAa,aAAA,CAAA;AAC/C,QAAA;AAEA,QAAA,IAAIhG,cAAc0F,MAAAA,CAAAA,EAAS;;AAEzB,YAAA,MAAMM,eAAeN,MAAAA,CAClBpF,OAAO,CAAC,CAACrC,QAAU6H,wBAAAA,CAAyB7H,KAAAA,EAAOmF,MAAAA,EAAQC,KAAAA,GAAQ,IACnErE,MAAM,CAAC,CAACkH,CAAAA,GAAM,CAACpD,KAAAA,CAAMoD,CAAAA,CAAAA,CAAAA;;YAGxB,IAAI9C,MAAAA,EAAQ6C,cAAc,aAAA,EAAe;gBACvC,OAAO/H,UAAAA,CAAEoF,IAAI,CAAC;AAAC1F,oBAAAA,YAAAA;AAAcC,oBAAAA,gBAAAA;AAAqBmI,oBAAAA,GAAAA;AAAa,iBAAA,CAAA;AACjE,YAAA;YACA,OAAO9H,UAAAA,CAAEoF,IAAI,CAAC;AAAC1F,gBAAAA,YAAAA;AAAiBoI,gBAAAA,GAAAA;AAAa,aAAA,CAAA;AAC/C,QAAA;AAEA,QAAA,MAAM,IAAI7G,eAAAA,CAAgB,oEAAA,CAAA;AAC5B,IAAA,CAAA;IAEA,MAAMgH,sBAAAA,GAAyB,CAAC1H,GAAAA,EAAa2E,MAAAA,GAAAA;QAC3C,IAAI;AAACvF,YAAAA,gBAAAA;AAAkBD,YAAAA;SAAa,CAAC4B,QAAQ,CAACf,GAAAA,CAAAA,EAAM;YAClD,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAAC2E,MAAAA,EAAQ;YACX,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,OAAO9E,OAAOD,IAAI,CAAC+E,OAAOQ,UAAU,CAAA,CAAEpE,QAAQ,CAACf,GAAAA,CAAAA;AACjD,IAAA,CAAA;IAEA,MAAMmH,yBAAAA,GAA4B,CAACH,OAAAA,EAAwBrC,MAAAA,GAAAA;;;QAGzD,IAAI,CAACgD,SAASX,OAAAA,CAAAA,EAAU;AACtB,YAAA,MAAM,IAAItG,eAAAA,CAAgB,qDAAA,CAAA;AAC5B,QAAA;;AAGA,QAAA,MAAMkH,cAAcC,SAAAA,CAAUb,OAAAA,CAAAA;AAE9B,QAAA,OAAOc,0BAA0BF,WAAAA,EAAajD,MAAAA,CAAAA;AAChD,IAAA,CAAA;IAEA,MAAMmD,yBAAAA,GAA4B,CAACd,OAAAA,EAAwBrC,MAAAA,GAAAA;QACzD,IAAIvE,KAAAA,CAAMC,OAAO,CAAC2G,OAAAA,CAAAA,EAAU;AAC1B,YAAA,OACEA,OACE;AACCjF,aAAAA,GAAG,CAAC,CAACxB,MAAAA,GAAWuH,yBAAAA,CAA0BvH,MAAAA,EAAQoE,QACnD;AACCpE,aAAAA,MAAM,CAAC,CAACA,MAAAA,GAAW,CAAChB,aAAAA,CAAcgB,MAAAA,CAAAA,IAAW,CAACwH,OAAAA,CAAQxH,MAAAA,CAAAA,CAAAA;AAE7D,QAAA;QAEA,IAAI,CAAChB,cAAcyH,OAAAA,CAAAA,EAAU;YAC3B,OAAOA,OAAAA;AACT,QAAA;AAEA,QAAA,MAAMgB,iBAAiB,CAACC,QAAAA,GAAqB,OAAOjB,OAAO,CAACiB,QAAAA,CAAS;;QAGrE,KAAK,MAAM,CAACjI,GAAAA,EAAKR,KAAAA,CAAM,IAAIK,MAAAA,CAAOuF,OAAO,CAAC4B,OAAAA,CAAAA,CAAU;YAClD,MAAMtB,SAAAA,GAAYwC,GAAAA,CAAIlI,GAAAA,EAAK2E,MAAAA,EAAQQ,UAAAA,CAAAA;AACnC,YAAA,MAAMgD,QAAAA,GAAWC,UAAAA,CAAWpI,GAAAA,CAAAA,IAAQ0H,sBAAAA,CAAuB1H,GAAAA,EAAK2E,MAAAA,CAAAA;AAEhE,YAAA,IAAI,CAACwD,QAAAA,EAAU;gBACbH,cAAAA,CAAehI,GAAAA,CAAAA;AACjB,YAAA,CAAA,MAEK,IAAI0F,SAAAA,EAAW;;gBAElB,IAAIA,SAAAA,CAAUtE,IAAI,KAAK,UAAA,EAAY;AACjC4F,oBAAAA,OAAO,CAAChH,GAAAA,CAAI,GAAG8H,0BAA0BtI,KAAAA,EAAOiC,QAAAA,CAASiE,UAAUgB,MAAM,CAAA,CAAA;AAC3E,gBAAA,CAAA,MAGK,IAAIhB,SAAAA,CAAUtE,IAAI,KAAK,WAAA,EAAa;AACvC4F,oBAAAA,OAAO,CAAChH,GAAAA,CAAI,GAAG8H,0BAA0BtI,KAAAA,EAAOiC,QAAAA,CAASiE,UAAUiB,SAAS,CAAA,CAAA;AAC9E,gBAAA,CAAA,MAGK,IAAIjB,SAAAA,CAAUtE,IAAI,KAAK,OAAA,EAAS;AACnC4F,oBAAAA,OAAO,CAAChH,GAAAA,CAAI,GAAG8H,yBAAAA,CAA0BtI,OAAOiC,QAAAA,CAAS,qBAAA,CAAA,CAAA;AAC3D,gBAAA,CAAA,MAGK,IAAIiE,SAAAA,CAAUtE,IAAI,KAAK,aAAA,EAAe;oBACzC4G,cAAAA,CAAehI,GAAAA,CAAAA;AACjB,gBAAA,CAAA,MAGK,IAAI0F,SAAAA,CAAUtE,IAAI,KAAK,UAAA,EAAY;;oBAEtC4G,cAAAA,CAAehI,GAAAA,CAAAA;gBACjB,CAAA,MAGK;AACHgH,oBAAAA,OAAO,CAAChH,GAAAA,CAAI,GAAG8H,yBAAAA,CAA0BtI,KAAAA,EAAOmF,MAAAA,CAAAA;AAClD,gBAAA;AACF,YAAA,CAAA,MAGK,IAAI;AAAC,gBAAA,OAAA;AAAS,gBAAA;aAAW,CAAC5D,QAAQ,CAACf,GAAAA,CAAAA,EAAM;gBAC5CgH,OAAO,CAAChH,GAAAA,CAAI,GAAGmB,SAAAA,CAAU;oBAAEC,IAAAA,EAAM,SAAA;oBAAW5B,KAAAA,EAAOwH,OAAO,CAAChH,GAAAA,CAAI;oBAAE8G,SAAAA,EAAW;AAAK,iBAAA,CAAA;YACnF,CAAA,MAAO,IAAIa,SAASnI,KAAAA,CAAAA,EAAQ;AAC1BwH,gBAAAA,OAAO,CAAChH,GAAAA,CAAI,GAAG8H,yBAAAA,CAA0BtI,KAAAA,EAAOmF,MAAAA,CAAAA;AAClD,YAAA;;YAGA,IAAIpF,aAAAA,CAAcyH,OAAO,CAAChH,GAAAA,CAAI,KAAK+H,OAAAA,CAAQf,OAAO,CAAChH,GAAAA,CAAI,CAAA,EAAG;gBACxDgI,cAAAA,CAAehI,GAAAA,CAAAA;AACjB,YAAA;AACF,QAAA;QAEA,OAAOgH,OAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMqB,mBAAAA,GAAsB,CAACC,MAAAA,EAAgCxF,KAAAA,GAAe,EAAE,GAAA;;AAE5EA,QAAAA,KAAAA,CAAMkE,OAAO,GAAG,CAAC,EAAEuB,IAAI,EAAmB,GAAA;YACxC,MAAMC,WAAAA,GAAc/G,QAAAA,CAAS8G,IAAAA,CAAKrC,GAAG,CAAA;;AAGrC,YAAA,IAAI,CAACsC,WAAAA,IAAe,CAACC,kBAAAA,CAAmBD,WAAAA,CAAAA,EAAc;AACpD,gBAAA,OAAO,EAAC;AACV,YAAA;YAEA,OAAO;AAAE,gBAAA,CAACnJ,yBAAyB;AAAEqJ,oBAAAA,KAAAA,EAAOJ,MAAAA,KAAW;AAAQ;AAAE,aAAA;AACnE,QAAA,CAAA;AACF,IAAA,CAAA;IAEA,MAAMK,oBAAAA,GAAuB,CAACzC,GAAAA,EAAa0C,MAAAA,GAAAA;;AAEzC,QAAA,MAAMjE,SAASlD,QAAAA,CAASyE,GAAAA,CAAAA;AAExB,QAAA,MAAMpD,QAAe,EAAC;QAEtB,MAAM,EACJ+F,EAAAA,EAAIC,WAAW,EACf/B,IAAI,EACJC,OAAO,EACPC,MAAM,EACNvC,QAAQ,EACRhB,IAAI,EACJI,QAAQ,EACRI,KAAK,EACLC,KAAK,EACLmE,MAAM,EACN,GAAGS,IAAAA,EACJ,GAAGH,MAAAA;QAEJ,IAAI,CAACvE,MAAMiE,MAAAA,CAAAA,EAAS;AAClBD,YAAAA,mBAAAA,CAAoBC,MAAAA,EAAQxF,KAAAA,CAAAA;AAC9B,QAAA;QAEA,IAAI,CAACuB,MAAMyE,WAAAA,CAAAA,EAAc;AACvBhG,YAAAA,KAAAA,CAAM+F,EAAE,GAAGC,WAAAA;AACb,QAAA;AAEAjG,QAAAA,gBAAAA,CAAiBC,KAAAA,EAAOiE,IAAAA,CAAAA;QAExB,IAAI,CAAC1C,MAAM2C,OAAAA,CAAAA,EAAU;YACnBlE,KAAAA,CAAMoE,KAAK,GAAGC,yBAAAA,CAA0BH,OAAAA,EAASrC,MAAAA,CAAAA;AACnD,QAAA;QAEA,IAAI,CAACN,MAAM4C,MAAAA,CAAAA,EAAS;YAClBnE,KAAAA,CAAMsE,MAAM,GAAGC,wBAAAA,CAAyBJ,MAAAA,EAAQtC,MAAAA,CAAAA;AAClD,QAAA;QAEA,IAAI,CAACN,MAAMK,QAAAA,CAAAA,EAAW;YACpB5B,KAAAA,CAAM4B,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAAA,EAAUC,MAAAA,CAAAA;AACxD,QAAA;QAEAV,wBAAAA,CAAyBP,IAAAA,EAAMI,UAAUI,KAAAA,EAAOC,KAAAA,CAAAA;QAEhD,IAAI,CAACE,MAAMX,IAAAA,CAAAA,EAAO;YAChBZ,KAAAA,CAAMY,IAAI,GAAGD,sBAAAA,CAAuBC,IAAAA,CAAAA;AACtC,QAAA;QAEA,IAAI,CAACW,MAAMP,QAAAA,CAAAA,EAAW;YACpBhB,KAAAA,CAAMgB,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAUJ,CAAAA;AACxD,QAAA;QAEA,IAAI,CAACW,MAAMH,KAAAA,CAAAA,EAAQ;YACjBpB,KAAAA,CAAMwE,MAAM,GAAGrE,uBAAAA,CAAwBiB,KAAAA,CAAAA;AACzC,QAAA;QAEA,IAAI,CAACG,MAAMF,KAAAA,CAAAA,EAAQ;YACjBrB,KAAAA,CAAMqB,KAAK,GAAGb,uBAAAA,CAAwBa,KAAAA,CAAAA;AACxC,QAAA;QAEA,OAAO;AACL,YAAA,GAAG4E,IAAI;AACP,YAAA,GAAGjG;AACL,SAAA;AACF,IAAA,CAAA;IAEA,OAAO;QACLkG,8BAAAA,EAAgCtH,sBAAAA;QAChCuH,+BAAAA,EAAiChG,uBAAAA;QACjCiG,+BAAAA,EAAiC5F,uBAAAA;QACjC6F,kCAAAA,EAAoC1E,0BAAAA;QACpC2E,iCAAAA,EAAmCjC,yBAAAA;QACnCkC,gCAAAA,EAAkChC,wBAAAA;AAClCsB,QAAAA;AACF,KAAA;AACF;;;;"}