@react-querybuilder/core 8.11.1 → 8.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/{basic-BeKPP0_1.d.ts → basic-DbvrfPNz.d.mts} +39 -4
  2. package/dist/{basic-B4vXboTG.d.mts → basic-o1-sYjK6.d.ts} +39 -4
  3. package/dist/chunk-BxBTb9qk.js +39 -0
  4. package/dist/chunk-DrjzjjTJ.mjs +23 -0
  5. package/dist/chunk-Dv2ph0Ay.js +23 -0
  6. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +131 -53
  7. package/dist/cjs/react-querybuilder_core.cjs.development.js +36 -39
  8. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  9. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +131 -53
  10. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  11. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  12. package/dist/{convertQuery-CqX3rPvj.mjs → convertQuery-Cj4t-LT4.mjs} +2 -2
  13. package/dist/{convertQuery-CqX3rPvj.mjs.map → convertQuery-Cj4t-LT4.mjs.map} +1 -1
  14. package/dist/{convertQuery-DAqoID3O.js → convertQuery-DuY_BJHy.js} +3 -3
  15. package/dist/{convertQuery-DAqoID3O.js.map → convertQuery-DuY_BJHy.js.map} +1 -1
  16. package/dist/{export-BjRt-qrK.d.mts → export-CCULKoP4.d.mts} +2 -2
  17. package/dist/{export-CQB0nuvW.d.ts → export-WDHFbiPz.d.ts} +2 -2
  18. package/dist/formatQuery.d.mts +15 -3
  19. package/dist/formatQuery.d.ts +15 -3
  20. package/dist/formatQuery.js +172 -425
  21. package/dist/formatQuery.js.map +1 -1
  22. package/dist/formatQuery.mjs +4 -257
  23. package/dist/formatQuery.mjs.map +1 -1
  24. package/dist/{import-Dvayhrgj.d.ts → import-BSWb9Vgd.d.ts} +2 -2
  25. package/dist/{import-Bc_p8ls9.d.mts → import-CLyHpgk8.d.mts} +2 -2
  26. package/dist/{isRuleGroup-CYcfPgbg.mjs → isRuleGroup-BcfwGaIN.mjs} +1 -1
  27. package/dist/{isRuleGroup-CYcfPgbg.mjs.map → isRuleGroup-BcfwGaIN.mjs.map} +1 -1
  28. package/dist/{isRuleGroup-DqAs2x4E.js → isRuleGroup-Do9KKsmt.js} +2 -40
  29. package/dist/{isRuleGroup-DqAs2x4E.js.map → isRuleGroup-Do9KKsmt.js.map} +1 -1
  30. package/dist/parseCEL.d.mts +32 -7
  31. package/dist/parseCEL.d.ts +32 -7
  32. package/dist/parseCEL.js +181 -12
  33. package/dist/parseCEL.js.map +1 -1
  34. package/dist/parseCEL.mjs +174 -8
  35. package/dist/parseCEL.mjs.map +1 -1
  36. package/dist/parseJSONata.d.mts +2 -2
  37. package/dist/parseJSONata.d.ts +2 -2
  38. package/dist/parseJSONata.js +6 -5
  39. package/dist/parseJSONata.js.map +1 -1
  40. package/dist/parseJSONata.mjs +3 -3
  41. package/dist/parseJsonLogic.d.mts +3 -3
  42. package/dist/parseJsonLogic.d.ts +3 -3
  43. package/dist/parseJsonLogic.js +10 -11
  44. package/dist/parseJsonLogic.js.map +1 -1
  45. package/dist/parseJsonLogic.mjs +4 -5
  46. package/dist/parseJsonLogic.mjs.map +1 -1
  47. package/dist/parseMongoDB.d.mts +2 -2
  48. package/dist/parseMongoDB.d.ts +2 -2
  49. package/dist/parseMongoDB.js +20 -21
  50. package/dist/parseMongoDB.js.map +1 -1
  51. package/dist/parseMongoDB.mjs +4 -5
  52. package/dist/parseMongoDB.mjs.map +1 -1
  53. package/dist/parseSQL.d.mts +2 -2
  54. package/dist/parseSQL.d.ts +2 -2
  55. package/dist/parseSQL.js +10 -13
  56. package/dist/parseSQL.js.map +1 -1
  57. package/dist/parseSQL.mjs +3 -5
  58. package/dist/parseSQL.mjs.map +1 -1
  59. package/dist/parseSpEL.d.mts +2 -2
  60. package/dist/parseSpEL.d.ts +2 -2
  61. package/dist/parseSpEL.js +7 -7
  62. package/dist/parseSpEL.js.map +1 -1
  63. package/dist/parseSpEL.mjs +3 -4
  64. package/dist/parseSpEL.mjs.map +1 -1
  65. package/dist/{prepareQueryObjects-DPCC-iHp.mjs → prepareQueryObjects-BfnyRV5t.mjs} +4 -3
  66. package/dist/{prepareQueryObjects-DPCC-iHp.mjs.map → prepareQueryObjects-BfnyRV5t.mjs.map} +1 -1
  67. package/dist/{prepareQueryObjects-BOUWfel5.js → prepareQueryObjects-DCtJJrF5.js} +14 -13
  68. package/dist/prepareQueryObjects-DCtJJrF5.js.map +1 -0
  69. package/dist/react-querybuilder_core.d.mts +131 -53
  70. package/dist/react-querybuilder_core.legacy-esm.d.ts +131 -53
  71. package/dist/react-querybuilder_core.legacy-esm.js +43 -21
  72. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  73. package/dist/react-querybuilder_core.mjs +36 -14
  74. package/dist/react-querybuilder_core.mjs.map +1 -1
  75. package/dist/react-querybuilder_core.production.d.mts +131 -53
  76. package/dist/react-querybuilder_core.production.mjs +1 -1
  77. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  78. package/dist/{transformQuery-DCCpjtyq.mjs → transformQuery-Bq4iyYsE.mjs} +9 -2
  79. package/dist/{transformQuery-DCCpjtyq.mjs.map → transformQuery-Bq4iyYsE.mjs.map} +1 -1
  80. package/dist/{transformQuery-CWDPogO5.js → transformQuery-DvJTAvkh.js} +10 -3
  81. package/dist/{transformQuery-CWDPogO5.js.map → transformQuery-DvJTAvkh.js.map} +1 -1
  82. package/dist/transformQuery.d.mts +1 -1
  83. package/dist/transformQuery.d.ts +1 -1
  84. package/dist/transformQuery.js +2 -2
  85. package/dist/transformQuery.mjs +2 -2
  86. package/dist/utils-CoYbYnVo.js +706 -0
  87. package/dist/utils-CoYbYnVo.js.map +1 -0
  88. package/dist/utils-DxH23QtE.mjs +514 -0
  89. package/dist/utils-DxH23QtE.mjs.map +1 -0
  90. package/package.json +15 -15
  91. package/dist/arrayUtils-A_OXU9W1.mjs +0 -50
  92. package/dist/arrayUtils-A_OXU9W1.mjs.map +0 -1
  93. package/dist/arrayUtils-QxZOZTf6.js +0 -73
  94. package/dist/arrayUtils-QxZOZTf6.js.map +0 -1
  95. package/dist/optGroupUtils-B0hTpodo.js +0 -251
  96. package/dist/optGroupUtils-B0hTpodo.js.map +0 -1
  97. package/dist/optGroupUtils-VeZ3k7-1.mjs +0 -185
  98. package/dist/optGroupUtils-VeZ3k7-1.mjs.map +0 -1
  99. package/dist/parseNumber-CXdMVNFx.mjs +0 -24
  100. package/dist/parseNumber-CXdMVNFx.mjs.map +0 -1
  101. package/dist/parseNumber-D4iQDxK-.js +0 -31
  102. package/dist/parseNumber-D4iQDxK-.js.map +0 -1
  103. package/dist/prepareQueryObjects-BOUWfel5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"formatQuery.mjs","names":["celCombinatorMap: {\n and: '&&';\n or: '||';\n}","jsonLogicAdditionalOperators: Record<\n 'startsWith' | 'endsWith',\n (a: string, b: string) => boolean\n>","result: string[]","defaultNLTranslations: NLTranslations","defaultRuleGroupProcessorCEL: RuleGroupProcessor<string>","shouldNegate","defaultRuleProcessorCEL: RuleProcessor","defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor","expressions: Record<string, unknown>[]","processNumber","defaultRuleProcessorMongoDBQuery: RuleProcessor","defaultRuleProcessorMongoDB: RuleProcessor","defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string>","shouldNegate","negate","defaultRuleProcessorSpEL: RuleProcessor","escapeStringValueQuotes","defaultValueProcessorByRule: ValueProcessorByRule","defaultRuleProcessorDrizzle: RuleProcessor","defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n>","ruleGroupSQL: SQL | undefined","defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>>","defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string>","defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic>","jsonRuleGroup: RQBJsonLogic","defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string>","rules: string[]","defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string>","expressions: string[]","defaultRuleGroupProcessorNL: RuleGroupProcessor<string>","defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n>","params: any[]","paramsNamed: Record<string, any>","fieldParams: Map<string, Set<string>>","defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSQL: RuleGroupProcessor<string>","negateIfNotOp","textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>>","defaultRuleProcessorElasticSearch: RuleProcessor","negate","defaultRuleProcessorJSONata: RuleProcessor","defaultRuleProcessorJsonLogic: RuleProcessor","fieldObject: JsonLogicVar","negate","defaultRuleProcessorLDAP: RuleProcessor","defaultValueProcessorNL: ValueProcessorByRule","defaultExportOperatorMap: ExportOperatorMap","defaultOperatorProcessorNL: RuleProcessor","defaultRuleProcessorNL: RuleProcessor","defaultOperatorProcessorSQL: RuleProcessor","defaultRuleProcessorSQL: RuleProcessor","defaultRuleProcessorParameterized: RuleProcessor","params: any[]","paramsNamed: Record<string, any>","inParams: string[]","defaultRuleProcessorPrisma: RuleProcessor","defaultRuleProcessorSequelize: RuleProcessor","sqlDialectPresets: Record<SQLPreset, FormatQueryOptions>","formatQueryOptionPresets: Record<string, FormatQueryOptions>","defaultOperatorProcessor: RuleProcessor","defaultFallbackExpressions: Partial<Record<ExportFormat, string>>","optObj: MostFormatQueryOptions","valueProcessor: ValueProcessorByRule","getOperators: FormatQueryOptions['getOperators']","validationMap: ValidationMap","validatorMap: Record<string, RuleValidator>","validationResult: boolean | ValidationResult | undefined","fieldValidator: RuleValidator | undefined","finalOptions: FormatQueryFinalOptions","defaultValueProcessor: ValueProcessorLegacy","defaultMongoDBValueProcessor: ValueProcessorLegacy","defaultCELValueProcessor: ValueProcessorLegacy","defaultSpELValueProcessor: ValueProcessorLegacy","defaultValueProcessorCELByRule: RuleProcessor","defaultValueProcessorMongoDBByRule: RuleProcessor","defaultValueProcessorSpELByRule: RuleProcessor"],"sources":["../src/utils/isRuleOrGroupValid.ts","../src/utils/getParseNumberMethod.ts","../src/utils/formatQuery/utils.ts","../src/utils/formatQuery/defaultRuleGroupProcessorCEL.ts","../src/utils/formatQuery/defaultRuleProcessorCEL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSpEL.ts","../src/utils/formatQuery/defaultRuleProcessorSpEL.ts","../src/utils/formatQuery/defaultValueProcessorByRule.ts","../src/utils/formatQuery/defaultRuleProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleGroupProcessorLDAP.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorNL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleGroupProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSequelize.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleProcessorLDAP.ts","../src/utils/formatQuery/defaultValueProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleProcessorSequelize.ts","../src/utils/formatQuery/formatQuery.ts","../src/utils/formatQuery/index.ts"],"sourcesContent":["import type { RuleGroupTypeAny, RuleType, RuleValidator, ValidationResult } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is useful as a validation result.\n */\nexport const isValidationResult = (vr?: ValidationResult): vr is ValidationResult =>\n isPojo(vr) && typeof vr.valid === 'boolean';\n\n/**\n * Determines if a rule or group is valid based on a validation result (if defined)\n * or a validator function. Returns `true` if neither are defined and the `muted`\n * property is not `true`.\n */\nexport const isRuleOrGroupValid = (\n rg: RuleType | RuleGroupTypeAny,\n validationResult?: boolean | ValidationResult,\n validator?: RuleValidator\n): boolean => {\n if (rg.muted) {\n return false;\n }\n if (typeof validationResult === 'boolean') {\n return validationResult;\n }\n if (isValidationResult(validationResult)) {\n return validationResult.valid;\n }\n if (typeof validator === 'function' && !isRuleGroup(rg)) {\n const vr = validator(rg);\n if (typeof vr === 'boolean') {\n return vr;\n }\n // istanbul ignore else\n if (isValidationResult(vr)) {\n return vr.valid;\n }\n }\n return true;\n};\n","import type { InputType, ParseNumberMethod, ParseNumbersPropConfig } from '../types';\n\nexport const getParseNumberMethod = ({\n parseNumbers,\n inputType,\n}: {\n parseNumbers?: ParseNumbersPropConfig;\n inputType?: InputType | null;\n}): ParseNumberMethod => {\n if (typeof parseNumbers === 'string') {\n const [method, level] = parseNumbers.split('-') as\n | [ParseNumberMethod, 'limited']\n | [ParseNumberMethod];\n if (level === 'limited') {\n return inputType === 'number' ? method : false;\n }\n\n return method;\n }\n\n return parseNumbers ? 'strict' : false;\n};\n","import type { SetRequired } from 'type-fest';\nimport type {\n ConstituentWordOrder,\n DefaultCombinatorName,\n FormatQueryOptions,\n FullField,\n GroupVariantCondition,\n MatchMode,\n NLTranslationKey,\n NLTranslations,\n OptionList,\n RuleGroupTypeAny,\n RuleType,\n ValueProcessorByRule,\n ValueProcessorLegacy,\n ValueProcessorOptions,\n} from '../../types';\nimport { joinWith, splitBy, toArray } from '../arrayUtils';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isPojo, lc, numericRegex } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { parseNumber } from '../parseNumber';\n\n/**\n * Maps a {@link DefaultOperatorName} to a SQL operator.\n *\n * @group Export\n */\nexport const mapSQLOperator = (rqbOperator: string): string => {\n switch (lc(rqbOperator)) {\n case 'null':\n return 'is null';\n case 'notnull':\n return 'is not null';\n case 'notin':\n return 'not in';\n case 'notbetween':\n return 'not between';\n case 'contains':\n case 'beginswith':\n case 'endswith':\n return 'like';\n case 'doesnotcontain':\n case 'doesnotbeginwith':\n case 'doesnotendwith':\n return 'not like';\n default:\n return rqbOperator;\n }\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a MongoDB operator.\n *\n * @group Export\n */\nexport const mongoOperators = {\n '=': '$eq',\n '!=': '$ne',\n '<': '$lt',\n '<=': '$lte',\n '>': '$gt',\n '>=': '$gte',\n in: '$in',\n notin: '$nin',\n notIn: '$nin', // only here for backwards compatibility\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a Prisma ORM operator.\n *\n * @group Export\n */\nexport const prismaOperators = {\n '=': 'equals',\n '!=': 'not',\n '<': 'lt',\n '<=': 'lte',\n '>': 'gt',\n '>=': 'gte',\n in: 'in',\n notin: 'notIn',\n};\n\n/**\n * Maps a {@link DefaultCombinatorName} to a CEL combinator.\n *\n * @group Export\n */\nexport const celCombinatorMap: {\n and: '&&';\n or: '||';\n} = {\n and: '&&',\n or: '||',\n} satisfies Record<DefaultCombinatorName, '&&' | '||'>;\n\n/**\n * Register these operators with `jsonLogic` before applying the result\n * of `formatQuery(query, 'jsonlogic')`.\n *\n * @example\n * ```\n * for (const [op, func] of Object.entries(jsonLogicAdditionalOperators)) {\n * jsonLogic.add_operation(op, func);\n * }\n * jsonLogic.apply({ \"startsWith\": [{ \"var\": \"firstName\" }, \"Stev\"] }, data);\n * ```\n *\n * @group Export\n */\nexport const jsonLogicAdditionalOperators: Record<\n 'startsWith' | 'endsWith',\n (a: string, b: string) => boolean\n> = {\n startsWith: (a: string, b: string) => typeof a === 'string' && a.startsWith(b),\n endsWith: (a: string, b: string) => typeof a === 'string' && a.endsWith(b),\n};\n\n/**\n * Converts all `string`-type `value` properties of a query object into `number` where appropriate.\n *\n * Used by {@link formatQuery} for the `json*` formats when `parseNumbers` is `true`.\n *\n * @group Export\n */\nexport const numerifyValues = (\n rg: RuleGroupTypeAny,\n options: SetRequired<FormatQueryOptions, 'fields'>\n): RuleGroupTypeAny => ({\n ...rg,\n // @ts-expect-error TS doesn't keep track of odd/even indexes here\n rules: rg.rules.map(r => {\n if (typeof r === 'string') {\n return r;\n }\n\n if (isRuleGroup(r)) {\n return numerifyValues(r, options);\n }\n\n const fieldData = getOption(options.fields as OptionList<FullField>, r.field);\n const parseNumbers = getParseNumberMethod({\n parseNumbers: options.parseNumbers,\n inputType: fieldData?.inputType,\n });\n\n if (Array.isArray(r.value)) {\n return { ...r, value: r.value.map(v => parseNumber(v, { parseNumbers })) };\n }\n\n const valAsArray = toArray(r.value, { retainEmptyStrings: true }).map(v =>\n parseNumber(v, { parseNumbers })\n );\n if (valAsArray.every(v => typeof v === 'number')) {\n // istanbul ignore else\n if (valAsArray.length > 1) {\n return { ...r, value: valAsArray };\n } else if (valAsArray.length === 1) {\n return { ...r, value: valAsArray[0] };\n }\n }\n\n return r;\n }),\n});\n\n/**\n * Determines whether a value is _anything_ except an empty `string` or `NaN`.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isValidValue = (value: any): boolean =>\n (typeof value === 'string' && value.length > 0) ||\n (typeof value === 'number' && !Number.isNaN(value)) ||\n (typeof value !== 'string' && typeof value !== 'number');\n\n/**\n * Determines whether {@link formatQuery} should render the given value as a number.\n * As long as `parseNumbers` is `true`, `number` and `bigint` values will return `true` and\n * `string` values will return `true` if they test positive against {@link numericRegex}.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const shouldRenderAsNumber = (value: any, parseNumbers?: boolean): boolean =>\n !!parseNumbers &&\n (typeof value === 'number' ||\n typeof value === 'bigint' ||\n (typeof value === 'string' && numericRegex.test(value)));\n\n/**\n * Used by {@link formatQuery} to determine whether the given value processor is a\n * \"legacy\" value processor by counting the number of arguments. Legacy value\n * processors take 3 arguments (not counting any arguments with default values), while\n * rule-based value processors take no more than 2 arguments.\n *\n * @group Export\n */\nexport const isValueProcessorLegacy = (\n valueProcessor: ValueProcessorLegacy | ValueProcessorByRule\n): valueProcessor is ValueProcessorLegacy => valueProcessor.length >= 3;\n\n/**\n * Converts the `quoteFieldNamesWith` option into an array of two strings.\n * If the option is a string, the array elements are both that string.\n *\n * @default\n * ['', '']\n *\n * @group Export\n */\nexport const getQuoteFieldNamesWithArray = (\n // istanbul ignore next\n quoteFieldNamesWith: null | string | [string, string] = ['', '']\n): [string, string] =>\n Array.isArray(quoteFieldNamesWith)\n ? quoteFieldNamesWith\n : typeof quoteFieldNamesWith === 'string'\n ? [quoteFieldNamesWith, quoteFieldNamesWith]\n : (quoteFieldNamesWith ?? ['', '']);\n\n/**\n * Given a field name and relevant {@link ValueProcessorOptions}, returns the field name\n * wrapped in the configured quote character(s).\n *\n * @group Export\n */\nexport const getQuotedFieldName = (\n fieldName: string,\n { quoteFieldNamesWith, fieldIdentifierSeparator }: ValueProcessorOptions\n): string => {\n const [qPre, qPost] = getQuoteFieldNamesWithArray(quoteFieldNamesWith);\n return typeof fieldIdentifierSeparator === 'string' && fieldIdentifierSeparator.length > 0\n ? joinWith(\n splitBy(fieldName, fieldIdentifierSeparator).map(part => `${qPre}${part}${qPost}`),\n fieldIdentifierSeparator\n )\n : `${qPre}${fieldName}${qPost}`;\n};\n\nconst defaultWordOrder = ['S', 'V', 'O'];\n\n/**\n * Given a [Constituent word order](https://en.wikipedia.org/wiki/Word_order#Constituent_word_orders)\n * like \"svo\" or \"sov\", returns a permutation of `[\"S\", \"V\", \"O\"]` based on the first occurrence of\n * each letter in the input string (case insensitive). This widens the valid input from abbreviations\n * like \"svo\" to more expressive strings like \"subject-verb-object\" or \"sub ver obj\". Any missing\n * letters are appended in the default order \"SVO\" (e.g., \"object\" would yield `[\"O\", \"S\", \"V\"]`).\n *\n * @group Export\n */\nexport const normalizeConstituentWordOrder = (input: string): ConstituentWordOrder => {\n const result: string[] = [];\n const letterSet = new Set(defaultWordOrder);\n\n for (const char of input.toUpperCase()) {\n if (letterSet.has(char)) {\n result.push(char);\n letterSet.delete(char);\n if (letterSet.size === 0) break;\n }\n }\n\n // Add any missing letters in default order\n for (const letter of defaultWordOrder) {\n if (letterSet.has(letter)) {\n result.push(letter);\n }\n }\n\n return result as ConstituentWordOrder;\n};\n\n/**\n * Default translations used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\n// The ones commented below are unnecessary for the default implementation,\n// but they can be overridden for customized implementations.\nexport const defaultNLTranslations: NLTranslations = {\n // and: 'and',\n // or: 'or',\n // true: 'true',\n // false: 'false',\n groupPrefix: '',\n // groupPrefix_not: '',\n groupPrefix_not_xor: 'either zero or more than one of',\n groupPrefix_xor: 'exactly one of',\n groupSuffix: 'is true',\n groupSuffix_not: 'is not true',\n // groupSuffix_not_xor: 'is true',\n // groupSuffix_xor: 'is true',\n};\n\n/**\n * Note: This function assumes `conditions.length > 0`\n */\nconst translationMatchFilter = (\n key: NLTranslationKey,\n keyToTest: string,\n conditions: GroupVariantCondition[]\n) =>\n // The translation matches the base key\n keyToTest.startsWith(key) &&\n // The translation specifies all conditions\n conditions.every(\n c =>\n // This translation specifies _this_ condition\n keyToTest.includes(`_${c}`) &&\n // This translation specifies the same _total number_ of conditions\n keyToTest.match(/_/g)?.length === conditions.length\n );\n\n/**\n * Used by {@link formatQuery} to get a translation based on certain conditions\n * for the \"natural_language\" format.\n *\n * @group Export\n */\nexport const getNLTranslataion = (\n key: NLTranslationKey,\n translations: NLTranslations,\n conditions: GroupVariantCondition[] = []\n): string =>\n conditions.length === 0\n ? (translations[key] ?? defaultNLTranslations[key] ?? /* istanbul ignore next */ '')\n : (Object.entries(translations).find(([keyToTest]) =>\n translationMatchFilter(key, keyToTest, conditions)\n )?.[1] ??\n Object.entries(defaultNLTranslations).find(([keyToTest]) =>\n translationMatchFilter(key, keyToTest, conditions)\n )?.[1] ??\n defaultNLTranslations[key] ??\n /* istanbul ignore next */ '');\n\ntype ProcessedMatchMode =\n | { mode: 'all'; threshold?: number | null | undefined }\n | { mode: 'none'; threshold?: number | null | undefined }\n | { mode: 'some'; threshold?: number | null | undefined }\n | { mode: 'atleast'; threshold: number }\n | { mode: 'atmost'; threshold: number }\n | { mode: 'exactly'; threshold: number };\n\nexport const processMatchMode = (rule: RuleType): void | false | ProcessedMatchMode => {\n const { mode, threshold } = rule.match ?? {};\n\n if (mode) {\n if (!isRuleGroup(rule.value)) return false;\n\n const matchModeLC = lc(mode) as Lowercase<MatchMode>;\n\n const matchModeCoerced =\n matchModeLC === 'atleast' && threshold === 1\n ? 'some'\n : matchModeLC === 'atmost' && threshold === 0\n ? 'none'\n : matchModeLC;\n\n if (\n (matchModeCoerced === 'atleast' ||\n matchModeCoerced === 'atmost' ||\n matchModeCoerced === 'exactly') &&\n (typeof threshold !== 'number' || threshold < 0)\n ) {\n return false;\n }\n\n return { mode: matchModeCoerced, threshold: threshold! };\n }\n};\n\n/**\n * \"Replacer\" method for JSON.stringify's second argument. Converts `bigint` values to\n * objects with a `$bigint` property having a value of a string representation of\n * the actual `bigint`-type value.\n *\n * Inverse of {@link bigIntJsonParseReviver}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonStringifyReplacer = (_key: string, value: unknown): unknown =>\n typeof value === 'bigint' ? { $bigint: value.toString() } : value;\n\n/**\n * \"Reviver\" method for JSON.parse's second argument. Converts objects having a single\n * `$bigint: string` property to an actual `bigint` value.\n *\n * Inverse of {@link bigIntJsonStringifyReplacer}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonParseReviver = (_key: string, value: unknown): unknown =>\n isPojo(value) && Object.keys(value).length === 1 && typeof value.$bigint === 'string'\n ? BigInt(value.$bigint)\n : value;\n","import type { DefaultCombinatorName, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { celCombinatorMap } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorCEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = celCombinatorMap[rule as DefaultCombinatorName];\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(\n isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator as DefaultCombinatorName]} ` : ' '\n );\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeDoubleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorCEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const celQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: `${arrayElementAlias}${r.field ? `.${r.field}` : ''}` }),\n });\n const nestedArrayFilter = defaultRuleGroupProcessorCEL(\n celQuery,\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `${field}.all(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'none':\n case 'some':\n return `${mode === 'none' ? '!' : ''}${field}.exists(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const totalCount = `double(${field}.size())`;\n const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;\n\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n }`;\n\n case 'contains':\n case 'doesnotcontain': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.contains(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.startsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.endsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const [prefix, suffix] = shouldNegate(operatorTL) ? ['!(', ')'] : ['', ''];\n const valueAsArray = toArray(value);\n return `${prefix}${field} in [${valueAsArray\n .map(val =>\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `\"${escapeDoubleQuotes(val, escapeQuotes)}\"`\n )\n .join(', ')}]${suffix}`;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `\"${escapeDoubleQuotes(first, escapeQuotes)}\"`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `\"${escapeDoubleQuotes(second, escapeQuotes)}\"`\n : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} && ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} || ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const mongoDbFallback = { $and: [{ $expr: true }] } as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? mongoDbFallback : false;\n }\n\n const combinator = `$${lc(rg.combinator)}`;\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return false;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : mongoDbFallback;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorMongoDBQuery } from './defaultRuleGroupProcessorMongoDBQuery';\nimport { isValidValue, mongoOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers = false) =>\n shouldRenderAsNumber(value, parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: 'strict' }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDBQuery: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder, context } = options;\n const valueIsField = valueSource === 'field';\n\n const { avoidFieldsAsKeys } = (context ?? {}) as { avoidFieldsAsKeys?: boolean };\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = { $size: { $ifNull: [`$${field}`, []] } };\n const subQueryNoAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `${field}.${r.field}` : field }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: false },\n }\n );\n const subQueryWithAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$item.${r.field}` : '$item' }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: true },\n }\n );\n\n const filteredCount = {\n $size: {\n $ifNull: [\n { $filter: { input: `$${field}`, as: 'item', cond: { $and: [subQueryWithAggCtx] } } },\n [],\n ],\n },\n };\n\n switch (mode) {\n case 'all':\n return { $expr: { $eq: [filteredCount, totalCount] } };\n\n case 'none':\n return { $nor: [subQueryNoAggCtx] };\n\n case 'some':\n return subQueryNoAggCtx;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op =\n mode === 'atleast'\n ? mongoOperators['>=']\n : mode === 'atmost'\n ? mongoOperators['<=']\n : mongoOperators['='];\n\n if (threshold > 0 && threshold < 1) {\n return { $expr: { [op]: [filteredCount, { $multiply: [totalCount, threshold] }] } };\n }\n return { $expr: { [op]: [filteredCount, threshold] } };\n }\n }\n }\n\n if (operator === '=' && !valueIsField) {\n return avoidFieldsAsKeys\n ? { $eq: [`$${field}`, processNumber(value, value, parseNumbers)] }\n : { [field]: processNumber(value, value, parseNumbers) };\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=': {\n const mongoOperator = mongoOperators[operatorLC];\n return valueIsField\n ? { [mongoOperator]: [`$${field}`, `$${value}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [\n { $ne: [`$${field}`, null] },\n { [mongoOperator]: [`$${field}`, processNumber(value, value, parseNumbers)] },\n ],\n }\n : { [field]: { [mongoOperator]: processNumber(value, value, parseNumbers) } };\n }\n\n case 'contains':\n return valueIsField\n ? { $where: `this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: value } }\n : { [field]: { $regex: value } };\n\n case 'beginswith':\n return valueIsField\n ? { $where: `this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `^${value}` } }\n : { [field]: { $regex: `^${value}` } };\n\n case 'endswith':\n return valueIsField\n ? { $where: `this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `${value}$` } }\n : { [field]: { $regex: `${value}$` } };\n\n case 'doesnotcontain':\n return valueIsField\n ? { $where: `!this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: value } } }\n : { [field]: { $not: { $regex: value } } };\n\n case 'doesnotbeginwith':\n return valueIsField\n ? { $where: `!this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `^${value}` } } }\n : { [field]: { $not: { $regex: `^${value}` } } };\n\n case 'doesnotendwith':\n return valueIsField\n ? { $where: `!this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `${value}$` } } }\n : { [field]: { $not: { $regex: `${value}$` } } };\n\n case 'null':\n return avoidFieldsAsKeys ? { $eq: [`$${field}`, null] } : { [field]: null };\n\n case 'notnull':\n return avoidFieldsAsKeys ? { $ne: [`$${field}`, null] } : { [field]: { $ne: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return valueIsField\n ? {\n $where: `${operatorLC === 'notin' ? '!' : ''}[${valueAsArray\n .map(val => `this.${val}`)\n .join(',')}].includes(this.${field})`,\n }\n : avoidFieldsAsKeys\n ? operatorLC === 'notin'\n ? {\n $not: {\n [mongoOperators.in]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n },\n }\n : {\n [mongoOperators[operatorLC]]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n }\n : {\n [field]: {\n [mongoOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n const firstNum = processNumber(first, Number.NaN, true);\n const secondNum = processNumber(second, Number.NaN, true);\n let firstValue = valueIsField ? first : Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = valueIsField ? second : Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n if (operatorLC === 'between') {\n return valueIsField\n ? { $gte: [`$${field}`, `$${firstValue}`], $lte: [`$${field}`, `$${secondValue}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [{ $gte: [`$${field}`, firstValue] }, { $lte: [`$${field}`, secondValue] }],\n }\n : { [field]: { $gte: firstValue, $lte: secondValue } };\n } else {\n return valueIsField\n ? {\n $or: [\n { $lt: [`$${field}`, `$${firstValue}`] },\n { $gt: [`$${field}`, `$${secondValue}`] },\n ],\n }\n : avoidFieldsAsKeys\n ? {\n $or: [{ $lt: [`$${field}`, firstValue] }, { $gt: [`$${field}`, secondValue] }],\n }\n : { $or: [{ [field]: { $lt: firstValue } }, { [field]: { $gt: secondValue } }] };\n }\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleProcessor } from '../../types';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDB: RuleProcessor = (rule, options) => {\n const queryObj = defaultRuleProcessorMongoDBQuery(rule, options);\n return queryObj ? JSON.stringify(queryObj) : '';\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\nconst wrapInNegation = (clause: string, negate: boolean) => (negate ? `!(${clause})` : clause);\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeSingleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\\\'`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSpEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorSpEL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field || '#this' }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n const totalCount = `${field}.size()`;\n const filteredCount = `${field}.?[${nestedArrayFilter}].size()`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} == ${totalCount}`;\n\n case 'none':\n return `${filteredCount} == 0`;\n\n case 'some':\n return `${filteredCount} >= 1`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return wrapInNegation(\n `${field} matches ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`,\n shouldNegate(operatorTL)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const valueTL = valueIsField\n ? `'^'.concat(${trimIfString(value)})`\n : `'${\n (typeof value === 'string' && !value.startsWith('^')) || useBareValue ? '^' : ''\n }${escapeSingleQuotes(value, escapeQuotes)}'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const valueTL = valueIsField\n ? `${trimIfString(value)}.concat('$')`\n : `'${escapeSingleQuotes(value, escapeQuotes)}${\n (typeof value === 'string' && !value.endsWith('$')) || useBareValue ? '$' : ''\n }'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n const valueAsArray = toArray(value);\n return valueAsArray.length > 0\n ? `${negate}(${valueAsArray\n .map(\n val =>\n `${field} == ${\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `'${escapeSingleQuotes(val, escapeQuotes)}'`\n }`\n )\n .join(' or ')})`\n : '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility in SpEL format, between operators should parse numbers\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `'${escapeSingleQuotes(first, escapeQuotes)}'`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `'${escapeSingleQuotes(second, escapeQuotes)}'`\n : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} and ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} or ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n\n return '';\n};\n","import type { ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeStringValueQuotes = (v: any, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorByRule: ValueProcessorByRule = (\n { operator, value, valueSource },\n // istanbul ignore next - defaultRuleProcessorSQL always provides options\n {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith,\n quoteValuesWith,\n concatOperator = '||',\n fieldIdentifierSeparator,\n wrapValueWith = ['', ''],\n translations,\n } = {}\n) => {\n const valueIsField = valueSource === 'field';\n const operatorLowerCase = lc(operator);\n const quoteChar = quoteValuesWith || \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) =>\n `${wrapValueWith[0]}${quoteChar}${v}${quoteChar}${wrapValueWith[1]}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n const concat = (...values: string[]) =>\n concatOperator.toUpperCase() === 'CONCAT'\n ? `CONCAT(${values.join(', ')})`\n : values.join(` ${concatOperator} `);\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `(${valueAsArray\n .map(v =>\n valueIsField\n ? wrapFieldName(v)\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n )\n .join(', ')})`;\n }\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n const secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : second\n : secondNum;\n\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return (\n (\n valueIsField\n ? valsOneAndTwoOnly.map(v => wrapFieldName(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly.map(v => wrapAndEscape(v))\n )\n // Note: `translations` should not be used for SQL.\n // This is only here to support the \"natural_language\" format.\n .join(` ${translations?.and ?? 'and'} `)\n );\n }\n\n case 'contains':\n case 'doesnotcontain':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value), quoteValue('%'))\n : quoteValue(`%${escapeValue(value)}%`);\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return valueIsField\n ? concat(wrapFieldName(value), quoteValue('%'))\n : quoteValue(`${escapeValue(value)}%`);\n\n case 'endswith':\n case 'doesnotendwith':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value))\n : quoteValue(`%${escapeValue(value)}`);\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n return valueIsField\n ? wrapFieldName(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? `${trimIfString(value)}`\n : `${wrapAndEscape(value)}`;\n};\n","import type { Column, Operators, SQL, SQLWrapper } from 'drizzle-orm';\nimport type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"drizzle\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorDrizzle: RuleProcessor = (rule, _options): SQL | undefined => {\n const opts = _options ?? /* istanbul ignore next */ {};\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder, context = {} } = opts;\n const { columns, drizzleOperators, useRawFields } = context as {\n columns: Record<string, Column>;\n drizzleOperators: Operators;\n useRawFields?: boolean;\n };\n\n if (!columns || !drizzleOperators) return;\n\n const {\n between,\n eq,\n gt,\n gte,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n notBetween,\n notInArray,\n notLike,\n sql,\n } = drizzleOperators;\n\n const { field, operator, value, valueSource } = rule;\n // TODO: Improve field validation\n const column =\n useRawFields && /[a-z][a-z0-9]*/i.test(field)\n ? (sql.raw(field) as Exclude<SQLWrapper, SQL.Aliased | Column>)\n : columns[field];\n const operatorLC = lc(operator);\n\n const valueIsField = valueSource === 'field';\n const asFieldOrValue = (v: string) => (valueIsField ? columns[v] : v);\n\n if (!column) return;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts.preset !== 'postgresql') return;\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const sqlQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n });\n\n const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(sqlQuery, {\n ...(opts as FormatQueryFinalOptions),\n context: { ...opts.context, useRawFields: true },\n });\n\n switch (mode) {\n case 'all':\n return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;\n\n case 'none':\n return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'some':\n return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return threshold > 0 && threshold < 1\n ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`\n : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;\n }\n }\n }\n\n switch (operatorLC) {\n case '=':\n return eq(column, asFieldOrValue(value));\n case '!=':\n return ne(column, asFieldOrValue(value));\n case '>':\n return gt(column, asFieldOrValue(value));\n case '<':\n return lt(column, asFieldOrValue(value));\n case '>=':\n return gte(column, asFieldOrValue(value));\n case '<=':\n return lte(column, asFieldOrValue(value));\n case 'beginswith':\n case 'doesnotbeginwith':\n return (operatorLC === 'doesnotbeginwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`\n );\n case 'contains':\n case 'doesnotcontain':\n return (operatorLC === 'doesnotcontain' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`\n );\n case 'endswith':\n case 'doesnotendwith':\n return (operatorLC === 'doesnotendwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`\n );\n case 'null':\n return isNull(column);\n case 'notnull':\n return isNotNull(column);\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => asFieldOrValue(v));\n return operatorLC === 'notin'\n ? notInArray(column, valueAsArray)\n : inArray(column, valueAsArray);\n }\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else {\n // istanbul ignore else\n if (valueIsField) {\n first = asFieldOrValue(first);\n second = asFieldOrValue(second);\n }\n }\n return operatorLC === 'notbetween'\n ? notBetween(column, first, second)\n : between(column, first, second);\n }\n return;\n }\n default:\n return;\n }\n};\n","import type { Column, Operators, SQL, Table } from 'drizzle-orm';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\n\n/**\n * Default rule group processor used by {@link formatQuery} for the \"drizzle\" format. The returned\n * function can be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @example\n * const where = formatQuery(query, 'drizzle');\n * const results = db.query.users.findMany({ where });\n *\n * @returns Function that takes a Drizzle table config and an object of Drizzle operators.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n> =\n (ruleGroup, options, _meta) =>\n (columns: Table | Record<string, Column>, drizzleOperators: Operators) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n validateRule,\n validationMap,\n } = options;\n\n if (!columns || !drizzleOperators) return;\n\n const { and, not, or } = drizzleOperators;\n\n const ruleProcessor = defaultRuleProcessorDrizzle;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): SQL | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n context: { ...options.context, columns, drizzleOperators },\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return;\n }\n\n const ruleGroupSQL: SQL | undefined =\n rg.combinator === 'or' ? or(...processedRules)! : and(...processedRules)!;\n\n return rg.not ? not(ruleGroupSQL) : ruleGroupSQL;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n };\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const processRuleGroup = (rg: RuleGroupType): Record<string, any> | false => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n return {\n bool: rg.not\n ? {\n must_not: /^or$/i.test(rg.combinator)\n ? { bool: { should: processedRules } }\n : processedRules,\n }\n : { [/^or$/i.test(rg.combinator) ? 'should' : 'must']: processedRules },\n };\n };\n\n const processedRuleGroup = processRuleGroup(convertFromIC(ruleGroup));\n return processedRuleGroup === false ? {} : processedRuleGroup;\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '$not' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n DefaultCombinatorName,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupType,\n} from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const query = convertFromIC(ruleGroup);\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): RQBJsonLogic => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n const jsonRuleGroup: RQBJsonLogic = { [rg.combinator]: processedRules } as {\n [k in DefaultCombinatorName]: [RQBJsonLogic, RQBJsonLogic, ...RQBJsonLogic[]];\n };\n\n return rg.not ? { '!': jsonRuleGroup } : jsonRuleGroup;\n };\n\n return processRuleGroup(query, true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const rules: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean);\n\n const expression = rules.join('');\n\n const [notPrefix, notSuffix] = rg.not ? ['(!', ')'] : ['', ''];\n const [prefix, suffix] =\n rules.length > 1\n ? [`${notPrefix}(${rg.combinator === 'or' ? '|' : '&'}`, `)${notSuffix}`]\n : [notPrefix, notSuffix];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\nconst isBracketed = (str: string) => str.startsWith('{') && str.endsWith('}');\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string> = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const combinator = `\"$${lc(rg.combinator)}\"`;\n let hasChildRules = false;\n\n const expressions: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n // Don't wrap in curly braces if the result already is.\n return isBracketed(processedRuleGroup) ? processedRuleGroup : `{${processedRuleGroup}}`;\n }\n return '';\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : `${combinator}:[${expressions.join(',')}]`\n : fallbackExpression;\n };\n\n const processedQuery = processRuleGroup(convertFromIC(ruleGroup), true);\n return isBracketed(processedQuery) ? processedQuery : `{${processedQuery}}`;\n};\n","import type { NLTranslationKey, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { getNLTranslataion } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorNL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n translations,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const rg2 =\n isRuleGroupTypeIC(rg) && rg.rules.some(r => typeof r === 'string' && lc(r) === 'xor')\n ? convertFromIC(rg)\n : rg;\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg2.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = `, ${translations[rule as NLTranslationKey] ?? rule} `;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(\n rule,\n rg2.rules.length === 1 &&\n !(rg2.not || /^xor$/i.test(rg2.combinator ?? /* istanbul ignore next */ ''))\n );\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n const isXOR = lc(rg2.combinator ?? '') === 'xor';\n const combinator = isXOR ? rg2.combinator!.slice(1) : rg2.combinator;\n const mustWrap = rg2.not || !outermostOrLonelyInGroup || (isXOR && processedRules.length > 1);\n\n const [prefixTL, suffixTL] = (['groupPrefix', 'groupSuffix'] as const).map(key =>\n rg2.not\n ? isXOR\n ? getNLTranslataion(key, translations, ['not', 'xor'])\n : getNLTranslataion(key, translations, ['not'])\n : isXOR\n ? getNLTranslataion(key, translations, ['xor'])\n : getNLTranslataion(key, translations)\n );\n\n const prefix = mustWrap ? `${prefixTL} (`.trim() : '';\n const suffix = mustWrap ? `) ${suffixTL}`.trim() : '';\n\n return `${prefix}${processedRules.join(\n isRuleGroupType(rg2) ? `, ${translations[combinator as NLTranslationKey] ?? combinator} ` : ''\n )}${suffix}`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleType,\n} from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { isPojo } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n> = (ruleGroup, options) => {\n const {\n format,\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n const fieldParams: Map<string, Set<string>> = new Map();\n\n const getNextNamedParam = (field: string) => {\n if (!fieldParams.has(field)) {\n fieldParams.set(field, new Set());\n }\n const nextNamedParam = `${field}_${fieldParams.get(field)!.size + 1}`;\n fieldParams.get(field)!.add(nextNamedParam);\n return nextNamedParam;\n };\n\n const processRule = (rule: RuleType) => {\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n\n const fieldData = getOption(fields, rule.field);\n\n const fieldParamNames = Object.fromEntries(\n ([...fieldParams.entries()] as [string, Set<string>][]).map(([f, s]) => [f, [...s]])\n );\n\n const processedRule = ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n getNextNamedParam,\n fieldParamNames,\n fieldData,\n },\n { processedParams: params }\n );\n\n if (!isPojo(processedRule)) {\n return '';\n }\n\n const { sql, params: customParams } = processedRule;\n\n if (typeof sql !== 'string' || !sql) {\n return '';\n }\n\n // istanbul ignore else\n if (format === 'parameterized' && Array.isArray(customParams)) {\n params.push(...customParams);\n } else if (format === 'parameterized_named' && isPojo(customParams)) {\n Object.assign(paramsNamed, customParams);\n // `getNextNamedParam` already adds new params to the list, but a custom\n // rule processor might not call it so we need to make sure we add\n // any new params here.\n for (const p of Object.keys(customParams)) fieldParams.get(rule.field)?.add(p);\n }\n\n return sql;\n };\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const processedRule = processRule(rule);\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n if (parameterized) {\n return { sql: processRuleGroup(ruleGroup, true), params };\n }\n return { sql: processRuleGroup(ruleGroup, true), params: paramsNamed };\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\n// TODO?: make this configurable\nexport const prismaFallback = {} as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n> = (ruleGroup, options) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? prismaFallback : undefined;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : prismaFallback;\n };\n\n const result = processRuleGroup(convertFromIC(ruleGroup), true);\n\n return ruleGroup.not ? { NOT: result } : result;\n};\n","import type { Op as _OpTypes, WhereOptions } from 'sequelize';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\ntype OpTypes = typeof _OpTypes;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined> = (\n ruleGroup,\n options\n) => {\n // istanbul ignore next\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n context = {},\n } = options;\n\n const { sequelizeOperators: Op } = context as {\n sequelizeOperators: OpTypes;\n };\n\n if (!Op) return;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): WhereOptions | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (expressions.length === 0) return;\n\n const result =\n expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [lc(combinator) === 'or' ? Op.or : Op.and]: expressions };\n\n return rg.not ? { [Op.not]: result } : result;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSQL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { DefaultOperatorName, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype RangeOperator = 'gt' | 'gte' | 'lt' | 'lte';\ntype RangeRule = (\n | { gt: string | number }\n | { gte: string | number }\n | { lt: string | number }\n | { lte: string | number }\n) & { [k in RangeOperator]?: string | number };\ntype ElasticSearchRule =\n | { range: Record<string, RangeRule> }\n // oxlint-disable-next-line typescript/no-explicit-any\n | { term: Record<string, any> }\n | { exists: { field: string } }\n | { regexp: { [k: string]: { value: string } } };\ntype ElasticSearchQuery = {\n bool:\n | { filter: { script: { script: string } } }\n | { must: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[] }\n | {\n must_not:\n | ElasticSearchRule\n | ElasticSearchQuery\n | (ElasticSearchRule | ElasticSearchQuery)[];\n }\n | {\n should: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[];\n };\n};\n\nconst rangeOperatorMap = { '<': 'lt', '<=': 'lte', '>': 'gt', '>=': 'gte' } satisfies Record<\n '<' | '<=' | '>' | '>=',\n RangeOperator\n>;\n\nconst negateIfNotOp = (\n op: string,\n elasticSearchRule: ElasticSearchRule\n): ElasticSearchQuery | ElasticSearchRule =>\n op.startsWith('not') || op.startsWith('doesnot')\n ? { bool: { must_not: elasticSearchRule } }\n : elasticSearchRule;\n\nconst escapeSQ = (s: string) => s?.replace(/('|\\\\)/g, `\\\\$1`);\n\nconst textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>> = {\n beginswith: 'startsWith',\n doesnotbeginwith: 'startsWith',\n doesnotcontain: 'contains',\n doesnotendwith: 'endsWith',\n endswith: 'endsWith',\n};\nconst getTextScript = (f: string, o: Lowercase<DefaultOperatorName>, v: string) => {\n const script = `doc['${f}'].value.${textFunctionMap[o] ?? o}(doc['${v}'].value)`;\n return o.startsWith('d') ? `!${script}` : script;\n};\n\n// oxlint-disable-next-line typescript/no-explicit-any\nconst valueRenderer = (v: any, parseNumbers?: boolean) =>\n typeof v === 'boolean'\n ? v\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorElasticSearch: RuleProcessor = (\n rule,\n options = {}\n): ElasticSearchQuery | ElasticSearchRule | false => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const operatorLC = lc(operator) as Lowercase<DefaultOperatorName>;\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return false;\n\n if (valueSource === 'field') {\n // Bail out if not all values are strings\n if (toArray(value).some(v => typeof v !== 'string')) return false;\n\n const fieldForScript = escapeSQ(field);\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=': {\n const operatorForScript = operatorLC === '=' ? '==' : operatorLC;\n const valueForScript = escapeSQ(value);\n return valueForScript\n ? {\n bool: {\n filter: {\n script: {\n script: `doc['${fieldForScript}'].value ${operatorForScript} doc['${valueForScript}'].value`,\n },\n },\n },\n }\n : false;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({\n bool: {\n filter: { script: { script: `doc['${fieldForScript}'].value == doc['${v}'].value` } },\n },\n }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && valueAsArray[0] && valueAsArray[1]) {\n const script = `doc['${fieldForScript}'].value >= doc['${valueAsArray[0]}'].value && doc['${fieldForScript}'].value <= doc['${valueAsArray[1]}'].value`;\n return {\n bool: {\n filter: { script: { script: operatorLC === 'notbetween' ? `!(${script})` : script } },\n },\n };\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n case 'beginswith':\n case 'doesnotbeginwith':\n case 'endswith':\n case 'doesnotendwith': {\n const valueForScript = escapeSQ(value);\n if (!valueForScript) return false;\n const script = getTextScript(fieldForScript, operatorLC, valueForScript);\n return {\n bool: {\n filter: {\n script: {\n script,\n },\n },\n },\n };\n }\n }\n }\n\n switch (operatorLC) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n return {\n range: {\n [field]: {\n [rangeOperatorMap[operatorLC]]: valueRenderer(value, parseNumbers),\n } as RangeRule,\n },\n };\n\n case '=':\n return { term: { [field]: valueRenderer(value, parseNumbers) } };\n\n case '!=':\n return { bool: { must_not: { term: { [field]: valueRenderer(value, parseNumbers) } } } };\n\n case 'null':\n return { bool: { must_not: { exists: { field } } } };\n\n case 'notnull':\n return { exists: { field } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => valueRenderer(v, parseNumbers));\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({ term: { [field]: valueRenderer(v, parseNumbers) } }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n }\n return negateIfNotOp(operatorLC, { range: { [field]: { gte: first, lte: second } } });\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}.*` } } });\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `${value}.*` } } });\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}` } } });\n }\n return false;\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst quote = (v: any, escapeQuotes?: boolean) =>\n `\"${typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`)}\"`;\n\nconst negate = (clause: string, negate: boolean) => (negate ? `$not(${clause})` : clause);\n\nconst escapeStringRegex = (s: string) =>\n `${s}`.replaceAll(/[/$()*+.?[\\\\\\]^{|}]/g, String.raw`\\$&`).replaceAll('-', String.raw`\\x2d`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJSONata: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n } = options;\n\n const valueIsField = valueSource === 'field';\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const qfn = (f: string) =>\n getQuotedFieldName(f, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = `$count(${qfn(field)})`;\n const filteredCount = `$count($filter(${qfn(field)}, function($v) {${defaultRuleGroupProcessorJSONata(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$v.${r.field}` : '$v' }),\n }),\n options as FormatQueryFinalOptions\n )}}))`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} = ${totalCount}`;\n\n case 'none':\n return `${filteredCount} = 0`;\n\n case 'some':\n return `${filteredCount} > 0`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return `${qfn(field)} ${operatorLC} ${\n valueIsField\n ? qfn(trimIfString(value))\n : useBareValue\n ? trimIfString(value)\n : quote(value, escapeQuotes)\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return negate(\n `$contains(${qfn(field)}, ${valueIsField ? qfn(trimIfString(value)) : quote(value, escapeQuotes)})`,\n shouldNegate(operatorLC)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, 0, $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /^${escapeStringRegex(value)}/)`,\n shouldNegate(operatorLC)\n );\n\n case 'endswith':\n case 'doesnotendwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, $length(${qfn(field)}) - $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /${escapeStringRegex(value)}$/)`,\n shouldNegate(operatorLC)\n );\n\n case 'null':\n return `${qfn(field)} = null`;\n\n case 'notnull':\n return `${qfn(field)} != null`;\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negate(\n `${qfn(field)} in [${valueAsArray\n .map(val =>\n valueIsField\n ? `${qfn(trimIfString(val))}`\n : shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : quote(val, escapeQuotes)\n )\n .join(', ')}]`,\n shouldNegate(operatorLC)\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n let secondValue = Number.isNaN(secondNum) ? (valueIsField ? `${second}` : second) : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n const renderAsNumbers =\n shouldRenderAsNumber(first, parseNumbers) && shouldRenderAsNumber(second, parseNumbers);\n const getValueString = (raw: string, val: string | number) =>\n valueIsField ? qfn(raw) : renderAsNumbers ? val : quote(val, escapeQuotes);\n\n const expression = `${qfn(field)} >= ${getValueString(first, firstValue)} and ${qfn(field)} <= ${getValueString(second, secondValue)}`;\n\n return operatorLC === 'between' ? `(${expression})` : negate(expression, true);\n }\n }\n\n return '';\n};\n","import type {\n FormatQueryFinalOptions,\n JsonLogicVar,\n RQBJsonLogic,\n RuleProcessor,\n} from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst convertOperator = (op: '<' | '<=' | '=' | '!=' | '>' | '>=') =>\n op\n .replace(/^(=)$/, '$1=')\n .replace(/^notnull$/i, '!=')\n .replace(/^null$/i, '==') as '<' | '<=' | '==' | '!=' | '===' | '!==' | '>' | '>=';\n\nconst negateIfNotOp = (op: string, jsonRule: RQBJsonLogic) =>\n op.startsWith('not') || op.startsWith('doesnot') ? { '!': jsonRule } : jsonRule;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJsonLogic: RuleProcessor = (rule, options = {}): RQBJsonLogic => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const valueIsField = valueSource === 'field';\n const fieldObject: JsonLogicVar = { var: field };\n const fieldOrNumberRenderer = (v: string) =>\n valueIsField\n ? { var: `${v}` }\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return false;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n switch (mode) {\n case 'all':\n case 'none':\n case 'some':\n return {\n [mode]: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n } as RQBJsonLogic;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n const filteredCount = {\n reduce: [\n {\n filter: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n },\n { '+': [1, { var: 'accumulator' }] },\n 0,\n ],\n };\n\n if (threshold > 0 && threshold < 1) {\n const totalCount = {\n reduce: [{ var: field }, { '+': [1, { var: 'accumulator' }] }, 0],\n };\n return { [op]: [filteredCount, { '*': [totalCount, threshold] }] } as RQBJsonLogic;\n }\n return { [op]: [filteredCount, threshold] } as RQBJsonLogic;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return {\n [convertOperator(operatorLC)]: [fieldObject, fieldOrNumberRenderer(value)],\n } as RQBJsonLogic;\n\n case 'null':\n case 'notnull': {\n return {\n [`${operatorLC === 'notnull' ? '!' : '='}=`]: [fieldObject, null],\n } as RQBJsonLogic;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => fieldOrNumberRenderer(v));\n return negateIfNotOp(operatorLC, { in: [fieldObject, valueAsArray] });\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else if (valueIsField) {\n first = { var: first };\n second = { var: second };\n }\n const jsonRule: RQBJsonLogic = { '<=': [first, fieldObject, second] };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain': {\n const jsonRule: RQBJsonLogic = {\n in: [fieldOrNumberRenderer(value), fieldObject],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const jsonRule: RQBJsonLogic = {\n startsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const jsonRule: RQBJsonLogic = {\n endsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n }\n return false;\n};\n","import type { RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst negateIf = (clause: string, negate: boolean) => (negate ? `(!${clause})` : `${clause}`);\n\nconst ldapEscape = (s: unknown) =>\n `${trimIfString(s)}`.replaceAll(\n /[()&|=<>~*\\\\/]/g,\n (m: string) => `\\\\${m.codePointAt(0)!.toString(16)}`\n );\n\n/**\n * Default rule processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorLDAP: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { preserveValueOrder } = options;\n const operatorLC = lc(operator);\n\n // Bail out if...\n if (\n // This is a field comparison (which LDAP does not support), or\n valueSource === 'field' ||\n // `value` is null/undefined/empty and the operator is not unary, or\n (nullOrUndefinedOrEmpty(value) && operatorLC !== 'null' && operatorLC !== 'notnull') ||\n // a valid `match` property is found (match modes are not supported in this format)\n processMatchMode(rule)\n ) {\n return '';\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n return negateIf(`(${field}=${ldapEscape(value)})`, operatorLC === '!=');\n\n case '>':\n case '>=':\n return `(${field}>=${ldapEscape(value)})`;\n\n case '<':\n case '<=':\n return `(${field}<=${ldapEscape(value)})`;\n\n case 'contains':\n case 'doesnotcontain':\n return negateIf(`(${field}=*${ldapEscape(value)}*)`, operatorLC === 'doesnotcontain');\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIf(`(${field}=${ldapEscape(value)}*)`, operatorLC === 'doesnotbeginwith');\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIf(`(${field}=*${ldapEscape(value)})`, operatorLC === 'doesnotendwith');\n\n case 'null':\n case 'notnull':\n return negateIf(`(${field}=*)`, operatorLC === 'notnull');\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negateIf(\n `(|${valueAsArray.map(val => `(${field}=${ldapEscape(val)})`).join('')})`,\n operatorLC === 'notin'\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true)\n ? parseNumber(first, { parseNumbers: true })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, true)\n ? parseNumber(second, { parseNumbers: true })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return negateIf(\n `(&(${field}>=${ldapEscape(firstValue)})(${field}<=${ldapEscape(secondValue)}))`,\n operatorLC === 'notbetween'\n );\n }\n }\n\n // istanbul ignore next\n return '';\n};\n","import type { FullField, ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\nconst escapeStringValueQuotes = (v: unknown, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : /* istanbul ignore next */ v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorNL: ValueProcessorByRule = (\n rule,\n // istanbul ignore next - defaultRuleProcessorNL always provides options\n opts = {}\n) => {\n const {\n escapeQuotes,\n fields,\n parseNumbers,\n quoteFieldNamesWith,\n quoteValuesWith,\n fieldIdentifierSeparator,\n translations,\n } = opts;\n const valueIsField = rule.valueSource === 'field';\n const operatorLowerCase = lc(rule.operator);\n const quoteChar = quoteValuesWith || /* istanbul ignore next */ \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) => `${quoteChar}${v}${quoteChar}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const t = translations ?? /* istanbul ignore next */ {};\n const orTL = t.or ?? 'or';\n const trueTL = t.true ?? 'true';\n const falseTL = t.false ?? 'false';\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n if (!valueIsField) {\n return defaultValueProcessorByRule(rule, opts);\n }\n\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true })\n .slice(0, 2)\n .map(v =>\n wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n );\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n return defaultValueProcessorByRule({ ...rule, value: valueAsArray }, opts);\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(rule.value);\n if (valueAsArray.length === 0) return '';\n const valStringArray = valueAsArray.map(v =>\n valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n );\n return `${valStringArray.slice(0, -1).join(', ')}${valStringArray.length > 2 ? ',' : ''} ${orTL} ${valStringArray.at(-1)}`;\n }\n }\n\n if (typeof rule.value === 'boolean') {\n return rule.value ? trueTL : falseTL;\n }\n\n return valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], rule.value)?.label ??\n rule.value\n )\n : shouldRenderAsNumber(rule.value, parseNumbers)\n ? `${trimIfString(rule.value)}`\n : `${wrapAndEscape(rule.value)}`;\n};\n","import type {\n DefaultOperatorName,\n ExportOperatorMap,\n FormatQueryFinalOptions,\n FullOption,\n RuleProcessor,\n} from '../../types';\nimport { lc } from '../misc';\nimport { getOption, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport { getQuotedFieldName, normalizeConstituentWordOrder, processMatchMode } from './utils';\n\n/**\n * Default operator map used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultExportOperatorMap: ExportOperatorMap = {\n '=': ['is', 'is the same as the value in'],\n '!=': ['is not', 'is not the same as the value in'],\n '<': ['is less than', 'is less than the value in'],\n '>': ['is greater than', 'is greater than the value in'],\n '<=': ['is less than or equal to', 'is less than or equal to the value in'],\n '>=': ['is greater than or equal to', 'is greater than or equal to the value in'],\n contains: ['contains', 'contains the value in'],\n beginswith: ['starts with', 'starts with the value in'],\n endswith: ['ends with', 'ends with the value in'],\n doesnotcontain: ['does not contain', 'does not contain the value in'],\n doesnotbeginwith: ['does not start with', 'does not start with the value in'],\n doesnotendwith: ['does not end with', 'does not end with the value in'],\n null: 'is null',\n notnull: 'is not null',\n in: ['is one of the values', 'is the same as a value in'],\n notin: ['is not one of the values', 'is not the same as any value in'],\n between: ['is between', 'is between the values in'],\n notbetween: ['is not between', 'is not between the values in'],\n};\n\n/* istanbul ignore next */\nconst defaultGetOperators = () => [];\n\n/**\n * Default operator processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorNL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, valueSource = 'value' } = rule;\n // istanbul ignore next\n const {\n getOperators = defaultGetOperators,\n operatorMap: operatorMapParam = defaultExportOperatorMap,\n } = opts;\n\n const mapOperatorMap = new Map<string, string | [string, string]>(\n Object.entries(defaultExportOperatorMap)\n );\n for (const [key, value] of Object.entries(operatorMapParam)) {\n mapOperatorMap.set(lc(key), value);\n }\n const operatorMap = Object.fromEntries(mapOperatorMap);\n\n const { value: operatorNL, label } = getOption(\n toFullOptionList(\n getOperators(field, {\n fieldData: opts.fieldData ?? {\n name: field,\n value: field,\n label: field,\n },\n }) ?? /* istanbul ignore next */ []\n ) as FullOption[],\n operator\n ) ?? {\n name: operator,\n value: operator,\n label: operator,\n };\n\n const operatorTL = operatorMap[operatorNL as DefaultOperatorName] ??\n operatorMap[lc(operatorNL) as Lowercase<DefaultOperatorName>] ?? [label, label];\n\n return typeof operatorTL === 'string' ? operatorTL : operatorTL[valueSource === 'field' ? 1 : 0];\n};\n\n/**\n * Default rule processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorNL: RuleProcessor = (rule, opts) => {\n const { field, operator } = rule;\n // istanbul ignore next\n const {\n fieldData,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorNL,\n valueProcessor = defaultValueProcessorNL,\n concatOperator = '||',\n wordOrder = 'SVO',\n } = opts ?? /* istanbul ignore next */ {};\n\n const processedField = getQuotedFieldName(fieldData?.label ?? field, {\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorNL(rule.value, {\n ...(opts as FormatQueryFinalOptions),\n fields: toFullOptionList(fieldData?.subproperties ?? []),\n });\n\n // (H)as (S)ub(P)roperties\n const hsp = (fieldData?.subproperties?.length ?? 0) > 0;\n\n switch (mode) {\n case 'all':\n return `(${hsp ? 'for ' : ''}every item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'none':\n return `(${hsp ? 'for ' : ''}no item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'some':\n return `(${hsp ? 'for ' : ''}at least one item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const mm = mode.replace('at', 'at ');\n if (threshold > 0 && threshold < 1) {\n return `(${hsp ? 'for ' : ''}${mm} ${threshold * 100}% of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n return `(${hsp ? 'for ' : ''}${mm} ${threshold} of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operatorLC = lc(operator);\n if (\n (operatorLC === 'in' ||\n operatorLC === 'notin' ||\n operatorLC === 'between' ||\n operatorLC === 'notbetween') &&\n !value\n ) {\n return '';\n }\n\n const processedOperator = operatorProcessor(rule, opts);\n\n const wordOrderMap = {\n S: processedField,\n V: processedOperator,\n O: value,\n };\n\n return normalizeConstituentWordOrder(wordOrder)\n .map(term => `${wordOrderMap[term]}`)\n .join(' ')\n .trim();\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { lc } from '../misc';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, mapSQLOperator, processMatchMode } from './utils';\n\n/**\n * Default operator processor used by {@link formatQuery} for \"sql\" and \"parameterized*\" formats.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorSQL: RuleProcessor = rule => lc(mapSQLOperator(rule.operator));\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSQL: RuleProcessor = (rule, opts = {}) => {\n const {\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n concatOperator = '||',\n } = opts;\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return '';\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const nestedArrayFilter = defaultRuleGroupProcessorSQL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) = array_length(${ruleField}, 1)`;\n\n case 'none':\n return `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'some':\n return `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operator = operatorProcessor(rule, opts);\n\n const operatorLowerCase = lc(operator);\n if (\n (operatorLowerCase === 'in' ||\n operatorLowerCase === 'not in' ||\n operatorLowerCase === 'between' ||\n operatorLowerCase === 'not between') &&\n !value\n ) {\n return '';\n }\n\n return `${ruleField} ${operator} ${value}`.trim();\n};\n","import type { FormatQueryFinalOptions, FullField, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultOperatorProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleProcessorParameterized: RuleProcessor = (rule, opts, meta) => {\n // TODO?: test for this so we don't have to ignore it\n // istanbul ignore next\n const {\n fieldData,\n format,\n getNextNamedParam,\n parseNumbers,\n paramPrefix,\n paramsKeepPrefix,\n numberedParams,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator,\n concatOperator,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n } = opts ?? {};\n\n const { processedParams = [] } = meta ?? {};\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n\n const finalize = (sql: string) =>\n parameterized ? { sql, params } : { sql, params: paramsNamed };\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return finalize('');\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const { sql: nestedSQL, params: nestedParams } = defaultRuleGroupProcessorParameterized(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n { ...(opts as FormatQueryFinalOptions), fields: [] as FullField[] }\n );\n // Ignore the \"parameterized_named\" case because PostgreSQL doesn't support named parameters\n // istanbul ignore else\n if (Array.isArray(nestedParams)) {\n params.push(...nestedParams);\n } else {\n Object.assign(paramsNamed, nestedParams);\n }\n\n switch (mode) {\n case 'all':\n return finalize(\n `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) = array_length(${ruleField}, 1)`\n );\n\n case 'none':\n return finalize(\n `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'some':\n return finalize(\n `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return finalize(\n `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`\n );\n }\n }\n }\n\n const value = valueProcessor(rule, {\n parseNumbers,\n quoteFieldNamesWith,\n concatOperator,\n fieldData,\n format,\n });\n\n const sqlOperator = operatorProcessor(rule, opts);\n const sqlOperatorLowerCase = lc(sqlOperator);\n const [qPre, qPost] = quoteFieldNamesWith;\n\n if (\n (sqlOperatorLowerCase === 'in' ||\n sqlOperatorLowerCase === 'not in' ||\n sqlOperatorLowerCase === 'between' ||\n sqlOperatorLowerCase === 'not between') &&\n !value\n ) {\n return finalize('');\n } else if (sqlOperatorLowerCase === 'is null' || sqlOperatorLowerCase === 'is not null') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator}`);\n } else if (rule.valueSource === 'field') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} ${value}`.trim());\n } else if (sqlOperatorLowerCase === 'in' || sqlOperatorLowerCase === 'not in') {\n const splitValue = toArray(rule.value);\n if (parameterized) {\n for (const v of splitValue) {\n params.push(shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v);\n }\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} (${splitValue\n .map((_v, i) =>\n numberedParams\n ? `${paramPrefix}${processedParams.length + 1 + splitValue.length - (splitValue.length - i)}`\n : '?'\n )\n .join(', ')})`\n );\n }\n const inParams: string[] = [];\n for (const v of splitValue) {\n const thisParamName = getNextNamedParam!(rule.field);\n inParams.push(`${paramPrefix}${thisParamName}`);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${thisParamName}`] = shouldRenderAsNumber(\n v,\n parseNumbers\n )\n ? parseNumber(v, { parseNumbers })\n : v;\n }\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} (${inParams.join(', ')})`);\n } else if (sqlOperatorLowerCase === 'between' || sqlOperatorLowerCase === 'not between') {\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true });\n const [first, second] = valueAsArray\n .slice(0, 2)\n .map(v => (shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v));\n if (parameterized) {\n params.push(first, second);\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n numberedParams ? `${paramPrefix}${processedParams.length + 1}` : '?'\n } and ${numberedParams ? `${paramPrefix}${processedParams.length + 2}` : '?'}`\n );\n }\n const firstParamName = getNextNamedParam!(rule.field);\n const secondParamName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${firstParamName}`] = first;\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${secondParamName}`] = second;\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${paramPrefix}${firstParamName} and ${paramPrefix}${secondParamName}`\n );\n }\n\n let paramValue = rule.value;\n if (typeof rule.value === 'string') {\n if (shouldRenderAsNumber(rule.value, parseNumbers)) {\n paramValue = parseNumber(rule.value, { parseNumbers });\n } else {\n // Note that we're using `value` here, which has been processed through\n // a `valueProcessor`, as opposed to `rule.value` which has not\n paramValue = /^'.*'$/g.test(value)\n ? value.replaceAll(/(^'|'$)/g, '')\n : /* istanbul ignore next */ value;\n }\n }\n\n let paramName = '';\n if (parameterized) {\n params.push(paramValue);\n } else {\n paramName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${paramName}`] = paramValue;\n }\n\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n parameterized\n ? numberedParams\n ? `${paramPrefix}${processedParams.length + 1}`\n : '?'\n : `${paramPrefix}${paramName}`\n }`.trim()\n );\n};\n","import type { ParseNumbersPropConfig, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, prismaOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers?: ParseNumbersPropConfig) =>\n shouldRenderAsNumber(value, !!parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: !!parseNumbers }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorPrisma: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder } = options;\n\n // Neither field-to-field comparisons nor match modes are supported in this format\n if (valueSource === 'field' || processMatchMode(rule)) return;\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '=':\n return { [field]: processNumber(value, value, parseNumbers) };\n\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const prismaOperator = prismaOperators[operatorLC];\n return {\n [field]: {\n [prismaOperator]: processNumber(value, value, parseNumbers),\n },\n };\n }\n\n case 'contains':\n return { [field]: { contains: value } };\n\n case 'beginswith':\n return { [field]: { startsWith: value } };\n\n case 'endswith':\n return { [field]: { endsWith: value } };\n\n case 'doesnotcontain':\n return { NOT: { [field]: { contains: value } } };\n\n case 'doesnotbeginwith':\n return { NOT: { [field]: { startsWith: value } } };\n\n case 'doesnotendwith':\n return { NOT: { [field]: { endsWith: value } } };\n\n case 'null':\n return { [field]: null };\n\n case 'notnull':\n return { [field]: { not: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [prismaOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorLC === 'between'\n ? { [field]: { gte: firstValue, lte: secondValue } }\n : { OR: [{ [field]: { lt: firstValue } }, { [field]: { gt: secondValue } }] };\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { Op as _OpTypes, col as _colType, fn as _fnType } from 'sequelize';\nimport type { Simplify } from 'type-fest';\nimport type { RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype OpTypes = Simplify<typeof _OpTypes>;\ntype ColType = typeof _colType;\ntype FnType = typeof _fnType;\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSequelize: RuleProcessor = (\n rule,\n // istanbul ignore next\n { parseNumbers, preserveValueOrder, context = {} } = {}\n): Record<string, unknown> | undefined => {\n const {\n sequelizeOperators: Op,\n sequelizeCol: col,\n sequelizeFn: fn,\n } = context as {\n sequelizeOperators: OpTypes;\n sequelizeCol?: ColType;\n sequelizeFn?: FnType;\n };\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return;\n\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n\n const operatorLC = lc(operator);\n\n if (\n // Bail out if we don't have the Op symbols\n !Op ||\n // ...or valueSource is 'field' and we don't have the `col` function,\n (valueIsField &&\n (!col ||\n // ...or valueSource is 'field' and we don't have the `fn` function\n // and the operator is one of the \"doesNot*\" ones\n (!fn && ['doesnotcontain', 'doesnotbeginwith', 'doesnotendwith'].includes(operatorLC))))\n ) {\n return;\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const sequelizeOperator = {\n '=': Op.eq,\n '!=': Op.ne,\n '<': Op.lt,\n '<=': Op.lte,\n '>': Op.gt,\n '>=': Op.gte,\n }[operatorLC];\n return {\n [field]:\n valueIsField && operatorLC === '='\n ? { [Op.col]: value }\n : {\n [sequelizeOperator]: valueIsField\n ? col!(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? parseNumber(value, { parseNumbers: 'strict' })\n : value,\n },\n };\n }\n\n case 'contains':\n return { [field]: { [Op.substring]: valueIsField ? col!(value) : `${value}` } };\n\n case 'beginswith':\n return { [field]: { [Op.startsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'endswith':\n return { [field]: { [Op.endsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'doesnotcontain':\n return {\n [field]: {\n [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value), '%') : `%${value}%`,\n },\n };\n\n case 'doesnotbeginwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', col!(value), '%') : `${value}%` },\n };\n\n case 'doesnotendwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value)) : `%${value}` },\n };\n\n case 'null':\n return { [field]: { [Op.is]: null } };\n\n case 'notnull':\n return { [field]: { [Op.not]: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [operatorLC === 'in' ? Op.in : Op.notIn]: valueAsArray.map(val =>\n valueIsField\n ? col!(val)\n : shouldRenderAsNumber(val, parseNumbers)\n ? parseNumber(val, { parseNumbers: 'strict' })\n : val\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return;\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? first : firstNum;\n const secondValue = Number.isNaN(secondNum) ? second : secondNum;\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return {\n [field]: {\n [operatorLC === 'between' ? Op.between : Op.notBetween]: valueIsField\n ? valsOneAndTwoOnly.map(v => col!(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly,\n },\n };\n }\n }\n return;\n};\n","import { produce } from 'immer';\nimport type { SetOptional } from 'type-fest';\nimport { defaultPlaceholderFieldName, defaultPlaceholderOperatorName } from '../../defaults';\nimport type {\n ExportFormat,\n ExportObjectFormats,\n FormatQueryFinalOptions,\n FormatQueryOptions,\n FullField,\n FullOperator,\n FullOptionList,\n InputType,\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleProcessor,\n RuleType,\n RuleValidator,\n SQLPreset,\n ValidationMap,\n ValidationResult,\n ValueProcessorByRule,\n} from '../../types';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { lc } from '../misc';\nimport { toFlatOptionArray, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { defaultRuleGroupProcessorElasticSearch } from './defaultRuleGroupProcessorElasticSearch';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { defaultRuleGroupProcessorLDAP } from './defaultRuleGroupProcessorLDAP';\nimport { defaultRuleGroupProcessorMongoDB } from './defaultRuleGroupProcessorMongoDB';\nimport {\n defaultRuleGroupProcessorMongoDBQuery,\n mongoDbFallback,\n} from './defaultRuleGroupProcessorMongoDBQuery';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultRuleGroupProcessorPrisma, prismaFallback } from './defaultRuleGroupProcessorPrisma';\nimport { defaultRuleGroupProcessorSequelize } from './defaultRuleGroupProcessorSequelize';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\nimport { defaultRuleProcessorElasticSearch } from './defaultRuleProcessorElasticSearch';\nimport { defaultRuleProcessorJSONata } from './defaultRuleProcessorJSONata';\nimport { defaultRuleProcessorJsonLogic } from './defaultRuleProcessorJsonLogic';\nimport { defaultRuleProcessorLDAP } from './defaultRuleProcessorLDAP';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\nimport { defaultOperatorProcessorNL, defaultRuleProcessorNL } from './defaultRuleProcessorNL';\nimport { defaultRuleProcessorParameterized } from './defaultRuleProcessorParameterized';\nimport { defaultRuleProcessorPrisma } from './defaultRuleProcessorPrisma';\nimport { defaultRuleProcessorSequelize } from './defaultRuleProcessorSequelize';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultOperatorProcessorSQL, defaultRuleProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport {\n bigIntJsonStringifyReplacer,\n getQuoteFieldNamesWithArray,\n isValueProcessorLegacy,\n numerifyValues,\n} from './utils';\n\n/**\n * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.\n *\n * @group Export\n */\nexport const sqlDialectPresets: Record<SQLPreset, FormatQueryOptions> = {\n ansi: {}, // This should always be empty\n sqlite: {\n paramsKeepPrefix: true,\n },\n oracle: {},\n mssql: {\n concatOperator: '+',\n quoteFieldNamesWith: ['[', ']'],\n fieldIdentifierSeparator: '.',\n paramPrefix: '@',\n },\n mysql: {\n concatOperator: 'CONCAT',\n },\n postgresql: {\n quoteFieldNamesWith: '\"',\n numberedParams: true,\n paramPrefix: '$',\n },\n};\n\n/**\n * A collection of option presets for {@link formatQuery}.\n *\n * @group Export\n */\nexport const formatQueryOptionPresets: Record<string, FormatQueryOptions> = {\n ...sqlDialectPresets,\n};\n\nconst defaultRuleProcessors = {\n cel: defaultRuleProcessorCEL,\n drizzle: defaultRuleProcessorDrizzle,\n elasticsearch: defaultRuleProcessorElasticSearch,\n json_without_ids: defaultRuleProcessorSQL,\n json: defaultRuleProcessorSQL,\n jsonata: defaultRuleProcessorJSONata,\n jsonlogic: defaultRuleProcessorJsonLogic,\n ldap: defaultRuleProcessorLDAP,\n mongodb_query: defaultRuleProcessorMongoDBQuery,\n mongodb: defaultRuleProcessorMongoDB,\n natural_language: defaultRuleProcessorNL,\n parameterized_named: defaultRuleProcessorParameterized,\n parameterized: defaultRuleProcessorParameterized,\n prisma: defaultRuleProcessorPrisma,\n sequelize: defaultRuleProcessorSequelize,\n spel: defaultRuleProcessorSpEL,\n sql: defaultRuleProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\n/* istanbul ignore next */\nconst defaultOperatorProcessor: RuleProcessor = r => r.operator;\nconst defaultOperatorProcessors = {\n cel: defaultOperatorProcessor,\n drizzle: defaultOperatorProcessor,\n elasticsearch: defaultOperatorProcessor,\n json_without_ids: defaultOperatorProcessor,\n json: defaultOperatorProcessor,\n jsonata: defaultOperatorProcessor,\n jsonlogic: defaultOperatorProcessor,\n ldap: defaultOperatorProcessor,\n mongodb_query: defaultOperatorProcessor,\n mongodb: defaultOperatorProcessor,\n natural_language: defaultOperatorProcessorNL,\n parameterized_named: defaultOperatorProcessorSQL,\n parameterized: defaultOperatorProcessorSQL,\n prisma: defaultOperatorProcessor,\n sequelize: defaultOperatorProcessor,\n spel: defaultOperatorProcessor,\n sql: defaultOperatorProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\nconst defaultFallbackExpressions: Partial<Record<ExportFormat, string>> = {\n cel: '1 == 1',\n ldap: '',\n mongodb: '\"$and\":[{\"$expr\":true}]',\n natural_language: '1 is 1',\n spel: '1 == 1',\n sql: '(1 = 1)',\n};\n\ntype MostFormatQueryOptions = SetOptional<\n Required<FormatQueryOptions>,\n | 'context'\n | 'fallbackExpression'\n | 'operatorProcessor'\n | 'ruleGroupProcessor'\n | 'ruleProcessor'\n | 'validator'\n | 'valueProcessor'\n | 'placeholderValueName'\n | 'parseNumbers'\n>;\n\nconst defaultFormatQueryOptions = {\n format: 'json',\n fields: [] as FullOptionList<FullField>,\n quoteFieldNamesWith: ['', ''],\n fieldIdentifierSeparator: '',\n getOperators: () => [] as FullOptionList<FullOperator>,\n paramPrefix: ':',\n paramsKeepPrefix: false,\n numberedParams: false,\n preserveValueOrder: false,\n placeholderFieldName: defaultPlaceholderFieldName,\n placeholderOperatorName: defaultPlaceholderOperatorName,\n quoteValuesWith: \"'\",\n concatOperator: '||',\n preset: 'ansi',\n wordOrder: 'SVO',\n translations: {},\n operatorMap: {},\n} satisfies MostFormatQueryOptions;\n\nconst valueProcessorCanActAsRuleProcessor = new Set<ExportFormat>([\n 'cel',\n 'drizzle',\n 'elasticsearch',\n 'jsonata',\n 'jsonlogic',\n 'ldap',\n 'mongodb_query',\n 'mongodb',\n 'prisma',\n 'sequelize',\n 'spel',\n]);\n\nconst sqlFormats = new Set<ExportFormat>([\n 'sql',\n 'parameterized',\n 'parameterized_named',\n 'drizzle',\n 'prisma',\n 'sequelize',\n]);\n\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny): string;\n/**\n * Generates a result based on the provided rule group processor.\n *\n * @group Export\n */\nfunction formatQuery<TResult = unknown>(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { ruleGroupProcessor: RuleGroupProcessor<TResult> }\n): TResult;\n/**\n * Generates a {@link index!ParameterizedSQL ParameterizedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized' | (FormatQueryOptions & { format: 'parameterized' })\n): ParameterizedSQL;\n/**\n * Generates a {@link index!ParameterizedNamedSQL ParameterizedNamedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized_named' | (FormatQueryOptions & { format: 'parameterized_named' })\n): ParameterizedNamedSQL;\n/**\n * Generates a {@link index!RQBJsonLogic JsonLogic} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonlogic' | (FormatQueryOptions & { format: 'jsonlogic' })\n): RQBJsonLogic;\n/**\n * Generates an ElasticSearch query object from an RQB query object.\n *\n * NOTE: Support for the ElasticSearch format is experimental.\n * You may have better results exporting \"sql\" format then using\n * [ElasticSearch SQL](https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html).\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'elasticsearch' | (FormatQueryOptions & { format: 'elasticsearch' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb\" format, but returns a JSON object\n * instead of a string.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb_query' | (FormatQueryOptions & { format: 'mongodb_query' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a JSON.stringify'd MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb_query\" format, but returns a string\n * instead of a JSON object.\n *\n * @deprecated Use the \"mongodb_query\" format for greater flexibility.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb' | (FormatQueryOptions & { format: 'mongodb' })\n): string;\n/**\n * Generates a Prisma ORM query object from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'prisma' | (FormatQueryOptions & { format: 'prisma' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a Drizzle ORM query function from an RQB query object. The function can\n * be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'drizzle' | (FormatQueryOptions & { format: 'drizzle' })\n): ReturnType<typeof defaultRuleGroupProcessorDrizzle>;\n/**\n * Generates a Sequelize query object from an RQB query object. The object can\n * be assigned to the `where` property in the Sequelize query functions.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'sequelize' | (FormatQueryOptions & { format: 'sequelize' })\n): ReturnType<typeof defaultRuleGroupProcessorSequelize>;\n/**\n * Generates a JSONata query string from an RQB query object.\n *\n * NOTE: Either `parseNumbers: \"strict-limited\"` or `parseNumbers: true`\n * are recommended for this format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonata' | (FormatQueryOptions & { format: 'jsonata' })\n): string;\n/**\n * Generates an LDAP query string from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'ldap' | (FormatQueryOptions & { format: 'ldap' })\n): string;\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny, options: FormatQueryOptions): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: Exclude<ExportFormat, ExportObjectFormats>\n): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { format: Exclude<ExportFormat, ExportObjectFormats> }\n): string;\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n optionParam: FormatQueryOptions | ExportFormat = {}\n) {\n const options = typeof optionParam === 'string' ? { format: lc(optionParam) } : optionParam;\n\n const optObj: MostFormatQueryOptions = {\n ...defaultFormatQueryOptions,\n ...(!options.format || sqlFormats.has(options.format)\n ? (sqlDialectPresets[options.preset ?? 'ansi'] ?? null)\n : null),\n ...options,\n ...(!options.format &&\n (Object.keys(sqlDialectPresets).includes(options.preset ?? '') ? { format: 'sql' } : null)),\n };\n\n const format = lc(optObj.format);\n\n const {\n fallbackExpression: fallbackExpression_option,\n getOperators: getOperators_option,\n operatorProcessor: operatorProcessor_option,\n parseNumbers,\n quoteFieldNamesWith: quoteFieldNamesWith_option,\n ruleGroupProcessor: ruleGroupProcessor_option,\n ruleProcessor: ruleProcessor_option,\n validator,\n valueProcessor: valueProcessor_option,\n context,\n } = optObj;\n\n const getParseNumberBoolean = (inputType?: InputType | null): boolean | undefined => {\n const parseNumberMethod = getParseNumberMethod({ parseNumbers, inputType });\n return typeof parseNumberMethod === 'string'\n ? true\n : typeof parseNumbers === 'boolean'\n ? parseNumbers\n : undefined;\n };\n\n const operatorProcessor =\n typeof operatorProcessor_option === 'function'\n ? operatorProcessor_option\n : (defaultOperatorProcessors[format] ?? defaultOperatorProcessor);\n\n const valueProcessor: ValueProcessorByRule =\n typeof valueProcessor_option === 'function'\n ? isValueProcessorLegacy(valueProcessor_option)\n ? r => valueProcessor_option(r.field, r.operator, r.value, r.valueSource)\n : valueProcessor_option\n : format === 'natural_language'\n ? defaultValueProcessorNL\n : valueProcessorCanActAsRuleProcessor.has(format)\n ? (ruleProcessor_option ?? defaultRuleProcessors[format])\n : defaultValueProcessorByRule;\n\n const ruleProcessor =\n (typeof ruleProcessor_option === 'function' ? ruleProcessor_option : null) ??\n (valueProcessorCanActAsRuleProcessor.has(format) &&\n typeof ruleProcessor_option !== 'function' &&\n valueProcessor_option\n ? valueProcessor\n : null) ??\n defaultRuleProcessors[format] ??\n defaultRuleProcessorSQL;\n\n const quoteFieldNamesWith = getQuoteFieldNamesWithArray(quoteFieldNamesWith_option);\n const fields = toFullOptionList(optObj.fields) as FullOptionList<FullField>;\n const getOperators: FormatQueryOptions['getOperators'] = (f, m) =>\n toFullOptionList(getOperators_option(f, m) ?? /* istanbul ignore next */ []);\n\n const fallbackExpression =\n fallbackExpression_option ??\n defaultFallbackExpressions[format] ??\n defaultFallbackExpressions.sql!;\n\n // #region Validation\n let validationMap: ValidationMap = {};\n\n // istanbul ignore else\n if (typeof validator === 'function') {\n const validationResult = validator(ruleGroup);\n if (typeof validationResult === 'boolean') {\n // istanbul ignore else\n if (!validationResult) {\n return format === 'parameterized'\n ? { sql: fallbackExpression, params: [] }\n : format === 'parameterized_named'\n ? { sql: fallbackExpression, params: {} }\n : format === 'mongodb'\n ? `{${fallbackExpression}}`\n : format === 'mongodb_query'\n ? mongoDbFallback\n : format === 'prisma'\n ? prismaFallback\n : format === 'jsonlogic'\n ? false\n : format === 'elasticsearch'\n ? {}\n : format === 'drizzle' || format === 'sequelize'\n ? undefined\n : fallbackExpression;\n }\n } else {\n validationMap = validationResult;\n }\n }\n\n const validatorMap: Record<string, RuleValidator> = {};\n const uniqueFields = toFlatOptionArray(fields) satisfies FullField[];\n for (const f of uniqueFields) {\n // istanbul ignore else\n if (typeof f.validator === 'function') {\n validatorMap[f.value ?? /* istanbul ignore next */ f.name] = f.validator;\n }\n }\n\n const validateRule = (rule: RuleType) => {\n let validationResult: boolean | ValidationResult | undefined;\n let fieldValidator: RuleValidator | undefined;\n if (rule.id) {\n validationResult = validationMap[rule.id];\n }\n if (uniqueFields.length > 0) {\n const fieldArr = uniqueFields.filter(f => f.name === rule.field);\n if (fieldArr.length > 0) {\n const field = fieldArr[0];\n // istanbul ignore else\n if (typeof field.validator === 'function') {\n fieldValidator = field.validator;\n }\n }\n }\n return [validationResult, fieldValidator] as const;\n };\n // #endregion\n\n const finalOptions: FormatQueryFinalOptions = {\n ...optObj,\n fallbackExpression,\n fields,\n format,\n getOperators,\n getParseNumberBoolean,\n quoteFieldNamesWith,\n operatorProcessor,\n ruleProcessor,\n valueProcessor,\n validateRule,\n validationMap,\n context,\n };\n\n if (typeof ruleGroupProcessor_option === 'function') {\n return ruleGroupProcessor_option(ruleGroup, finalOptions);\n }\n\n switch (format) {\n case 'json':\n case 'json_without_ids': {\n const rg = parseNumbers\n ? produce(ruleGroup, g => numerifyValues(g, finalOptions))\n : ruleGroup;\n if (format === 'json_without_ids') {\n return JSON.stringify(rg, (key, value) =>\n // Remove `id` and `path` keys; leave everything else unchanged.\n key === 'id' || key === 'path' ? undefined : bigIntJsonStringifyReplacer(key, value)\n );\n }\n return JSON.stringify(rg, bigIntJsonStringifyReplacer, 2);\n }\n\n case 'sql':\n return defaultRuleGroupProcessorSQL(ruleGroup, finalOptions);\n\n case 'parameterized':\n case 'parameterized_named':\n return defaultRuleGroupProcessorParameterized(ruleGroup, finalOptions);\n\n case 'mongodb':\n return defaultRuleGroupProcessorMongoDB(ruleGroup, finalOptions);\n\n case 'mongodb_query':\n return defaultRuleGroupProcessorMongoDBQuery(ruleGroup, finalOptions);\n\n case 'cel':\n return defaultRuleGroupProcessorCEL(ruleGroup, finalOptions);\n\n case 'spel':\n return defaultRuleGroupProcessorSpEL(ruleGroup, finalOptions);\n\n case 'jsonata':\n return defaultRuleGroupProcessorJSONata(ruleGroup, finalOptions);\n\n case 'jsonlogic':\n return defaultRuleGroupProcessorJsonLogic(ruleGroup, finalOptions);\n\n case 'elasticsearch':\n return defaultRuleGroupProcessorElasticSearch(ruleGroup, finalOptions);\n\n case 'natural_language':\n return defaultRuleGroupProcessorNL(ruleGroup, finalOptions);\n\n case 'ldap':\n return defaultRuleGroupProcessorLDAP(ruleGroup, finalOptions);\n\n case 'prisma':\n return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);\n\n case 'drizzle':\n return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);\n\n case 'sequelize':\n return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);\n\n default:\n return '';\n }\n}\n\nexport { formatQuery };\n","/**\n * Converts a given query object into one of the supported {@link index!ExportFormat ExportFormat} formats.\n *\n * @module formatQuery\n */\n\nimport type { RuleProcessor, ValueProcessorByRule, ValueProcessorLegacy } from '../../types';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\n\nconst generateValueProcessor =\n (vpbr: ValueProcessorByRule): ValueProcessorLegacy =>\n (field, operator, value, valueSource) =>\n vpbr({ field, operator, value, valueSource }, { parseNumbers: false });\n// TODO: Deprecate defaultValueProcessor.\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultValueProcessorByRule\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultMongoDBValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultRuleProcessorMongoDB\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultCELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorCEL);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultSpELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorSpEL);\n\nexport * from './defaultRuleGroupProcessorCEL';\nexport * from './defaultRuleGroupProcessorDrizzle';\nexport * from './defaultRuleGroupProcessorElasticSearch';\nexport * from './defaultRuleGroupProcessorJSONata';\nexport * from './defaultRuleGroupProcessorJsonLogic';\nexport * from './defaultRuleGroupProcessorLDAP';\nexport * from './defaultRuleGroupProcessorMongoDB';\nexport * from './defaultRuleGroupProcessorMongoDBQuery';\nexport * from './defaultRuleGroupProcessorNL';\nexport * from './defaultRuleGroupProcessorParameterized';\nexport * from './defaultRuleGroupProcessorPrisma';\nexport * from './defaultRuleGroupProcessorSequelize';\nexport * from './defaultRuleGroupProcessorSpEL';\nexport * from './defaultRuleGroupProcessorSQL';\nexport * from './defaultRuleProcessorDrizzle';\nexport * from './defaultRuleProcessorElasticSearch';\nexport * from './defaultRuleProcessorJSONata';\nexport * from './defaultRuleProcessorJsonLogic';\nexport * from './defaultRuleProcessorLDAP';\nexport * from './defaultRuleProcessorMongoDBQuery';\nexport * from './defaultRuleProcessorNL';\nexport * from './defaultRuleProcessorParameterized';\nexport * from './defaultRuleProcessorPrisma';\nexport * from './defaultRuleProcessorSequelize';\nexport * from './defaultRuleProcessorSQL';\nexport * from './defaultValueProcessorNL';\nexport * from './formatQuery';\nexport * from './utils';\nexport {\n defaultRuleProcessorCEL,\n defaultRuleProcessorMongoDB,\n defaultRuleProcessorSpEL,\n defaultValueProcessorByRule,\n};\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorCELByRule: RuleProcessor = defaultRuleProcessorCEL;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultValueProcessorMongoDBByRule: RuleProcessor = defaultRuleProcessorMongoDB;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorSpELByRule: RuleProcessor = defaultRuleProcessorSpEL;\n"],"mappings":"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"}
1
+ {"version":3,"file":"formatQuery.mjs","names":["defaultRuleGroupProcessorCEL: RuleGroupProcessor<string>","shouldNegate","defaultRuleProcessorCEL: RuleProcessor","defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor","expressions: Record<string, unknown>[]","processNumber","defaultRuleProcessorMongoDBQuery: RuleProcessor","defaultRuleProcessorMongoDB: RuleProcessor","defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string>","shouldNegate","negate","defaultRuleProcessorSpEL: RuleProcessor","escapeStringValueQuotes","defaultValueProcessorByRule: ValueProcessorByRule","defaultRuleProcessorDrizzle: RuleProcessor","defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n>","ruleGroupSQL: SQL | undefined","defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>>","defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string>","defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic>","jsonRuleGroup: RQBJsonLogic","defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string>","rules: string[]","defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string>","expressions: string[]","defaultRuleGroupProcessorNL: RuleGroupProcessor<string>","defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n>","params: any[]","paramsNamed: Record<string, any>","fieldParams: Map<string, Set<string>>","defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSQL: RuleGroupProcessor<string>","negateIfNotOp","textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>>","defaultRuleProcessorElasticSearch: RuleProcessor","negate","defaultRuleProcessorJSONata: RuleProcessor","defaultRuleProcessorJsonLogic: RuleProcessor","fieldObject: JsonLogicVar","negate","defaultRuleProcessorLDAP: RuleProcessor","defaultValueProcessorNL: ValueProcessorByRule","defaultExportOperatorMap: ExportOperatorMap","defaultOperatorProcessorNL: RuleProcessor","defaultRuleProcessorNL: RuleProcessor","defaultOperatorProcessorSQL: RuleProcessor","defaultRuleProcessorSQL: RuleProcessor","defaultRuleProcessorParameterized: RuleProcessor","params: any[]","paramsNamed: Record<string, any>","inParams: string[]","defaultRuleProcessorPrisma: RuleProcessor","defaultRuleProcessorSequelize: RuleProcessor","sqlDialectPresets: Record<SQLPreset, FormatQueryOptions>","formatQueryOptionPresets: Record<string, FormatQueryOptions>","defaultOperatorProcessor: RuleProcessor","defaultFallbackExpressions: Partial<Record<ExportFormat, string>>","optObj: MostFormatQueryOptions","valueProcessor: ValueProcessorByRule","getOperators: FormatQueryOptions['getOperators']","validationMap: ValidationMap","validatorMap: Record<string, RuleValidator>","validationResult: boolean | ValidationResult | undefined","fieldValidator: RuleValidator | undefined","finalOptions: FormatQueryFinalOptions","defaultValueProcessor: ValueProcessorLegacy","defaultMongoDBValueProcessor: ValueProcessorLegacy","defaultCELValueProcessor: ValueProcessorLegacy","defaultSpELValueProcessor: ValueProcessorLegacy","defaultValueProcessorCELByRule: RuleProcessor","defaultValueProcessorMongoDBByRule: RuleProcessor","defaultValueProcessorSpELByRule: RuleProcessor"],"sources":["../src/utils/isRuleOrGroupValid.ts","../src/utils/formatQuery/defaultRuleGroupProcessorCEL.ts","../src/utils/formatQuery/defaultRuleProcessorCEL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSpEL.ts","../src/utils/formatQuery/defaultRuleProcessorSpEL.ts","../src/utils/formatQuery/defaultValueProcessorByRule.ts","../src/utils/formatQuery/defaultRuleProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleGroupProcessorLDAP.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorNL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleGroupProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSequelize.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleProcessorLDAP.ts","../src/utils/formatQuery/defaultValueProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleProcessorSequelize.ts","../src/utils/formatQuery/formatQuery.ts","../src/utils/formatQuery/index.ts"],"sourcesContent":["import type { RuleGroupTypeAny, RuleType, RuleValidator, ValidationResult } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is useful as a validation result.\n */\nexport const isValidationResult = (vr?: ValidationResult): vr is ValidationResult =>\n isPojo(vr) && typeof vr.valid === 'boolean';\n\n/**\n * Determines if a rule or group is valid based on a validation result (if defined)\n * or a validator function. Returns `true` if neither are defined and the `muted`\n * property is not `true`.\n */\nexport const isRuleOrGroupValid = (\n rg: RuleType | RuleGroupTypeAny,\n validationResult?: boolean | ValidationResult,\n validator?: RuleValidator\n): boolean => {\n if (rg.muted) {\n return false;\n }\n if (typeof validationResult === 'boolean') {\n return validationResult;\n }\n if (isValidationResult(validationResult)) {\n return validationResult.valid;\n }\n if (typeof validator === 'function' && !isRuleGroup(rg)) {\n const vr = validator(rg);\n if (typeof vr === 'boolean') {\n return vr;\n }\n // istanbul ignore else\n if (isValidationResult(vr)) {\n return vr.valid;\n }\n }\n return true;\n};\n","import type { DefaultCombinatorName, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { celCombinatorMap } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorCEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = celCombinatorMap[rule as DefaultCombinatorName];\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(\n isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator as DefaultCombinatorName]} ` : ' '\n );\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeDoubleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorCEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const celQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: `${arrayElementAlias}${r.field ? `.${r.field}` : ''}` }),\n });\n const nestedArrayFilter = defaultRuleGroupProcessorCEL(\n celQuery,\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `${field}.all(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'none':\n case 'some':\n return `${mode === 'none' ? '!' : ''}${field}.exists(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const totalCount = `double(${field}.size())`;\n const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;\n\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n }`;\n\n case 'contains':\n case 'doesnotcontain': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.contains(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.startsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.endsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const [prefix, suffix] = shouldNegate(operatorTL) ? ['!(', ')'] : ['', ''];\n const valueAsArray = toArray(value);\n return `${prefix}${field} in [${valueAsArray\n .map(val =>\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `\"${escapeDoubleQuotes(val, escapeQuotes)}\"`\n )\n .join(', ')}]${suffix}`;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `\"${escapeDoubleQuotes(first, escapeQuotes)}\"`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `\"${escapeDoubleQuotes(second, escapeQuotes)}\"`\n : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} && ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} || ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const mongoDbFallback = { $and: [{ $expr: true }] } as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? mongoDbFallback : false;\n }\n\n const combinator = `$${lc(rg.combinator)}`;\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return false;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : mongoDbFallback;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorMongoDBQuery } from './defaultRuleGroupProcessorMongoDBQuery';\nimport { isValidValue, mongoOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers = false) =>\n shouldRenderAsNumber(value, parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: 'strict' }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDBQuery: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder, context } = options;\n const valueIsField = valueSource === 'field';\n\n const { avoidFieldsAsKeys } = (context ?? {}) as { avoidFieldsAsKeys?: boolean };\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = { $size: { $ifNull: [`$${field}`, []] } };\n const subQueryNoAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `${field}.${r.field}` : field }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: false },\n }\n );\n const subQueryWithAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$item.${r.field}` : '$item' }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: true },\n }\n );\n\n const filteredCount = {\n $size: {\n $ifNull: [\n { $filter: { input: `$${field}`, as: 'item', cond: { $and: [subQueryWithAggCtx] } } },\n [],\n ],\n },\n };\n\n switch (mode) {\n case 'all':\n return { $expr: { $eq: [filteredCount, totalCount] } };\n\n case 'none':\n return { $nor: [subQueryNoAggCtx] };\n\n case 'some':\n return subQueryNoAggCtx;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op =\n mode === 'atleast'\n ? mongoOperators['>=']\n : mode === 'atmost'\n ? mongoOperators['<=']\n : mongoOperators['='];\n\n if (threshold > 0 && threshold < 1) {\n return { $expr: { [op]: [filteredCount, { $multiply: [totalCount, threshold] }] } };\n }\n return { $expr: { [op]: [filteredCount, threshold] } };\n }\n }\n }\n\n if (operator === '=' && !valueIsField) {\n return avoidFieldsAsKeys\n ? { $eq: [`$${field}`, processNumber(value, value, parseNumbers)] }\n : { [field]: processNumber(value, value, parseNumbers) };\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=': {\n const mongoOperator = mongoOperators[operatorLC];\n return valueIsField\n ? { [mongoOperator]: [`$${field}`, `$${value}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [\n { $ne: [`$${field}`, null] },\n { [mongoOperator]: [`$${field}`, processNumber(value, value, parseNumbers)] },\n ],\n }\n : { [field]: { [mongoOperator]: processNumber(value, value, parseNumbers) } };\n }\n\n case 'contains':\n return valueIsField\n ? { $where: `this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: value } }\n : { [field]: { $regex: value } };\n\n case 'beginswith':\n return valueIsField\n ? { $where: `this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `^${value}` } }\n : { [field]: { $regex: `^${value}` } };\n\n case 'endswith':\n return valueIsField\n ? { $where: `this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `${value}$` } }\n : { [field]: { $regex: `${value}$` } };\n\n case 'doesnotcontain':\n return valueIsField\n ? { $where: `!this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: value } } }\n : { [field]: { $not: { $regex: value } } };\n\n case 'doesnotbeginwith':\n return valueIsField\n ? { $where: `!this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `^${value}` } } }\n : { [field]: { $not: { $regex: `^${value}` } } };\n\n case 'doesnotendwith':\n return valueIsField\n ? { $where: `!this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `${value}$` } } }\n : { [field]: { $not: { $regex: `${value}$` } } };\n\n case 'null':\n return avoidFieldsAsKeys ? { $eq: [`$${field}`, null] } : { [field]: null };\n\n case 'notnull':\n return avoidFieldsAsKeys ? { $ne: [`$${field}`, null] } : { [field]: { $ne: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return valueIsField\n ? {\n $where: `${operatorLC === 'notin' ? '!' : ''}[${valueAsArray\n .map(val => `this.${val}`)\n .join(',')}].includes(this.${field})`,\n }\n : avoidFieldsAsKeys\n ? operatorLC === 'notin'\n ? {\n $not: {\n [mongoOperators.in]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n },\n }\n : {\n [mongoOperators[operatorLC]]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n }\n : {\n [field]: {\n [mongoOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n const firstNum = processNumber(first, Number.NaN, true);\n const secondNum = processNumber(second, Number.NaN, true);\n let firstValue = valueIsField ? first : Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = valueIsField ? second : Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n if (operatorLC === 'between') {\n return valueIsField\n ? { $gte: [`$${field}`, `$${firstValue}`], $lte: [`$${field}`, `$${secondValue}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [{ $gte: [`$${field}`, firstValue] }, { $lte: [`$${field}`, secondValue] }],\n }\n : { [field]: { $gte: firstValue, $lte: secondValue } };\n } else {\n return valueIsField\n ? {\n $or: [\n { $lt: [`$${field}`, `$${firstValue}`] },\n { $gt: [`$${field}`, `$${secondValue}`] },\n ],\n }\n : avoidFieldsAsKeys\n ? {\n $or: [{ $lt: [`$${field}`, firstValue] }, { $gt: [`$${field}`, secondValue] }],\n }\n : { $or: [{ [field]: { $lt: firstValue } }, { [field]: { $gt: secondValue } }] };\n }\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleProcessor } from '../../types';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDB: RuleProcessor = (rule, options) => {\n const queryObj = defaultRuleProcessorMongoDBQuery(rule, options);\n return queryObj ? JSON.stringify(queryObj) : '';\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\nconst wrapInNegation = (clause: string, negate: boolean) => (negate ? `!(${clause})` : clause);\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeSingleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\\\'`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSpEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorSpEL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field || '#this' }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n const totalCount = `${field}.size()`;\n const filteredCount = `${field}.?[${nestedArrayFilter}].size()`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} == ${totalCount}`;\n\n case 'none':\n return `${filteredCount} == 0`;\n\n case 'some':\n return `${filteredCount} >= 1`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return wrapInNegation(\n `${field} matches ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`,\n shouldNegate(operatorTL)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const valueTL = valueIsField\n ? `'^'.concat(${trimIfString(value)})`\n : `'${\n (typeof value === 'string' && !value.startsWith('^')) || useBareValue ? '^' : ''\n }${escapeSingleQuotes(value, escapeQuotes)}'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const valueTL = valueIsField\n ? `${trimIfString(value)}.concat('$')`\n : `'${escapeSingleQuotes(value, escapeQuotes)}${\n (typeof value === 'string' && !value.endsWith('$')) || useBareValue ? '$' : ''\n }'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n const valueAsArray = toArray(value);\n return valueAsArray.length > 0\n ? `${negate}(${valueAsArray\n .map(\n val =>\n `${field} == ${\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `'${escapeSingleQuotes(val, escapeQuotes)}'`\n }`\n )\n .join(' or ')})`\n : '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility in SpEL format, between operators should parse numbers\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `'${escapeSingleQuotes(first, escapeQuotes)}'`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `'${escapeSingleQuotes(second, escapeQuotes)}'`\n : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} and ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} or ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n\n return '';\n};\n","import type { ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeStringValueQuotes = (v: any, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorByRule: ValueProcessorByRule = (\n { operator, value, valueSource },\n // istanbul ignore next - defaultRuleProcessorSQL always provides options\n {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith,\n quoteValuesWith,\n concatOperator = '||',\n fieldIdentifierSeparator,\n wrapValueWith = ['', ''],\n translations,\n } = {}\n) => {\n const valueIsField = valueSource === 'field';\n const operatorLowerCase = lc(operator);\n const quoteChar = quoteValuesWith || \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) =>\n `${wrapValueWith[0]}${quoteChar}${v}${quoteChar}${wrapValueWith[1]}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n const concat = (...values: string[]) =>\n concatOperator.toUpperCase() === 'CONCAT'\n ? `CONCAT(${values.join(', ')})`\n : values.join(` ${concatOperator} `);\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `(${valueAsArray\n .map(v =>\n valueIsField\n ? wrapFieldName(v)\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n )\n .join(', ')})`;\n }\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n const secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : second\n : secondNum;\n\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return (\n (\n valueIsField\n ? valsOneAndTwoOnly.map(v => wrapFieldName(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly.map(v => wrapAndEscape(v))\n )\n // Note: `translations` should not be used for SQL.\n // This is only here to support the \"natural_language\" format.\n .join(` ${translations?.and ?? 'and'} `)\n );\n }\n\n case 'contains':\n case 'doesnotcontain':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value), quoteValue('%'))\n : quoteValue(`%${escapeValue(value)}%`);\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return valueIsField\n ? concat(wrapFieldName(value), quoteValue('%'))\n : quoteValue(`${escapeValue(value)}%`);\n\n case 'endswith':\n case 'doesnotendwith':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value))\n : quoteValue(`%${escapeValue(value)}`);\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n return valueIsField\n ? wrapFieldName(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? `${trimIfString(value)}`\n : `${wrapAndEscape(value)}`;\n};\n","import type { Column, Operators, SQL, SQLWrapper } from 'drizzle-orm';\nimport type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"drizzle\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorDrizzle: RuleProcessor = (rule, _options): SQL | undefined => {\n const opts = _options ?? /* istanbul ignore next */ {};\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder, context = {} } = opts;\n const { columns, drizzleOperators, useRawFields } = context as {\n columns: Record<string, Column>;\n drizzleOperators: Operators;\n useRawFields?: boolean;\n };\n\n if (!columns || !drizzleOperators) return;\n\n const {\n between,\n eq,\n gt,\n gte,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n notBetween,\n notInArray,\n notLike,\n sql,\n } = drizzleOperators;\n\n const { field, operator, value, valueSource } = rule;\n // TODO: Improve field validation\n const column =\n useRawFields && /[a-z][a-z0-9]*/i.test(field)\n ? (sql.raw(field) as Exclude<SQLWrapper, SQL.Aliased | Column>)\n : columns[field];\n const operatorLC = lc(operator);\n\n const valueIsField = valueSource === 'field';\n const asFieldOrValue = (v: string) => (valueIsField ? columns[v] : v);\n\n if (!column) return;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts.preset !== 'postgresql') return;\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const sqlQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n });\n\n const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(sqlQuery, {\n ...(opts as FormatQueryFinalOptions),\n context: { ...opts.context, useRawFields: true },\n });\n\n switch (mode) {\n case 'all':\n return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;\n\n case 'none':\n return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'some':\n return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return threshold > 0 && threshold < 1\n ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`\n : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;\n }\n }\n }\n\n switch (operatorLC) {\n case '=':\n return eq(column, asFieldOrValue(value));\n case '!=':\n return ne(column, asFieldOrValue(value));\n case '>':\n return gt(column, asFieldOrValue(value));\n case '<':\n return lt(column, asFieldOrValue(value));\n case '>=':\n return gte(column, asFieldOrValue(value));\n case '<=':\n return lte(column, asFieldOrValue(value));\n case 'beginswith':\n case 'doesnotbeginwith':\n return (operatorLC === 'doesnotbeginwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`\n );\n case 'contains':\n case 'doesnotcontain':\n return (operatorLC === 'doesnotcontain' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`\n );\n case 'endswith':\n case 'doesnotendwith':\n return (operatorLC === 'doesnotendwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`\n );\n case 'null':\n return isNull(column);\n case 'notnull':\n return isNotNull(column);\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => asFieldOrValue(v));\n return operatorLC === 'notin'\n ? notInArray(column, valueAsArray)\n : inArray(column, valueAsArray);\n }\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else {\n // istanbul ignore else\n if (valueIsField) {\n first = asFieldOrValue(first);\n second = asFieldOrValue(second);\n }\n }\n return operatorLC === 'notbetween'\n ? notBetween(column, first, second)\n : between(column, first, second);\n }\n return;\n }\n default:\n return;\n }\n};\n","import type { Column, Operators, SQL, Table } from 'drizzle-orm';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\n\n/**\n * Default rule group processor used by {@link formatQuery} for the \"drizzle\" format. The returned\n * function can be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @example\n * const where = formatQuery(query, 'drizzle');\n * const results = db.query.users.findMany({ where });\n *\n * @returns Function that takes a Drizzle table config and an object of Drizzle operators.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n> =\n (ruleGroup, options, _meta) =>\n (columns: Table | Record<string, Column>, drizzleOperators: Operators) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n validateRule,\n validationMap,\n } = options;\n\n if (!columns || !drizzleOperators) return;\n\n const { and, not, or } = drizzleOperators;\n\n const ruleProcessor = defaultRuleProcessorDrizzle;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): SQL | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n context: { ...options.context, columns, drizzleOperators },\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return;\n }\n\n const ruleGroupSQL: SQL | undefined =\n rg.combinator === 'or' ? or(...processedRules)! : and(...processedRules)!;\n\n return rg.not ? not(ruleGroupSQL) : ruleGroupSQL;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n };\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const processRuleGroup = (rg: RuleGroupType): Record<string, any> | false => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n return {\n bool: rg.not\n ? {\n must_not: /^or$/i.test(rg.combinator)\n ? { bool: { should: processedRules } }\n : processedRules,\n }\n : { [/^or$/i.test(rg.combinator) ? 'should' : 'must']: processedRules },\n };\n };\n\n const processedRuleGroup = processRuleGroup(convertFromIC(ruleGroup));\n return processedRuleGroup === false ? {} : processedRuleGroup;\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '$not' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n DefaultCombinatorName,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupType,\n} from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const query = convertFromIC(ruleGroup);\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): RQBJsonLogic => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n const jsonRuleGroup: RQBJsonLogic = { [rg.combinator]: processedRules } as {\n [k in DefaultCombinatorName]: [RQBJsonLogic, RQBJsonLogic, ...RQBJsonLogic[]];\n };\n\n return rg.not ? { '!': jsonRuleGroup } : jsonRuleGroup;\n };\n\n return processRuleGroup(query, true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const rules: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean);\n\n const expression = rules.join('');\n\n const [notPrefix, notSuffix] = rg.not ? ['(!', ')'] : ['', ''];\n const [prefix, suffix] =\n rules.length > 1\n ? [`${notPrefix}(${rg.combinator === 'or' ? '|' : '&'}`, `)${notSuffix}`]\n : [notPrefix, notSuffix];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\nconst isBracketed = (str: string) => str.startsWith('{') && str.endsWith('}');\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string> = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const combinator = `\"$${lc(rg.combinator)}\"`;\n let hasChildRules = false;\n\n const expressions: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n // Don't wrap in curly braces if the result already is.\n return isBracketed(processedRuleGroup) ? processedRuleGroup : `{${processedRuleGroup}}`;\n }\n return '';\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : `${combinator}:[${expressions.join(',')}]`\n : fallbackExpression;\n };\n\n const processedQuery = processRuleGroup(convertFromIC(ruleGroup), true);\n return isBracketed(processedQuery) ? processedQuery : `{${processedQuery}}`;\n};\n","import type { NLTranslationKey, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { getNLTranslataion } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorNL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n translations,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const rg2 =\n isRuleGroupTypeIC(rg) && rg.rules.some(r => typeof r === 'string' && lc(r) === 'xor')\n ? convertFromIC(rg)\n : rg;\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg2.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = `, ${translations[rule as NLTranslationKey] ?? rule} `;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(\n rule,\n rg2.rules.length === 1 &&\n !(rg2.not || /^xor$/i.test(rg2.combinator ?? /* istanbul ignore next */ ''))\n );\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n const isXOR = lc(rg2.combinator ?? '') === 'xor';\n const combinator = isXOR ? rg2.combinator!.slice(1) : rg2.combinator;\n const mustWrap = rg2.not || !outermostOrLonelyInGroup || (isXOR && processedRules.length > 1);\n\n const [prefixTL, suffixTL] = (['groupPrefix', 'groupSuffix'] as const).map(key =>\n rg2.not\n ? isXOR\n ? getNLTranslataion(key, translations, ['not', 'xor'])\n : getNLTranslataion(key, translations, ['not'])\n : isXOR\n ? getNLTranslataion(key, translations, ['xor'])\n : getNLTranslataion(key, translations)\n );\n\n const prefix = mustWrap ? `${prefixTL} (`.trim() : '';\n const suffix = mustWrap ? `) ${suffixTL}`.trim() : '';\n\n return `${prefix}${processedRules.join(\n isRuleGroupType(rg2) ? `, ${translations[combinator as NLTranslationKey] ?? combinator} ` : ''\n )}${suffix}`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleType,\n} from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { isPojo } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n> = (ruleGroup, options) => {\n const {\n format,\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n const fieldParams: Map<string, Set<string>> = new Map();\n\n const getNextNamedParam = (field: string) => {\n if (!fieldParams.has(field)) {\n fieldParams.set(field, new Set());\n }\n const nextNamedParam = `${field}_${fieldParams.get(field)!.size + 1}`;\n fieldParams.get(field)!.add(nextNamedParam);\n return nextNamedParam;\n };\n\n const processRule = (rule: RuleType) => {\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n\n const fieldData = getOption(fields, rule.field);\n\n const fieldParamNames = Object.fromEntries(\n ([...fieldParams.entries()] as [string, Set<string>][]).map(([f, s]) => [f, [...s]])\n );\n\n const processedRule = ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n getNextNamedParam,\n fieldParamNames,\n fieldData,\n },\n { processedParams: params }\n );\n\n if (!isPojo(processedRule)) {\n return '';\n }\n\n const { sql, params: customParams } = processedRule;\n\n if (typeof sql !== 'string' || !sql) {\n return '';\n }\n\n // istanbul ignore else\n if (format === 'parameterized' && Array.isArray(customParams)) {\n params.push(...customParams);\n } else if (format === 'parameterized_named' && isPojo(customParams)) {\n Object.assign(paramsNamed, customParams);\n // `getNextNamedParam` already adds new params to the list, but a custom\n // rule processor might not call it so we need to make sure we add\n // any new params here.\n for (const p of Object.keys(customParams)) fieldParams.get(rule.field)?.add(p);\n }\n\n return sql;\n };\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const processedRule = processRule(rule);\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n if (parameterized) {\n return { sql: processRuleGroup(ruleGroup, true), params };\n }\n return { sql: processRuleGroup(ruleGroup, true), params: paramsNamed };\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\n// TODO?: make this configurable\nexport const prismaFallback = {} as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n> = (ruleGroup, options) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? prismaFallback : undefined;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : prismaFallback;\n };\n\n const result = processRuleGroup(convertFromIC(ruleGroup), true);\n\n return ruleGroup.not ? { NOT: result } : result;\n};\n","import type { Op as _OpTypes, WhereOptions } from 'sequelize';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\ntype OpTypes = typeof _OpTypes;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined> = (\n ruleGroup,\n options\n) => {\n // istanbul ignore next\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n context = {},\n } = options;\n\n const { sequelizeOperators: Op } = context as {\n sequelizeOperators: OpTypes;\n };\n\n if (!Op) return;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): WhereOptions | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (expressions.length === 0) return;\n\n const result =\n expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [lc(combinator) === 'or' ? Op.or : Op.and]: expressions };\n\n return rg.not ? { [Op.not]: result } : result;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSQL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { DefaultOperatorName, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype RangeOperator = 'gt' | 'gte' | 'lt' | 'lte';\ntype RangeRule = (\n | { gt: string | number }\n | { gte: string | number }\n | { lt: string | number }\n | { lte: string | number }\n) & { [k in RangeOperator]?: string | number };\ntype ElasticSearchRule =\n | { range: Record<string, RangeRule> }\n // oxlint-disable-next-line typescript/no-explicit-any\n | { term: Record<string, any> }\n | { exists: { field: string } }\n | { regexp: { [k: string]: { value: string } } };\ntype ElasticSearchQuery = {\n bool:\n | { filter: { script: { script: string } } }\n | { must: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[] }\n | {\n must_not:\n | ElasticSearchRule\n | ElasticSearchQuery\n | (ElasticSearchRule | ElasticSearchQuery)[];\n }\n | {\n should: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[];\n };\n};\n\nconst rangeOperatorMap = { '<': 'lt', '<=': 'lte', '>': 'gt', '>=': 'gte' } satisfies Record<\n '<' | '<=' | '>' | '>=',\n RangeOperator\n>;\n\nconst negateIfNotOp = (\n op: string,\n elasticSearchRule: ElasticSearchRule\n): ElasticSearchQuery | ElasticSearchRule =>\n op.startsWith('not') || op.startsWith('doesnot')\n ? { bool: { must_not: elasticSearchRule } }\n : elasticSearchRule;\n\nconst escapeSQ = (s: string) => s?.replace(/('|\\\\)/g, `\\\\$1`);\n\nconst textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>> = {\n beginswith: 'startsWith',\n doesnotbeginwith: 'startsWith',\n doesnotcontain: 'contains',\n doesnotendwith: 'endsWith',\n endswith: 'endsWith',\n};\nconst getTextScript = (f: string, o: Lowercase<DefaultOperatorName>, v: string) => {\n const script = `doc['${f}'].value.${textFunctionMap[o] ?? o}(doc['${v}'].value)`;\n return o.startsWith('d') ? `!${script}` : script;\n};\n\n// oxlint-disable-next-line typescript/no-explicit-any\nconst valueRenderer = (v: any, parseNumbers?: boolean) =>\n typeof v === 'boolean'\n ? v\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorElasticSearch: RuleProcessor = (\n rule,\n options = {}\n): ElasticSearchQuery | ElasticSearchRule | false => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const operatorLC = lc(operator) as Lowercase<DefaultOperatorName>;\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return false;\n\n if (valueSource === 'field') {\n // Bail out if not all values are strings\n if (toArray(value).some(v => typeof v !== 'string')) return false;\n\n const fieldForScript = escapeSQ(field);\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=': {\n const operatorForScript = operatorLC === '=' ? '==' : operatorLC;\n const valueForScript = escapeSQ(value);\n return valueForScript\n ? {\n bool: {\n filter: {\n script: {\n script: `doc['${fieldForScript}'].value ${operatorForScript} doc['${valueForScript}'].value`,\n },\n },\n },\n }\n : false;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({\n bool: {\n filter: { script: { script: `doc['${fieldForScript}'].value == doc['${v}'].value` } },\n },\n }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && valueAsArray[0] && valueAsArray[1]) {\n const script = `doc['${fieldForScript}'].value >= doc['${valueAsArray[0]}'].value && doc['${fieldForScript}'].value <= doc['${valueAsArray[1]}'].value`;\n return {\n bool: {\n filter: { script: { script: operatorLC === 'notbetween' ? `!(${script})` : script } },\n },\n };\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n case 'beginswith':\n case 'doesnotbeginwith':\n case 'endswith':\n case 'doesnotendwith': {\n const valueForScript = escapeSQ(value);\n if (!valueForScript) return false;\n const script = getTextScript(fieldForScript, operatorLC, valueForScript);\n return {\n bool: {\n filter: {\n script: {\n script,\n },\n },\n },\n };\n }\n }\n }\n\n switch (operatorLC) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n return {\n range: {\n [field]: {\n [rangeOperatorMap[operatorLC]]: valueRenderer(value, parseNumbers),\n } as RangeRule,\n },\n };\n\n case '=':\n return { term: { [field]: valueRenderer(value, parseNumbers) } };\n\n case '!=':\n return { bool: { must_not: { term: { [field]: valueRenderer(value, parseNumbers) } } } };\n\n case 'null':\n return { bool: { must_not: { exists: { field } } } };\n\n case 'notnull':\n return { exists: { field } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => valueRenderer(v, parseNumbers));\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({ term: { [field]: valueRenderer(v, parseNumbers) } }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n }\n return negateIfNotOp(operatorLC, { range: { [field]: { gte: first, lte: second } } });\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}.*` } } });\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `${value}.*` } } });\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}` } } });\n }\n return false;\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst quote = (v: any, escapeQuotes?: boolean) =>\n `\"${typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`)}\"`;\n\nconst negate = (clause: string, negate: boolean) => (negate ? `$not(${clause})` : clause);\n\nconst escapeStringRegex = (s: string) =>\n `${s}`.replaceAll(/[/$()*+.?[\\\\\\]^{|}]/g, String.raw`\\$&`).replaceAll('-', String.raw`\\x2d`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJSONata: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n } = options;\n\n const valueIsField = valueSource === 'field';\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const qfn = (f: string) =>\n getQuotedFieldName(f, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = `$count(${qfn(field)})`;\n const filteredCount = `$count($filter(${qfn(field)}, function($v) {${defaultRuleGroupProcessorJSONata(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$v.${r.field}` : '$v' }),\n }),\n options as FormatQueryFinalOptions\n )}}))`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} = ${totalCount}`;\n\n case 'none':\n return `${filteredCount} = 0`;\n\n case 'some':\n return `${filteredCount} > 0`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return `${qfn(field)} ${operatorLC} ${\n valueIsField\n ? qfn(trimIfString(value))\n : useBareValue\n ? trimIfString(value)\n : quote(value, escapeQuotes)\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return negate(\n `$contains(${qfn(field)}, ${valueIsField ? qfn(trimIfString(value)) : quote(value, escapeQuotes)})`,\n shouldNegate(operatorLC)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, 0, $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /^${escapeStringRegex(value)}/)`,\n shouldNegate(operatorLC)\n );\n\n case 'endswith':\n case 'doesnotendwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, $length(${qfn(field)}) - $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /${escapeStringRegex(value)}$/)`,\n shouldNegate(operatorLC)\n );\n\n case 'null':\n return `${qfn(field)} = null`;\n\n case 'notnull':\n return `${qfn(field)} != null`;\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negate(\n `${qfn(field)} in [${valueAsArray\n .map(val =>\n valueIsField\n ? `${qfn(trimIfString(val))}`\n : shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : quote(val, escapeQuotes)\n )\n .join(', ')}]`,\n shouldNegate(operatorLC)\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n let secondValue = Number.isNaN(secondNum) ? (valueIsField ? `${second}` : second) : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n const renderAsNumbers =\n shouldRenderAsNumber(first, parseNumbers) && shouldRenderAsNumber(second, parseNumbers);\n const getValueString = (raw: string, val: string | number) =>\n valueIsField ? qfn(raw) : renderAsNumbers ? val : quote(val, escapeQuotes);\n\n const expression = `${qfn(field)} >= ${getValueString(first, firstValue)} and ${qfn(field)} <= ${getValueString(second, secondValue)}`;\n\n return operatorLC === 'between' ? `(${expression})` : negate(expression, true);\n }\n }\n\n return '';\n};\n","import type {\n FormatQueryFinalOptions,\n JsonLogicVar,\n RQBJsonLogic,\n RuleProcessor,\n} from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst convertOperator = (op: '<' | '<=' | '=' | '!=' | '>' | '>=') =>\n op\n .replace(/^(=)$/, '$1=')\n .replace(/^notnull$/i, '!=')\n .replace(/^null$/i, '==') as '<' | '<=' | '==' | '!=' | '===' | '!==' | '>' | '>=';\n\nconst negateIfNotOp = (op: string, jsonRule: RQBJsonLogic) =>\n op.startsWith('not') || op.startsWith('doesnot') ? { '!': jsonRule } : jsonRule;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJsonLogic: RuleProcessor = (rule, options = {}): RQBJsonLogic => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const valueIsField = valueSource === 'field';\n const fieldObject: JsonLogicVar = { var: field };\n const fieldOrNumberRenderer = (v: string) =>\n valueIsField\n ? { var: `${v}` }\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return false;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n switch (mode) {\n case 'all':\n case 'none':\n case 'some':\n return {\n [mode]: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n } as RQBJsonLogic;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n const filteredCount = {\n reduce: [\n {\n filter: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n },\n { '+': [1, { var: 'accumulator' }] },\n 0,\n ],\n };\n\n if (threshold > 0 && threshold < 1) {\n const totalCount = {\n reduce: [{ var: field }, { '+': [1, { var: 'accumulator' }] }, 0],\n };\n return { [op]: [filteredCount, { '*': [totalCount, threshold] }] } as RQBJsonLogic;\n }\n return { [op]: [filteredCount, threshold] } as RQBJsonLogic;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return {\n [convertOperator(operatorLC)]: [fieldObject, fieldOrNumberRenderer(value)],\n } as RQBJsonLogic;\n\n case 'null':\n case 'notnull': {\n return {\n [`${operatorLC === 'notnull' ? '!' : '='}=`]: [fieldObject, null],\n } as RQBJsonLogic;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => fieldOrNumberRenderer(v));\n return negateIfNotOp(operatorLC, { in: [fieldObject, valueAsArray] });\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else if (valueIsField) {\n first = { var: first };\n second = { var: second };\n }\n const jsonRule: RQBJsonLogic = { '<=': [first, fieldObject, second] };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain': {\n const jsonRule: RQBJsonLogic = {\n in: [fieldOrNumberRenderer(value), fieldObject],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const jsonRule: RQBJsonLogic = {\n startsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const jsonRule: RQBJsonLogic = {\n endsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n }\n return false;\n};\n","import type { RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst negateIf = (clause: string, negate: boolean) => (negate ? `(!${clause})` : `${clause}`);\n\nconst ldapEscape = (s: unknown) =>\n `${trimIfString(s)}`.replaceAll(\n /[()&|=<>~*\\\\/]/g,\n (m: string) => `\\\\${m.codePointAt(0)!.toString(16)}`\n );\n\n/**\n * Default rule processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorLDAP: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { preserveValueOrder } = options;\n const operatorLC = lc(operator);\n\n // Bail out if...\n if (\n // This is a field comparison (which LDAP does not support), or\n valueSource === 'field' ||\n // `value` is null/undefined/empty and the operator is not unary, or\n (nullOrUndefinedOrEmpty(value) && operatorLC !== 'null' && operatorLC !== 'notnull') ||\n // a valid `match` property is found (match modes are not supported in this format)\n processMatchMode(rule)\n ) {\n return '';\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n return negateIf(`(${field}=${ldapEscape(value)})`, operatorLC === '!=');\n\n case '>':\n case '>=':\n return `(${field}>=${ldapEscape(value)})`;\n\n case '<':\n case '<=':\n return `(${field}<=${ldapEscape(value)})`;\n\n case 'contains':\n case 'doesnotcontain':\n return negateIf(`(${field}=*${ldapEscape(value)}*)`, operatorLC === 'doesnotcontain');\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIf(`(${field}=${ldapEscape(value)}*)`, operatorLC === 'doesnotbeginwith');\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIf(`(${field}=*${ldapEscape(value)})`, operatorLC === 'doesnotendwith');\n\n case 'null':\n case 'notnull':\n return negateIf(`(${field}=*)`, operatorLC === 'notnull');\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negateIf(\n `(|${valueAsArray.map(val => `(${field}=${ldapEscape(val)})`).join('')})`,\n operatorLC === 'notin'\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true)\n ? parseNumber(first, { parseNumbers: true })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, true)\n ? parseNumber(second, { parseNumbers: true })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return negateIf(\n `(&(${field}>=${ldapEscape(firstValue)})(${field}<=${ldapEscape(secondValue)}))`,\n operatorLC === 'notbetween'\n );\n }\n }\n\n // istanbul ignore next\n return '';\n};\n","import type { FullField, ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\nconst escapeStringValueQuotes = (v: unknown, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : /* istanbul ignore next */ v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorNL: ValueProcessorByRule = (\n rule,\n // istanbul ignore next - defaultRuleProcessorNL always provides options\n opts = {}\n) => {\n const {\n escapeQuotes,\n fields,\n parseNumbers,\n quoteFieldNamesWith,\n quoteValuesWith,\n fieldIdentifierSeparator,\n translations,\n } = opts;\n const valueIsField = rule.valueSource === 'field';\n const operatorLowerCase = lc(rule.operator);\n const quoteChar = quoteValuesWith || /* istanbul ignore next */ \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) => `${quoteChar}${v}${quoteChar}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const t = translations ?? /* istanbul ignore next */ {};\n const orTL = t.or ?? 'or';\n const trueTL = t.true ?? 'true';\n const falseTL = t.false ?? 'false';\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n if (!valueIsField) {\n return defaultValueProcessorByRule(rule, opts);\n }\n\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true })\n .slice(0, 2)\n .map(v =>\n wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n );\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n return defaultValueProcessorByRule({ ...rule, value: valueAsArray }, opts);\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(rule.value);\n if (valueAsArray.length === 0) return '';\n const valStringArray = valueAsArray.map(v =>\n valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n );\n return `${valStringArray.slice(0, -1).join(', ')}${valStringArray.length > 2 ? ',' : ''} ${orTL} ${valStringArray.at(-1)}`;\n }\n }\n\n if (typeof rule.value === 'boolean') {\n return rule.value ? trueTL : falseTL;\n }\n\n return valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], rule.value)?.label ??\n rule.value\n )\n : shouldRenderAsNumber(rule.value, parseNumbers)\n ? `${trimIfString(rule.value)}`\n : `${wrapAndEscape(rule.value)}`;\n};\n","import type {\n DefaultOperatorName,\n ExportOperatorMap,\n FormatQueryFinalOptions,\n FullOption,\n RuleProcessor,\n} from '../../types';\nimport { lc } from '../misc';\nimport { getOption, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport { getQuotedFieldName, normalizeConstituentWordOrder, processMatchMode } from './utils';\n\n/**\n * Default operator map used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultExportOperatorMap: ExportOperatorMap = {\n '=': ['is', 'is the same as the value in'],\n '!=': ['is not', 'is not the same as the value in'],\n '<': ['is less than', 'is less than the value in'],\n '>': ['is greater than', 'is greater than the value in'],\n '<=': ['is less than or equal to', 'is less than or equal to the value in'],\n '>=': ['is greater than or equal to', 'is greater than or equal to the value in'],\n contains: ['contains', 'contains the value in'],\n beginswith: ['starts with', 'starts with the value in'],\n endswith: ['ends with', 'ends with the value in'],\n doesnotcontain: ['does not contain', 'does not contain the value in'],\n doesnotbeginwith: ['does not start with', 'does not start with the value in'],\n doesnotendwith: ['does not end with', 'does not end with the value in'],\n null: 'is null',\n notnull: 'is not null',\n in: ['is one of the values', 'is the same as a value in'],\n notin: ['is not one of the values', 'is not the same as any value in'],\n between: ['is between', 'is between the values in'],\n notbetween: ['is not between', 'is not between the values in'],\n};\n\n/* istanbul ignore next */\nconst defaultGetOperators = () => [];\n\n/**\n * Default operator processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorNL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, valueSource = 'value' } = rule;\n // istanbul ignore next\n const {\n getOperators = defaultGetOperators,\n operatorMap: operatorMapParam = defaultExportOperatorMap,\n } = opts;\n\n const mapOperatorMap = new Map<string, string | [string, string]>(\n Object.entries(defaultExportOperatorMap)\n );\n for (const [key, value] of Object.entries(operatorMapParam)) {\n mapOperatorMap.set(lc(key), value);\n }\n const operatorMap = Object.fromEntries(mapOperatorMap);\n\n const { value: operatorNL, label } = getOption(\n toFullOptionList(\n getOperators(field, {\n fieldData: opts.fieldData ?? {\n name: field,\n value: field,\n label: field,\n },\n }) ?? /* istanbul ignore next */ []\n ) as FullOption[],\n operator\n ) ?? {\n name: operator,\n value: operator,\n label: operator,\n };\n\n const operatorTL = operatorMap[operatorNL as DefaultOperatorName] ??\n operatorMap[lc(operatorNL) as Lowercase<DefaultOperatorName>] ?? [label, label];\n\n return typeof operatorTL === 'string' ? operatorTL : operatorTL[valueSource === 'field' ? 1 : 0];\n};\n\n/**\n * Default rule processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorNL: RuleProcessor = (rule, opts) => {\n const { field, operator } = rule;\n // istanbul ignore next\n const {\n fieldData,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorNL,\n valueProcessor = defaultValueProcessorNL,\n concatOperator = '||',\n wordOrder = 'SVO',\n } = opts ?? /* istanbul ignore next */ {};\n\n const processedField = getQuotedFieldName(fieldData?.label ?? field, {\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorNL(rule.value, {\n ...(opts as FormatQueryFinalOptions),\n fields: toFullOptionList(fieldData?.subproperties ?? []),\n });\n\n // (H)as (S)ub(P)roperties\n const hsp = (fieldData?.subproperties?.length ?? 0) > 0;\n\n switch (mode) {\n case 'all':\n return `(${hsp ? 'for ' : ''}every item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'none':\n return `(${hsp ? 'for ' : ''}no item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'some':\n return `(${hsp ? 'for ' : ''}at least one item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const mm = mode.replace('at', 'at ');\n if (threshold > 0 && threshold < 1) {\n return `(${hsp ? 'for ' : ''}${mm} ${threshold * 100}% of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n return `(${hsp ? 'for ' : ''}${mm} ${threshold} of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operatorLC = lc(operator);\n if (\n (operatorLC === 'in' ||\n operatorLC === 'notin' ||\n operatorLC === 'between' ||\n operatorLC === 'notbetween') &&\n !value\n ) {\n return '';\n }\n\n const processedOperator = operatorProcessor(rule, opts);\n\n const wordOrderMap = {\n S: processedField,\n V: processedOperator,\n O: value,\n };\n\n return normalizeConstituentWordOrder(wordOrder)\n .map(term => `${wordOrderMap[term]}`)\n .join(' ')\n .trim();\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { lc } from '../misc';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, mapSQLOperator, processMatchMode } from './utils';\n\n/**\n * Default operator processor used by {@link formatQuery} for \"sql\" and \"parameterized*\" formats.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorSQL: RuleProcessor = rule => lc(mapSQLOperator(rule.operator));\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSQL: RuleProcessor = (rule, opts = {}) => {\n const {\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n concatOperator = '||',\n } = opts;\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return '';\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const nestedArrayFilter = defaultRuleGroupProcessorSQL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) = array_length(${ruleField}, 1)`;\n\n case 'none':\n return `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'some':\n return `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operator = operatorProcessor(rule, opts);\n\n const operatorLowerCase = lc(operator);\n if (\n (operatorLowerCase === 'in' ||\n operatorLowerCase === 'not in' ||\n operatorLowerCase === 'between' ||\n operatorLowerCase === 'not between') &&\n !value\n ) {\n return '';\n }\n\n return `${ruleField} ${operator} ${value}`.trim();\n};\n","import type { FormatQueryFinalOptions, FullField, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultOperatorProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleProcessorParameterized: RuleProcessor = (rule, opts, meta) => {\n // TODO?: test for this so we don't have to ignore it\n // istanbul ignore next\n const {\n fieldData,\n format,\n getNextNamedParam,\n parseNumbers,\n paramPrefix,\n paramsKeepPrefix,\n numberedParams,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator,\n concatOperator,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n } = opts ?? {};\n\n const { processedParams = [] } = meta ?? {};\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n\n const finalize = (sql: string) =>\n parameterized ? { sql, params } : { sql, params: paramsNamed };\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return finalize('');\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const { sql: nestedSQL, params: nestedParams } = defaultRuleGroupProcessorParameterized(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n { ...(opts as FormatQueryFinalOptions), fields: [] as FullField[] }\n );\n // Ignore the \"parameterized_named\" case because PostgreSQL doesn't support named parameters\n // istanbul ignore else\n if (Array.isArray(nestedParams)) {\n params.push(...nestedParams);\n } else {\n Object.assign(paramsNamed, nestedParams);\n }\n\n switch (mode) {\n case 'all':\n return finalize(\n `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) = array_length(${ruleField}, 1)`\n );\n\n case 'none':\n return finalize(\n `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'some':\n return finalize(\n `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return finalize(\n `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`\n );\n }\n }\n }\n\n const value = valueProcessor(rule, {\n parseNumbers,\n quoteFieldNamesWith,\n concatOperator,\n fieldData,\n format,\n });\n\n const sqlOperator = operatorProcessor(rule, opts);\n const sqlOperatorLowerCase = lc(sqlOperator);\n const [qPre, qPost] = quoteFieldNamesWith;\n\n if (\n (sqlOperatorLowerCase === 'in' ||\n sqlOperatorLowerCase === 'not in' ||\n sqlOperatorLowerCase === 'between' ||\n sqlOperatorLowerCase === 'not between') &&\n !value\n ) {\n return finalize('');\n } else if (sqlOperatorLowerCase === 'is null' || sqlOperatorLowerCase === 'is not null') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator}`);\n } else if (rule.valueSource === 'field') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} ${value}`.trim());\n } else if (sqlOperatorLowerCase === 'in' || sqlOperatorLowerCase === 'not in') {\n const splitValue = toArray(rule.value);\n if (parameterized) {\n for (const v of splitValue) {\n params.push(shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v);\n }\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} (${splitValue\n .map((_v, i) =>\n numberedParams\n ? `${paramPrefix}${processedParams.length + 1 + splitValue.length - (splitValue.length - i)}`\n : '?'\n )\n .join(', ')})`\n );\n }\n const inParams: string[] = [];\n for (const v of splitValue) {\n const thisParamName = getNextNamedParam!(rule.field);\n inParams.push(`${paramPrefix}${thisParamName}`);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${thisParamName}`] = shouldRenderAsNumber(\n v,\n parseNumbers\n )\n ? parseNumber(v, { parseNumbers })\n : v;\n }\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} (${inParams.join(', ')})`);\n } else if (sqlOperatorLowerCase === 'between' || sqlOperatorLowerCase === 'not between') {\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true });\n const [first, second] = valueAsArray\n .slice(0, 2)\n .map(v => (shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v));\n if (parameterized) {\n params.push(first, second);\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n numberedParams ? `${paramPrefix}${processedParams.length + 1}` : '?'\n } and ${numberedParams ? `${paramPrefix}${processedParams.length + 2}` : '?'}`\n );\n }\n const firstParamName = getNextNamedParam!(rule.field);\n const secondParamName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${firstParamName}`] = first;\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${secondParamName}`] = second;\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${paramPrefix}${firstParamName} and ${paramPrefix}${secondParamName}`\n );\n }\n\n let paramValue = rule.value;\n if (typeof rule.value === 'string') {\n if (shouldRenderAsNumber(rule.value, parseNumbers)) {\n paramValue = parseNumber(rule.value, { parseNumbers });\n } else {\n // Note that we're using `value` here, which has been processed through\n // a `valueProcessor`, as opposed to `rule.value` which has not\n paramValue = /^'.*'$/g.test(value)\n ? value.replaceAll(/(^'|'$)/g, '')\n : /* istanbul ignore next */ value;\n }\n }\n\n let paramName = '';\n if (parameterized) {\n params.push(paramValue);\n } else {\n paramName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${paramName}`] = paramValue;\n }\n\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n parameterized\n ? numberedParams\n ? `${paramPrefix}${processedParams.length + 1}`\n : '?'\n : `${paramPrefix}${paramName}`\n }`.trim()\n );\n};\n","import type { ParseNumbersPropConfig, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, prismaOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers?: ParseNumbersPropConfig) =>\n shouldRenderAsNumber(value, !!parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: !!parseNumbers }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorPrisma: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder } = options;\n\n // Neither field-to-field comparisons nor match modes are supported in this format\n if (valueSource === 'field' || processMatchMode(rule)) return;\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '=':\n return { [field]: processNumber(value, value, parseNumbers) };\n\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const prismaOperator = prismaOperators[operatorLC];\n return {\n [field]: {\n [prismaOperator]: processNumber(value, value, parseNumbers),\n },\n };\n }\n\n case 'contains':\n return { [field]: { contains: value } };\n\n case 'beginswith':\n return { [field]: { startsWith: value } };\n\n case 'endswith':\n return { [field]: { endsWith: value } };\n\n case 'doesnotcontain':\n return { NOT: { [field]: { contains: value } } };\n\n case 'doesnotbeginwith':\n return { NOT: { [field]: { startsWith: value } } };\n\n case 'doesnotendwith':\n return { NOT: { [field]: { endsWith: value } } };\n\n case 'null':\n return { [field]: null };\n\n case 'notnull':\n return { [field]: { not: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [prismaOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorLC === 'between'\n ? { [field]: { gte: firstValue, lte: secondValue } }\n : { OR: [{ [field]: { lt: firstValue } }, { [field]: { gt: secondValue } }] };\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { Op as _OpTypes, col as _colType, fn as _fnType } from 'sequelize';\nimport type { Simplify } from 'type-fest';\nimport type { RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype OpTypes = Simplify<typeof _OpTypes>;\ntype ColType = typeof _colType;\ntype FnType = typeof _fnType;\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSequelize: RuleProcessor = (\n rule,\n // istanbul ignore next\n { parseNumbers, preserveValueOrder, context = {} } = {}\n): Record<string, unknown> | undefined => {\n const {\n sequelizeOperators: Op,\n sequelizeCol: col,\n sequelizeFn: fn,\n } = context as {\n sequelizeOperators: OpTypes;\n sequelizeCol?: ColType;\n sequelizeFn?: FnType;\n };\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return;\n\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n\n const operatorLC = lc(operator);\n\n if (\n // Bail out if we don't have the Op symbols\n !Op ||\n // ...or valueSource is 'field' and we don't have the `col` function,\n (valueIsField &&\n (!col ||\n // ...or valueSource is 'field' and we don't have the `fn` function\n // and the operator is one of the \"doesNot*\" ones\n (!fn && ['doesnotcontain', 'doesnotbeginwith', 'doesnotendwith'].includes(operatorLC))))\n ) {\n return;\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const sequelizeOperator = {\n '=': Op.eq,\n '!=': Op.ne,\n '<': Op.lt,\n '<=': Op.lte,\n '>': Op.gt,\n '>=': Op.gte,\n }[operatorLC];\n return {\n [field]:\n valueIsField && operatorLC === '='\n ? { [Op.col]: value }\n : {\n [sequelizeOperator]: valueIsField\n ? col!(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? parseNumber(value, { parseNumbers: 'strict' })\n : value,\n },\n };\n }\n\n case 'contains':\n return { [field]: { [Op.substring]: valueIsField ? col!(value) : `${value}` } };\n\n case 'beginswith':\n return { [field]: { [Op.startsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'endswith':\n return { [field]: { [Op.endsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'doesnotcontain':\n return {\n [field]: {\n [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value), '%') : `%${value}%`,\n },\n };\n\n case 'doesnotbeginwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', col!(value), '%') : `${value}%` },\n };\n\n case 'doesnotendwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value)) : `%${value}` },\n };\n\n case 'null':\n return { [field]: { [Op.is]: null } };\n\n case 'notnull':\n return { [field]: { [Op.not]: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [operatorLC === 'in' ? Op.in : Op.notIn]: valueAsArray.map(val =>\n valueIsField\n ? col!(val)\n : shouldRenderAsNumber(val, parseNumbers)\n ? parseNumber(val, { parseNumbers: 'strict' })\n : val\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return;\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? first : firstNum;\n const secondValue = Number.isNaN(secondNum) ? second : secondNum;\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return {\n [field]: {\n [operatorLC === 'between' ? Op.between : Op.notBetween]: valueIsField\n ? valsOneAndTwoOnly.map(v => col!(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly,\n },\n };\n }\n }\n return;\n};\n","import { produce } from 'immer';\nimport type { SetOptional } from 'type-fest';\nimport { defaultPlaceholderFieldName, defaultPlaceholderOperatorName } from '../../defaults';\nimport type {\n ExportFormat,\n ExportObjectFormats,\n FormatQueryFinalOptions,\n FormatQueryOptions,\n FullField,\n FullOperator,\n FullOptionList,\n InputType,\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleProcessor,\n RuleType,\n RuleValidator,\n SQLPreset,\n ValidationMap,\n ValidationResult,\n ValueProcessorByRule,\n} from '../../types';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { lc } from '../misc';\nimport { toFlatOptionArray, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { defaultRuleGroupProcessorElasticSearch } from './defaultRuleGroupProcessorElasticSearch';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { defaultRuleGroupProcessorLDAP } from './defaultRuleGroupProcessorLDAP';\nimport { defaultRuleGroupProcessorMongoDB } from './defaultRuleGroupProcessorMongoDB';\nimport {\n defaultRuleGroupProcessorMongoDBQuery,\n mongoDbFallback,\n} from './defaultRuleGroupProcessorMongoDBQuery';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultRuleGroupProcessorPrisma, prismaFallback } from './defaultRuleGroupProcessorPrisma';\nimport { defaultRuleGroupProcessorSequelize } from './defaultRuleGroupProcessorSequelize';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\nimport { defaultRuleProcessorElasticSearch } from './defaultRuleProcessorElasticSearch';\nimport { defaultRuleProcessorJSONata } from './defaultRuleProcessorJSONata';\nimport { defaultRuleProcessorJsonLogic } from './defaultRuleProcessorJsonLogic';\nimport { defaultRuleProcessorLDAP } from './defaultRuleProcessorLDAP';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\nimport { defaultOperatorProcessorNL, defaultRuleProcessorNL } from './defaultRuleProcessorNL';\nimport { defaultRuleProcessorParameterized } from './defaultRuleProcessorParameterized';\nimport { defaultRuleProcessorPrisma } from './defaultRuleProcessorPrisma';\nimport { defaultRuleProcessorSequelize } from './defaultRuleProcessorSequelize';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultOperatorProcessorSQL, defaultRuleProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport {\n bigIntJsonStringifyReplacer,\n getQuoteFieldNamesWithArray,\n isValueProcessorLegacy,\n numerifyValues,\n} from './utils';\n\n/**\n * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.\n *\n * @group Export\n */\nexport const sqlDialectPresets: Record<SQLPreset, FormatQueryOptions> = {\n ansi: {}, // This should always be empty\n sqlite: {\n paramsKeepPrefix: true,\n },\n oracle: {},\n mssql: {\n concatOperator: '+',\n quoteFieldNamesWith: ['[', ']'],\n fieldIdentifierSeparator: '.',\n paramPrefix: '@',\n },\n mysql: {\n concatOperator: 'CONCAT',\n },\n postgresql: {\n quoteFieldNamesWith: '\"',\n numberedParams: true,\n paramPrefix: '$',\n },\n};\n\n/**\n * A collection of option presets for {@link formatQuery}.\n *\n * @group Export\n */\nexport const formatQueryOptionPresets: Record<string, FormatQueryOptions> = {\n ...sqlDialectPresets,\n};\n\nconst defaultRuleProcessors = {\n cel: defaultRuleProcessorCEL,\n drizzle: defaultRuleProcessorDrizzle,\n elasticsearch: defaultRuleProcessorElasticSearch,\n json_without_ids: defaultRuleProcessorSQL,\n json: defaultRuleProcessorSQL,\n jsonata: defaultRuleProcessorJSONata,\n jsonlogic: defaultRuleProcessorJsonLogic,\n ldap: defaultRuleProcessorLDAP,\n mongodb_query: defaultRuleProcessorMongoDBQuery,\n mongodb: defaultRuleProcessorMongoDB,\n natural_language: defaultRuleProcessorNL,\n parameterized_named: defaultRuleProcessorParameterized,\n parameterized: defaultRuleProcessorParameterized,\n prisma: defaultRuleProcessorPrisma,\n sequelize: defaultRuleProcessorSequelize,\n spel: defaultRuleProcessorSpEL,\n sql: defaultRuleProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\n/* istanbul ignore next */\nconst defaultOperatorProcessor: RuleProcessor = r => r.operator;\nconst defaultOperatorProcessors = {\n cel: defaultOperatorProcessor,\n drizzle: defaultOperatorProcessor,\n elasticsearch: defaultOperatorProcessor,\n json_without_ids: defaultOperatorProcessor,\n json: defaultOperatorProcessor,\n jsonata: defaultOperatorProcessor,\n jsonlogic: defaultOperatorProcessor,\n ldap: defaultOperatorProcessor,\n mongodb_query: defaultOperatorProcessor,\n mongodb: defaultOperatorProcessor,\n natural_language: defaultOperatorProcessorNL,\n parameterized_named: defaultOperatorProcessorSQL,\n parameterized: defaultOperatorProcessorSQL,\n prisma: defaultOperatorProcessor,\n sequelize: defaultOperatorProcessor,\n spel: defaultOperatorProcessor,\n sql: defaultOperatorProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\nconst defaultFallbackExpressions: Partial<Record<ExportFormat, string>> = {\n cel: '1 == 1',\n ldap: '',\n mongodb: '\"$and\":[{\"$expr\":true}]',\n natural_language: '1 is 1',\n spel: '1 == 1',\n sql: '(1 = 1)',\n};\n\ntype MostFormatQueryOptions = SetOptional<\n Required<FormatQueryOptions>,\n | 'context'\n | 'fallbackExpression'\n | 'operatorProcessor'\n | 'ruleGroupProcessor'\n | 'ruleProcessor'\n | 'validator'\n | 'valueProcessor'\n | 'placeholderValueName'\n | 'parseNumbers'\n>;\n\nconst defaultFormatQueryOptions = {\n format: 'json',\n fields: [] as FullOptionList<FullField>,\n quoteFieldNamesWith: ['', ''],\n fieldIdentifierSeparator: '',\n getOperators: () => [] as FullOptionList<FullOperator>,\n paramPrefix: ':',\n paramsKeepPrefix: false,\n numberedParams: false,\n preserveValueOrder: false,\n placeholderFieldName: defaultPlaceholderFieldName,\n placeholderOperatorName: defaultPlaceholderOperatorName,\n quoteValuesWith: \"'\",\n concatOperator: '||',\n preset: 'ansi',\n wordOrder: 'SVO',\n translations: {},\n operatorMap: {},\n} satisfies MostFormatQueryOptions;\n\nconst valueProcessorCanActAsRuleProcessor = new Set<ExportFormat>([\n 'cel',\n 'drizzle',\n 'elasticsearch',\n 'jsonata',\n 'jsonlogic',\n 'ldap',\n 'mongodb_query',\n 'mongodb',\n 'prisma',\n 'sequelize',\n 'spel',\n]);\n\nconst sqlFormats = new Set<ExportFormat>([\n 'sql',\n 'parameterized',\n 'parameterized_named',\n 'drizzle',\n 'prisma',\n 'sequelize',\n]);\n\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny): string;\n/**\n * Generates a result based on the provided rule group processor.\n *\n * @group Export\n */\nfunction formatQuery<TResult = unknown>(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { ruleGroupProcessor: RuleGroupProcessor<TResult> }\n): TResult;\n/**\n * Generates a {@link index!ParameterizedSQL ParameterizedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized' | (FormatQueryOptions & { format: 'parameterized' })\n): ParameterizedSQL;\n/**\n * Generates a {@link index!ParameterizedNamedSQL ParameterizedNamedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized_named' | (FormatQueryOptions & { format: 'parameterized_named' })\n): ParameterizedNamedSQL;\n/**\n * Generates a {@link index!RQBJsonLogic JsonLogic} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonlogic' | (FormatQueryOptions & { format: 'jsonlogic' })\n): RQBJsonLogic;\n/**\n * Generates an ElasticSearch query object from an RQB query object.\n *\n * NOTE: Support for the ElasticSearch format is experimental.\n * You may have better results exporting \"sql\" format then using\n * [ElasticSearch SQL](https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html).\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'elasticsearch' | (FormatQueryOptions & { format: 'elasticsearch' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb\" format, but returns a JSON object\n * instead of a string.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb_query' | (FormatQueryOptions & { format: 'mongodb_query' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a JSON.stringify'd MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb_query\" format, but returns a string\n * instead of a JSON object.\n *\n * @deprecated Use the \"mongodb_query\" format for greater flexibility.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb' | (FormatQueryOptions & { format: 'mongodb' })\n): string;\n/**\n * Generates a Prisma ORM query object from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'prisma' | (FormatQueryOptions & { format: 'prisma' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a Drizzle ORM query function from an RQB query object. The function can\n * be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'drizzle' | (FormatQueryOptions & { format: 'drizzle' })\n): ReturnType<typeof defaultRuleGroupProcessorDrizzle>;\n/**\n * Generates a Sequelize query object from an RQB query object. The object can\n * be assigned to the `where` property in the Sequelize query functions.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'sequelize' | (FormatQueryOptions & { format: 'sequelize' })\n): ReturnType<typeof defaultRuleGroupProcessorSequelize>;\n/**\n * Generates a JSONata query string from an RQB query object.\n *\n * NOTE: Either `parseNumbers: \"strict-limited\"` or `parseNumbers: true`\n * are recommended for this format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonata' | (FormatQueryOptions & { format: 'jsonata' })\n): string;\n/**\n * Generates an LDAP query string from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'ldap' | (FormatQueryOptions & { format: 'ldap' })\n): string;\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny, options: FormatQueryOptions): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: Exclude<ExportFormat, ExportObjectFormats>\n): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { format: Exclude<ExportFormat, ExportObjectFormats> }\n): string;\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n optionParam: FormatQueryOptions | ExportFormat = {}\n) {\n const options = typeof optionParam === 'string' ? { format: lc(optionParam) } : optionParam;\n\n const optObj: MostFormatQueryOptions = {\n ...defaultFormatQueryOptions,\n ...(!options.format || sqlFormats.has(options.format)\n ? (sqlDialectPresets[options.preset ?? 'ansi'] ?? null)\n : null),\n ...options,\n ...(!options.format &&\n (Object.keys(sqlDialectPresets).includes(options.preset ?? '') ? { format: 'sql' } : null)),\n };\n\n const format = lc(optObj.format);\n\n const {\n fallbackExpression: fallbackExpression_option,\n getOperators: getOperators_option,\n operatorProcessor: operatorProcessor_option,\n parseNumbers,\n quoteFieldNamesWith: quoteFieldNamesWith_option,\n ruleGroupProcessor: ruleGroupProcessor_option,\n ruleProcessor: ruleProcessor_option,\n validator,\n valueProcessor: valueProcessor_option,\n context,\n } = optObj;\n\n const getParseNumberBoolean = (inputType?: InputType | null): boolean | undefined => {\n const parseNumberMethod = getParseNumberMethod({ parseNumbers, inputType });\n return typeof parseNumberMethod === 'string'\n ? true\n : typeof parseNumbers === 'boolean'\n ? parseNumbers\n : undefined;\n };\n\n const operatorProcessor =\n typeof operatorProcessor_option === 'function'\n ? operatorProcessor_option\n : (defaultOperatorProcessors[format] ?? defaultOperatorProcessor);\n\n const valueProcessor: ValueProcessorByRule =\n typeof valueProcessor_option === 'function'\n ? isValueProcessorLegacy(valueProcessor_option)\n ? r => valueProcessor_option(r.field, r.operator, r.value, r.valueSource)\n : valueProcessor_option\n : format === 'natural_language'\n ? defaultValueProcessorNL\n : valueProcessorCanActAsRuleProcessor.has(format)\n ? (ruleProcessor_option ?? defaultRuleProcessors[format])\n : defaultValueProcessorByRule;\n\n const ruleProcessor =\n (typeof ruleProcessor_option === 'function' ? ruleProcessor_option : null) ??\n (valueProcessorCanActAsRuleProcessor.has(format) &&\n typeof ruleProcessor_option !== 'function' &&\n valueProcessor_option\n ? valueProcessor\n : null) ??\n defaultRuleProcessors[format] ??\n defaultRuleProcessorSQL;\n\n const quoteFieldNamesWith = getQuoteFieldNamesWithArray(quoteFieldNamesWith_option);\n const fields = toFullOptionList(optObj.fields) as FullOptionList<FullField>;\n const getOperators: FormatQueryOptions['getOperators'] = (f, m) =>\n toFullOptionList(getOperators_option(f, m) ?? /* istanbul ignore next */ []);\n\n const fallbackExpression =\n fallbackExpression_option ??\n defaultFallbackExpressions[format] ??\n defaultFallbackExpressions.sql!;\n\n // #region Validation\n let validationMap: ValidationMap = {};\n\n // istanbul ignore else\n if (typeof validator === 'function') {\n const validationResult = validator(ruleGroup);\n if (typeof validationResult === 'boolean') {\n // istanbul ignore else\n if (!validationResult) {\n return format === 'parameterized'\n ? { sql: fallbackExpression, params: [] }\n : format === 'parameterized_named'\n ? { sql: fallbackExpression, params: {} }\n : format === 'mongodb'\n ? `{${fallbackExpression}}`\n : format === 'mongodb_query'\n ? mongoDbFallback\n : format === 'prisma'\n ? prismaFallback\n : format === 'jsonlogic'\n ? false\n : format === 'elasticsearch'\n ? {}\n : format === 'drizzle' || format === 'sequelize'\n ? undefined\n : fallbackExpression;\n }\n } else {\n validationMap = validationResult;\n }\n }\n\n const validatorMap: Record<string, RuleValidator> = {};\n const uniqueFields = toFlatOptionArray(fields) satisfies FullField[];\n for (const f of uniqueFields) {\n // istanbul ignore else\n if (typeof f.validator === 'function') {\n validatorMap[f.value ?? /* istanbul ignore next */ f.name] = f.validator;\n }\n }\n\n const validateRule = (rule: RuleType) => {\n let validationResult: boolean | ValidationResult | undefined;\n let fieldValidator: RuleValidator | undefined;\n if (rule.id) {\n validationResult = validationMap[rule.id];\n }\n if (uniqueFields.length > 0) {\n const fieldArr = uniqueFields.filter(f => f.name === rule.field);\n if (fieldArr.length > 0) {\n const field = fieldArr[0];\n // istanbul ignore else\n if (typeof field.validator === 'function') {\n fieldValidator = field.validator;\n }\n }\n }\n return [validationResult, fieldValidator] as const;\n };\n // #endregion\n\n const finalOptions: FormatQueryFinalOptions = {\n ...optObj,\n fallbackExpression,\n fields,\n format,\n getOperators,\n getParseNumberBoolean,\n quoteFieldNamesWith,\n operatorProcessor,\n ruleProcessor,\n valueProcessor,\n validateRule,\n validationMap,\n context,\n };\n\n if (typeof ruleGroupProcessor_option === 'function') {\n return ruleGroupProcessor_option(ruleGroup, finalOptions);\n }\n\n switch (format) {\n case 'json':\n case 'json_without_ids': {\n const rg = parseNumbers\n ? produce(ruleGroup, g => numerifyValues(g, finalOptions))\n : ruleGroup;\n if (format === 'json_without_ids') {\n return JSON.stringify(rg, (key, value) =>\n // Remove `id` and `path` keys; leave everything else unchanged.\n key === 'id' || key === 'path' ? undefined : bigIntJsonStringifyReplacer(key, value)\n );\n }\n return JSON.stringify(rg, bigIntJsonStringifyReplacer, 2);\n }\n\n case 'sql':\n return defaultRuleGroupProcessorSQL(ruleGroup, finalOptions);\n\n case 'parameterized':\n case 'parameterized_named':\n return defaultRuleGroupProcessorParameterized(ruleGroup, finalOptions);\n\n case 'mongodb':\n return defaultRuleGroupProcessorMongoDB(ruleGroup, finalOptions);\n\n case 'mongodb_query':\n return defaultRuleGroupProcessorMongoDBQuery(ruleGroup, finalOptions);\n\n case 'cel':\n return defaultRuleGroupProcessorCEL(ruleGroup, finalOptions);\n\n case 'spel':\n return defaultRuleGroupProcessorSpEL(ruleGroup, finalOptions);\n\n case 'jsonata':\n return defaultRuleGroupProcessorJSONata(ruleGroup, finalOptions);\n\n case 'jsonlogic':\n return defaultRuleGroupProcessorJsonLogic(ruleGroup, finalOptions);\n\n case 'elasticsearch':\n return defaultRuleGroupProcessorElasticSearch(ruleGroup, finalOptions);\n\n case 'natural_language':\n return defaultRuleGroupProcessorNL(ruleGroup, finalOptions);\n\n case 'ldap':\n return defaultRuleGroupProcessorLDAP(ruleGroup, finalOptions);\n\n case 'prisma':\n return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);\n\n case 'drizzle':\n return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);\n\n case 'sequelize':\n return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);\n\n default:\n return '';\n }\n}\n\nexport { formatQuery };\n","/**\n * Converts a given query object into one of the supported {@link index!ExportFormat ExportFormat} formats.\n *\n * @module formatQuery\n */\n\nimport type { RuleProcessor, ValueProcessorByRule, ValueProcessorLegacy } from '../../types';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\n\nconst generateValueProcessor =\n (vpbr: ValueProcessorByRule): ValueProcessorLegacy =>\n (field, operator, value, valueSource) =>\n vpbr({ field, operator, value, valueSource }, { parseNumbers: false });\n// TODO: Deprecate defaultValueProcessor.\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultValueProcessorByRule\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultMongoDBValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultRuleProcessorMongoDB\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultCELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorCEL);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultSpELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorSpEL);\n\nexport * from './defaultRuleGroupProcessorCEL';\nexport * from './defaultRuleGroupProcessorDrizzle';\nexport * from './defaultRuleGroupProcessorElasticSearch';\nexport * from './defaultRuleGroupProcessorJSONata';\nexport * from './defaultRuleGroupProcessorJsonLogic';\nexport * from './defaultRuleGroupProcessorLDAP';\nexport * from './defaultRuleGroupProcessorMongoDB';\nexport * from './defaultRuleGroupProcessorMongoDBQuery';\nexport * from './defaultRuleGroupProcessorNL';\nexport * from './defaultRuleGroupProcessorParameterized';\nexport * from './defaultRuleGroupProcessorPrisma';\nexport * from './defaultRuleGroupProcessorSequelize';\nexport * from './defaultRuleGroupProcessorSpEL';\nexport * from './defaultRuleGroupProcessorSQL';\nexport * from './defaultRuleProcessorDrizzle';\nexport * from './defaultRuleProcessorElasticSearch';\nexport * from './defaultRuleProcessorJSONata';\nexport * from './defaultRuleProcessorJsonLogic';\nexport * from './defaultRuleProcessorLDAP';\nexport * from './defaultRuleProcessorMongoDBQuery';\nexport * from './defaultRuleProcessorNL';\nexport * from './defaultRuleProcessorParameterized';\nexport * from './defaultRuleProcessorPrisma';\nexport * from './defaultRuleProcessorSequelize';\nexport * from './defaultRuleProcessorSQL';\nexport * from './defaultValueProcessorNL';\nexport * from './formatQuery';\nexport * from './utils';\nexport {\n defaultRuleProcessorCEL,\n defaultRuleProcessorMongoDB,\n defaultRuleProcessorSpEL,\n defaultValueProcessorByRule,\n};\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorCELByRule: RuleProcessor = defaultRuleProcessorCEL;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultValueProcessorMongoDBByRule: RuleProcessor = defaultRuleProcessorMongoDB;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorSpELByRule: RuleProcessor = defaultRuleProcessorSpEL;\n"],"mappings":";;;;;;;;;;AAOA,MAAa,sBAAsB,OACjC,OAAO,GAAG,IAAI,OAAO,GAAG,UAAU;;;;;;AAOpC,MAAa,sBACX,IACA,kBACA,cACY;AACZ,KAAI,GAAG,MACL,QAAO;AAET,KAAI,OAAO,qBAAqB,UAC9B,QAAO;AAET,KAAI,mBAAmB,iBAAiB,CACtC,QAAO,iBAAiB;AAE1B,KAAI,OAAO,cAAc,cAAc,CAAC,YAAY,GAAG,EAAE;EACvD,MAAM,KAAK,UAAU,GAAG;AACxB,MAAI,OAAO,OAAO,UAChB,QAAO;;AAGT,MAAI,mBAAmB,GAAG,CACxB,QAAO,GAAG;;AAGd,QAAO;;;;;;;;;;AC5BT,MAAaA,gCAA4D,WAAW,YAAY;CAC9F,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAsB,cAAgC;AAC9E,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,qBAAqB;EAG1C,MAAM,iBAAiB,EAAE;EACzB,IAAI,sBAAsB;EAC1B,IAAI,YAAY;AAEhB,OAAK,MAAM,QAAQ,GAAG,OAAO;AAE3B,OAAI,OAAO,SAAS,UAAU;AAC5B,0BAAsB,iBAAiB;AACvC;;AAIF,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,iBAAiB,iBAAiB,KAAK;AAC7C,QAAI,gBAAgB;AAClB,SAAI,CAAC,aAAa,qBAAqB;AACrC,qBAAe,KAAK,oBAAoB;AACxC,4BAAsB;;AAExB,iBAAY;AACZ,oBAAe,KAAK,eAAe;;AAErC;;GAIF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAGF,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;GAC/C,MAAM,gBAAgB,cAAc,MAAM;IACxC,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD,eAAe,KAAK,eAAe,aAAa;IAChD;IACD,CAAC;AAEF,OAAI,eAAe;AACjB,QAAI,CAAC,aAAa,qBAAqB;AACrC,oBAAe,KAAK,oBAAoB;AACxC,2BAAsB;;AAExB,gBAAY;AACZ,mBAAe,KAAK,cAAc;;;EAItC,MAAM,aAAa,eAAe,KAChC,gBAAgB,GAAG,GAAG,IAAI,iBAAiB,GAAG,YAAqC,KAAK,IACzF;EAED,MAAM,CAAC,QAAQ,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,MAAM,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG;AAEzF,SAAO,aAAa,GAAG,SAAS,aAAa,WAAW;;AAG1D,QAAO,iBAAiB,WAAW,KAAK;;;;;ACrF1C,MAAMC,kBAAgB,OAAe,GAAG,WAAW,MAAM,IAAI,GAAG,WAAW,UAAU;AAGrF,MAAM,sBAAsB,GAAQ,iBAClC,OAAO,MAAM,YAAY,CAAC,eAAe,GAAG,MAAM,EAAE,WAAW,KAAK,MAAM;;;;;;AAO5E,MAAaC,2BACX,MAEA,OAAO,EAAE,KACN;CACH,MAAM,EAAE,cAAc,cAAc,uBAAuB;CAC3D,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,eAAe,gBAAgB;CACrC,MAAM,aAAa,GAAG,aAAa,MAAM,OAAO,SAAS;CACzD,MAAM,eACJ,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,qBAAqB,OAAO,aAAa;CAE3C,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB,QAAO;UACE,WAAW;EACpB,MAAM,EAAE,MAAM,cAAc;EAG5B,MAAM,oBAAoB;EAK1B,MAAM,oBAAoB,6BAHT,eAAe,KAAK,OAAwB,EAC3D,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO,GAAG,oBAAoB,EAAE,QAAQ,IAAI,EAAE,UAAU;GAAM,GAC5F,CAAC,EAGA,KACD;AAED,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,GAAG,MAAM,OAAO,kBAAkB,IAAI,kBAAkB;GAEjE,KAAK;GACL,KAAK,OACH,QAAO,GAAG,SAAS,SAAS,MAAM,KAAK,MAAM,UAAU,kBAAkB,IAAI,kBAAkB;GAEjG,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,aAAa,UAAU,MAAM;IACnC,MAAM,gBAAgB,GAAG,MAAM,UAAU,kBAAkB,IAAI,kBAAkB;IAEjF,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;AAElE,QAAI,YAAY,KAAK,YAAY,EAC/B,QAAO,GAAG,cAAc,GAAG,GAAG,IAAI,WAAW,KAAK,UAAU;AAE9D,WAAO,GAAG,cAAc,GAAG,GAAG,GAAG;;;;AAKvC,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACH,QAAO,GAAG,MAAM,GAAG,WAAW,GAC5B,gBAAgB,eACZ,aAAa,MAAM,GACnB,IAAI,mBAAmB,OAAO,aAAa,CAAC;EAGpD,KAAK;EACL,KAAK,iBAEH,QAAO,GADQD,eAAa,WAAW,GAAG,MAAM,KAC7B,MAAM,YACvB,eAAe,aAAa,MAAM,GAAG,IAAI,mBAAmB,OAAO,aAAa,CAAC,GAClF;EAGH,KAAK;EACL,KAAK,mBAEH,QAAO,GADQA,eAAa,WAAW,GAAG,MAAM,KAC7B,MAAM,cACvB,eAAe,aAAa,MAAM,GAAG,IAAI,mBAAmB,OAAO,aAAa,CAAC,GAClF;EAGH,KAAK;EACL,KAAK,iBAEH,QAAO,GADQA,eAAa,WAAW,GAAG,MAAM,KAC7B,MAAM,YACvB,eAAe,aAAa,MAAM,GAAG,IAAI,mBAAmB,OAAO,aAAa,CAAC,GAClF;EAGH,KAAK,OACH,QAAO,GAAG,MAAM;EAElB,KAAK,UACH,QAAO,GAAG,MAAM;EAElB,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,CAAC,QAAQ,UAAUA,eAAa,WAAW,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG;AAE1E,UAAO,GAAG,SAAS,MAAM,OADJ,QAAQ,MAAM,CAEhC,KAAI,QACH,gBAAgB,qBAAqB,KAAK,aAAa,GACnD,GAAG,aAAa,IAAI,KACpB,IAAI,mBAAmB,KAAK,aAAa,CAAC,GAC/C,CACA,KAAK,KAAK,CAAC,GAAG;;EAGnB,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,CAAC,uBAAuB,aAAa,GAAG,IACxC,CAAC,uBAAuB,aAAa,GAAG,EACxC;IACA,MAAM,CAAC,OAAO,UAAU;IAGxB,MAAM,qBAAqB,EAAE,iBAAiB;IAC9C,MAAM,WAAW,qBAAqB,OAAO,mBAAmB,GAC5D,YAAY,OAAO,EAAE,cAAc,oBAAoB,CAAC,GACxD;IACJ,MAAM,YAAY,qBAAqB,QAAQ,mBAAmB,GAC9D,YAAY,QAAQ,EAAE,cAAc,oBAAoB,CAAC,GACzD;IACJ,IAAI,aAAa,OAAO,MAAM,SAAS,GACnC,eACE,GAAG,UACH,IAAI,mBAAmB,OAAO,aAAa,CAAC,KAC9C;IACJ,IAAI,cAAc,OAAO,MAAM,UAAU,GACrC,eACE,GAAG,WACH,IAAI,mBAAmB,QAAQ,aAAa,CAAC,KAC/C;AAEJ,QACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;KACA,MAAM,UAAU;AAChB,mBAAc;AACd,kBAAa;;AAGf,WAAO,eAAe,YAClB,IAAI,MAAM,MAAM,WAAW,MAAM,MAAM,MAAM,YAAY,KACzD,IAAI,MAAM,KAAK,WAAW,MAAM,MAAM,KAAK,YAAY;SAE3D,QAAO;;;AAIb,QAAO;;;;;;;;;;ACxKT,MAAa,kBAAkB,EAAE,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC,EAAE;;;;;;AAO1D,MAAaE,yCACX,WACA,SACA,SACG;CACH,MAAM,EACJ,QACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAmB,cAAwB;AACnE,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,kBAAkB;EAGvC,MAAM,aAAa,IAAI,GAAG,GAAG,WAAW;EACxC,IAAI,gBAAgB;EAEpB,MAAMC,cAAyC,GAAG,MAC/C,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,qBAAqB,iBAAiB,KAAK;AACjD,QAAI,oBAAoB;AACtB,qBAAgB;AAChB,YAAO;;AAET,WAAO;;GAET,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD,QAAO;GAET,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cACL,MACA;IACE,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACD,EACD,KACD;IACD,CACD,OAAO,QAAQ;AAElB,SAAO,YAAY,SAAS,IACxB,YAAY,WAAW,KAAK,CAAC,gBAC3B,YAAY,KACZ,GAAG,aAAa,aAAa,GAC/B;;AAGN,QAAO,iBAAiB,cAAc,UAAU,EAAE,KAAK;;;;;AC3EzD,MAAMC,mBAAoB,OAAgB,UAAa,eAAe,UACpE,qBAAqB,OAAO,gBAAgB,OAAO,UAAU,SAAS,GAClE,OAAO,YAAY,OAAO,EAAE,cAAc,UAAU,CAAC,CAAC,GACtD;;;;;;AAON,MAAaC,oCACX,MAEA,UAAU,EAAE,KACT;CACH,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,EAAE,cAAc,oBAAoB,YAAY;CACtD,MAAM,eAAe,gBAAgB;CAErC,MAAM,EAAE,sBAAuB,WAAW,EAAE;CAE5C,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB;UACS,WAAW;EACpB,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE;EAC5D,MAAM,mBAAmB,sCACvB,eAAe,OAAwB,EACrC,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,EAAE,UAAU;GAAO,GAC9E,CAAC,EACF;GACE,GAAI;GAEJ,eAAe;GACf,SAAS;IAAE,GAAG,QAAQ;IAAS,mBAAmB;IAAO;GAC1D,CACF;EACD,MAAM,qBAAqB,sCACzB,eAAe,OAAwB,EACrC,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO,EAAE,QAAQ,SAAS,EAAE,UAAU;GAAS,GAC7E,CAAC,EACF;GACE,GAAI;GAEJ,eAAe;GACf,SAAS;IAAE,GAAG,QAAQ;IAAS,mBAAmB;IAAM;GACzD,CACF;EAED,MAAM,gBAAgB,EACpB,OAAO,EACL,SAAS,CACP,EAAE,SAAS;GAAE,OAAO,IAAI;GAAS,IAAI;GAAQ,MAAM,EAAE,MAAM,CAAC,mBAAmB,EAAE;GAAE,EAAE,EACrF,EAAE,CACH,EACF,EACF;AAED,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,EAAE,OAAO,EAAE,KAAK,CAAC,eAAe,WAAW,EAAE,EAAE;GAExD,KAAK,OACH,QAAO,EAAE,MAAM,CAAC,iBAAiB,EAAE;GAErC,KAAK,OACH,QAAO;GAET,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KACJ,SAAS,YACL,eAAe,QACf,SAAS,WACP,eAAe,QACf,eAAe;AAEvB,QAAI,YAAY,KAAK,YAAY,EAC/B,QAAO,EAAE,OAAO,GAAG,KAAK,CAAC,eAAe,EAAE,WAAW,CAAC,YAAY,UAAU,EAAE,CAAC,EAAE,EAAE;AAErF,WAAO,EAAE,OAAO,GAAG,KAAK,CAAC,eAAe,UAAU,EAAE,EAAE;;;;AAK5D,KAAI,aAAa,OAAO,CAAC,aACvB,QAAO,oBACH,EAAE,KAAK,CAAC,IAAI,SAASD,gBAAc,OAAO,OAAO,aAAa,CAAC,EAAE,GACjE,GAAG,QAAQA,gBAAc,OAAO,OAAO,aAAa,EAAE;CAG5D,MAAM,aAAa,GAAG,SAAS;AAC/B,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MAAM;GACT,MAAM,gBAAgB,eAAe;AACrC,UAAO,eACH,GAAG,gBAAgB,CAAC,IAAI,SAAS,IAAI,QAAQ,EAAE,GAC/C,oBACE,EACE,MAAM,CACJ,EAAE,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE,EAC5B,GAAG,gBAAgB,CAAC,IAAI,SAASA,gBAAc,OAAO,OAAO,aAAa,CAAC,EAAE,CAC9E,EACF,GACD,GAAG,QAAQ,GAAG,gBAAgBA,gBAAc,OAAO,OAAO,aAAa,EAAE,EAAE;;EAGnF,KAAK,WACH,QAAO,eACH,EAAE,QAAQ,QAAQ,MAAM,iBAAiB,MAAM,IAAI,GACnD,oBACE,EAAE,aAAa;GAAE,OAAO,IAAI;GAAS,OAAO;GAAO,EAAE,GACrD,GAAG,QAAQ,EAAE,QAAQ,OAAO,EAAE;EAEtC,KAAK,aACH,QAAO,eACH,EAAE,QAAQ,QAAQ,MAAM,mBAAmB,MAAM,IAAI,GACrD,oBACE,EAAE,aAAa;GAAE,OAAO,IAAI;GAAS,OAAO,IAAI;GAAS,EAAE,GAC3D,GAAG,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE;EAE5C,KAAK,WACH,QAAO,eACH,EAAE,QAAQ,QAAQ,MAAM,iBAAiB,MAAM,IAAI,GACnD,oBACE,EAAE,aAAa;GAAE,OAAO,IAAI;GAAS,OAAO,GAAG,MAAM;GAAI,EAAE,GAC3D,GAAG,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,EAAE;EAE5C,KAAK,iBACH,QAAO,eACH,EAAE,QAAQ,SAAS,MAAM,iBAAiB,MAAM,IAAI,GACpD,oBACE,EAAE,MAAM,EAAE,aAAa;GAAE,OAAO,IAAI;GAAS,OAAO;GAAO,EAAE,EAAE,GAC/D,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE,EAAE;EAEhD,KAAK,mBACH,QAAO,eACH,EAAE,QAAQ,SAAS,MAAM,mBAAmB,MAAM,IAAI,GACtD,oBACE,EAAE,MAAM,EAAE,aAAa;GAAE,OAAO,IAAI;GAAS,OAAO,IAAI;GAAS,EAAE,EAAE,GACrE,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,EAAE;EAEtD,KAAK,iBACH,QAAO,eACH,EAAE,QAAQ,SAAS,MAAM,iBAAiB,MAAM,IAAI,GACpD,oBACE,EAAE,MAAM,EAAE,aAAa;GAAE,OAAO,IAAI;GAAS,OAAO,GAAG,MAAM;GAAI,EAAE,EAAE,GACrE,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,EAAE,EAAE;EAEtD,KAAK,OACH,QAAO,oBAAoB,EAAE,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE,GAAG,GAAG,QAAQ,MAAM;EAE7E,KAAK,UACH,QAAO,oBAAoB,EAAE,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE,GAAG,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEtF,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM;AACnC,UAAO,eACH,EACE,QAAQ,GAAG,eAAe,UAAU,MAAM,GAAG,GAAG,aAC7C,KAAI,QAAO,QAAQ,MAAM,CACzB,KAAK,IAAI,CAAC,kBAAkB,MAAM,IACtC,GACD,oBACE,eAAe,UACb,EACE,MAAM,GACH,eAAe,KAAK,CACnB,IAAI,SACJ,aAAa,KAAI,QAAOA,gBAAc,KAAK,KAAK,aAAa,CAAC,CAC/D,EACF,EACF,GACD,GACG,eAAe,cAAc,CAC5B,IAAI,SACJ,aAAa,KAAI,QAAOA,gBAAc,KAAK,KAAK,aAAa,CAAC,CAC/D,EACF,GACH,GACG,QAAQ,GACN,eAAe,cAAc,aAAa,KAAI,QAC7CA,gBAAc,KAAK,KAAK,aAAa,CACtC,EACF,EACF;;EAGT,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,aAAa,aAAa,GAAG,IAC7B,aAAa,aAAa,GAAG,EAC7B;IACA,MAAM,CAAC,OAAO,UAAU;IACxB,MAAM,WAAWA,gBAAc,OAAO,KAAY,KAAK;IACvD,MAAM,YAAYA,gBAAc,QAAQ,KAAY,KAAK;IACzD,IAAI,aAAa,eAAe,QAAQ,OAAO,MAAM,SAAS,GAAG,QAAQ;IACzE,IAAI,cAAc,eAAe,SAAS,OAAO,MAAM,UAAU,GAAG,SAAS;AAC7E,QACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;KACA,MAAM,UAAU;AAChB,mBAAc;AACd,kBAAa;;AAGf,QAAI,eAAe,UACjB,QAAO,eACH;KAAE,MAAM,CAAC,IAAI,SAAS,IAAI,aAAa;KAAE,MAAM,CAAC,IAAI,SAAS,IAAI,cAAc;KAAE,GACjF,oBACE,EACE,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,SAAS,YAAY,EAAE,CAAC,EAClF,GACD,GAAG,QAAQ;KAAE,MAAM;KAAY,MAAM;KAAa,EAAE;QAE1D,QAAO,eACH,EACE,KAAK,CACH,EAAE,KAAK,CAAC,IAAI,SAAS,IAAI,aAAa,EAAE,EACxC,EAAE,KAAK,CAAC,IAAI,SAAS,IAAI,cAAc,EAAE,CAC1C,EACF,GACD,oBACE,EACE,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,SAAS,YAAY,EAAE,CAAC,EAC/E,GACD,EAAE,KAAK,CAAC,GAAG,QAAQ,EAAE,KAAK,YAAY,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,aAAa,EAAE,CAAC,EAAE;SAGtF,QAAO;;;AAIb,QAAO;;;;;;;;;;;;ACvPT,MAAaE,+BAA8C,MAAM,YAAY;CAC3E,MAAM,WAAW,iCAAiC,MAAM,QAAQ;AAChE,QAAO,WAAW,KAAK,UAAU,SAAS,GAAG;;;;;;;;;;ACF/C,MAAaC,iCAA6D,WAAW,YAAY;CAC/F,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAsB,cAAgC;AAC9E,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,qBAAqB;EAG1C,MAAM,iBAAiB,EAAE;EACzB,IAAI,sBAAsB;EAC1B,IAAI,YAAY;AAEhB,OAAK,MAAM,QAAQ,GAAG,OAAO;AAE3B,OAAI,OAAO,SAAS,UAAU;AAC5B,0BAAsB;AACtB;;AAIF,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,iBAAiB,iBAAiB,KAAK;AAC7C,QAAI,gBAAgB;AAClB,SAAI,CAAC,aAAa,qBAAqB;AACrC,qBAAe,KAAK,oBAAoB;AACxC,4BAAsB;;AAExB,iBAAY;AACZ,oBAAe,KAAK,eAAe;;AAErC;;GAIF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAGF,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;GAC/C,MAAM,gBAAgB,cAAc,MAAM;IACxC,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD,eAAe,KAAK,eAAe,aAAa;IAChD;IACD,CAAC;AAEF,OAAI,eAAe;AACjB,QAAI,CAAC,aAAa,qBAAqB;AACrC,oBAAe,KAAK,oBAAoB;AACxC,2BAAsB;;AAExB,gBAAY;AACZ,mBAAe,KAAK,cAAc;;;EAItC,MAAM,aAAa,eAAe,KAAK,gBAAgB,GAAG,GAAG,IAAI,GAAG,WAAW,KAAK,IAAI;EAExF,MAAM,CAAC,QAAQ,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,MAAM,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG;AAEzF,SAAO,aAAa,GAAG,SAAS,aAAa,WAAW;;AAG1D,QAAO,iBAAiB,WAAW,KAAK;;;;;AClF1C,MAAMC,kBAAgB,OAAe,GAAG,WAAW,MAAM,IAAI,GAAG,WAAW,UAAU;AAErF,MAAM,kBAAkB,QAAgB,aAAqBC,WAAS,KAAK,OAAO,KAAK;AAGvF,MAAM,sBAAsB,GAAQ,iBAClC,OAAO,MAAM,YAAY,CAAC,eAAe,GAAG,MAAM,EAAE,WAAW,KAAK,MAAM;;;;;;AAO5E,MAAaC,4BACX,MAEA,OAAO,EAAE,KACN;CACH,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,EAAE,cAAc,cAAc,uBAAuB;CAC3D,MAAM,eAAe,gBAAgB;CACrC,MAAM,aAAa,GAAG,aAAa,MAAM,OAAO,SAAS;CACzD,MAAM,eACJ,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,qBAAqB,OAAO,aAAa;CAE3C,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB,QAAO;UACE,WAAW;EACpB,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,oBAAoB,8BACxB,eAAe,KAAK,OAAwB,EAC1C,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO,EAAE,SAAS;GAAS,GACzD,CAAC,EACF,KACD;EAED,MAAM,aAAa,GAAG,MAAM;EAC5B,MAAM,gBAAgB,GAAG,MAAM,KAAK,kBAAkB;AAEtD,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,GAAG,cAAc,MAAM;GAEhC,KAAK,OACH,QAAO,GAAG,cAAc;GAE1B,KAAK,OACH,QAAO,GAAG,cAAc;GAE1B,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;AAElE,QAAI,YAAY,KAAK,YAAY,EAC/B,QAAO,GAAG,cAAc,GAAG,GAAG,IAAI,WAAW,KAAK,UAAU;AAE9D,WAAO,GAAG,cAAc,GAAG,GAAG,GAAG;;;;AAKvC,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACH,QAAO,GAAG,MAAM,GAAG,WAAW,GAC5B,gBAAgB,eACZ,aAAa,MAAM,GACnB,IAAI,mBAAmB,OAAO,aAAa,CAAC;EAGpD,KAAK;EACL,KAAK,iBACH,QAAO,eACL,GAAG,MAAM,WACP,gBAAgB,eACZ,aAAa,MAAM,GACnB,IAAI,mBAAmB,OAAO,aAAa,CAAC,MAElDF,eAAa,WAAW,CACzB;EAEH,KAAK;EACL,KAAK,mBAMH,QAAO,eAAe,GAAG,MAAM,WALf,eACZ,cAAc,aAAa,MAAM,CAAC,KAClC,IACG,OAAO,UAAU,YAAY,CAAC,MAAM,WAAW,IAAI,IAAK,eAAe,MAAM,KAC7E,mBAAmB,OAAO,aAAa,CAAC,MACMA,eAAa,WAAW,CAAC;EAGhF,KAAK;EACL,KAAK,iBAMH,QAAO,eAAe,GAAG,MAAM,WALf,eACZ,GAAG,aAAa,MAAM,CAAC,gBACvB,IAAI,mBAAmB,OAAO,aAAa,GACxC,OAAO,UAAU,YAAY,CAAC,MAAM,SAAS,IAAI,IAAK,eAAe,MAAM,GAC7E,MACgDA,eAAa,WAAW,CAAC;EAGhF,KAAK,OACH,QAAO,GAAG,MAAM;EAElB,KAAK,UACH,QAAO,GAAG,MAAM;EAElB,KAAK;EACL,KAAK,SAAS;GACZ,MAAMC,WAASD,eAAa,WAAW,GAAG,MAAM;GAChD,MAAM,eAAe,QAAQ,MAAM;AACnC,UAAO,aAAa,SAAS,IACzB,GAAGC,SAAO,GAAG,aACV,KACC,QACE,GAAG,MAAM,MACP,gBAAgB,qBAAqB,KAAK,aAAa,GACnD,GAAG,aAAa,IAAI,KACpB,IAAI,mBAAmB,KAAK,aAAa,CAAC,KAEnD,CACA,KAAK,OAAO,CAAC,KAChB;;EAGN,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,CAAC,uBAAuB,aAAa,GAAG,IACxC,CAAC,uBAAuB,aAAa,GAAG,EACxC;IACA,MAAM,CAAC,OAAO,UAAU;IAGxB,MAAM,qBAAqB,EAAE,iBAAiB;IAC9C,MAAM,WAAW,qBAAqB,OAAO,mBAAmB,GAC5D,YAAY,OAAO,EAAE,cAAc,oBAAoB,CAAC,GACxD;IACJ,MAAM,YAAY,qBAAqB,QAAQ,mBAAmB,GAC9D,YAAY,QAAQ,EAAE,cAAc,oBAAoB,CAAC,GACzD;IACJ,IAAI,aAAa,OAAO,MAAM,SAAS,GACnC,eACE,GAAG,UACH,IAAI,mBAAmB,OAAO,aAAa,CAAC,KAC9C;IACJ,IAAI,cAAc,OAAO,MAAM,UAAU,GACrC,eACE,GAAG,WACH,IAAI,mBAAmB,QAAQ,aAAa,CAAC,KAC/C;AACJ,QACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;KACA,MAAM,UAAU;AAChB,mBAAc;AACd,kBAAa;;AAEf,WAAO,eAAe,YAClB,IAAI,MAAM,MAAM,WAAW,OAAO,MAAM,MAAM,YAAY,KAC1D,IAAI,MAAM,KAAK,WAAW,MAAM,MAAM,KAAK,YAAY;SAE3D,QAAO;;;AAKb,QAAO;;;;;ACxLT,MAAME,6BAA2B,GAAQ,WAAmB,iBAC1D,gBAAgB,OAAO,MAAM,WACzB,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,YAAY,GACxD;;;;;;AAON,MAAaC,+BACX,EAAE,UAAU,OAAO,eAEnB,EACE,cACA,cACA,oBACA,qBACA,iBACA,iBAAiB,MACjB,0BACA,gBAAgB,CAAC,IAAI,GAAG,EACxB,iBACE,EAAE,KACH;CACH,MAAM,eAAe,gBAAgB;CACrC,MAAM,oBAAoB,GAAG,SAAS;CACtC,MAAM,YAAY,mBAAmB;CAGrC,MAAM,cAAc,MAClB,GAAG,cAAc,KAAK,YAAY,IAAI,YAAY,cAAc;CAClE,MAAM,eAAe,MAAWD,0BAAwB,GAAG,WAAW,aAAa;CACnF,MAAM,iBAAiB,MAAW,WAAW,YAAY,EAAE,CAAC;CAE5D,MAAM,iBAAiB,MACrB,mBAAmB,GAAG;EAAE;EAAqB;EAA0B,CAAC;CAC1E,MAAM,UAAU,GAAG,WACjB,eAAe,aAAa,KAAK,WAC7B,UAAU,OAAO,KAAK,KAAK,CAAC,KAC5B,OAAO,KAAK,IAAI,eAAe,GAAG;AAExC,SAAQ,mBAAR;EACE,KAAK;EACL,KAAK,UACH,QAAO;EAGT,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM;AACnC,OAAI,aAAa,SAAS,EACxB,QAAO,IAAI,aACR,KAAI,MACH,eACI,cAAc,EAAE,GAChB,qBAAqB,GAAG,aAAa,GACnC,GAAG,aAAa,EAAE,KAClB,GAAG,cAAc,EAAE,GAC1B,CACA,KAAK,KAAK,CAAC;AAEhB,UAAO;;EAGT,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,OAAO,EAAE,oBAAoB,MAAM,CAAC;AACjE,OACE,aAAa,SAAS,KACtB,CAAC,aAAa,aAAa,GAAG,IAC9B,CAAC,aAAa,aAAa,GAAG,CAE9B,QAAO;GAGT,MAAM,CAAC,OAAO,UAAU;GAExB,MAAM,WAAW,qBAAqB,OAAO,aAAa,GACtD,YAAY,OAAO,EAAE,cAAc,UAAU,CAAC,GAC9C;GACJ,MAAM,YAAY,qBAAqB,QAAQ,aAAa,GACxD,YAAY,QAAQ,EAAE,cAAc,UAAU,CAAC,GAC/C;GACJ,MAAM,aAAa,OAAO,MAAM,SAAS,GAAI,eAAe,GAAG,UAAU,QAAS;GAClF,MAAM,cAAc,OAAO,MAAM,UAAU,GACvC,eACE,GAAG,WACH,SACF;GAEJ,MAAM,oBAAoB,CAAC,YAAY,YAAY;AACnD,OACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;AACA,sBAAkB,KAAK;AACvB,sBAAkB,KAAK;;AAGzB,WAEI,eACI,kBAAkB,KAAI,MAAK,cAAc,EAAE,CAAC,GAC5C,kBAAkB,OAAM,MAAK,qBAAqB,GAAG,aAAa,CAAC,GACjE,kBAAkB,KAAI,MAAK,YAAY,GAAG,EAAE,cAAc,UAAU,CAAC,CAAC,GACtE,kBAAkB,KAAI,MAAK,cAAc,EAAE,CAAC,EAIjD,KAAK,IAAI,cAAc,OAAO,MAAM,GAAG;;EAI9C,KAAK;EACL,KAAK,iBACH,QAAO,eACH,OAAO,WAAW,IAAI,EAAE,cAAc,MAAM,EAAE,WAAW,IAAI,CAAC,GAC9D,WAAW,IAAI,YAAY,MAAM,CAAC,GAAG;EAE3C,KAAK;EACL,KAAK,mBACH,QAAO,eACH,OAAO,cAAc,MAAM,EAAE,WAAW,IAAI,CAAC,GAC7C,WAAW,GAAG,YAAY,MAAM,CAAC,GAAG;EAE1C,KAAK;EACL,KAAK,iBACH,QAAO,eACH,OAAO,WAAW,IAAI,EAAE,cAAc,MAAM,CAAC,GAC7C,WAAW,IAAI,YAAY,MAAM,GAAG;;AAG5C,KAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,SAAS;AAG1B,QAAO,eACH,cAAc,MAAM,GACpB,qBAAqB,OAAO,aAAa,GACvC,GAAG,aAAa,MAAM,KACtB,GAAG,cAAc,MAAM;;;;;;;;;;ACxI/B,MAAaE,+BAA8C,MAAM,aAA8B;CAC7F,MAAM,OAAO,yCAAuC,EAAE;;CAEtD,MAAM,EAAE,cAAc,oBAAoB,UAAU,EAAE,KAAK;CAC3D,MAAM,EAAE,SAAS,kBAAkB,iBAAiB;AAMpD,KAAI,CAAC,WAAW,CAAC,iBAAkB;CAEnC,MAAM,EACJ,SACA,IACA,IACA,KACA,SACA,WACA,QACA,MACA,IACA,KACA,IACA,YACA,YACA,SACA,QACE;CAEJ,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAEhD,MAAM,SACJ,gBAAgB,kBAAkB,KAAK,MAAM,GACxC,IAAI,IAAI,MAAM,GACf,QAAQ;CACd,MAAM,aAAa,GAAG,SAAS;CAE/B,MAAM,eAAe,gBAAgB;CACrC,MAAM,kBAAkB,MAAe,eAAe,QAAQ,KAAK;AAEnE,KAAI,CAAC,OAAQ;CAEb,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB;UACS,WAAW;AAEpB,MAAI,KAAK,WAAW,aAAc;EAElC,MAAM,EAAE,MAAM,cAAc;EAG5B,MAAM,oBAAoB;EAM1B,MAAM,oBAAoB,iCAJT,eAAe,KAAK,OAAwB,EAC3D,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO;GAAmB,GACxD,CAAC,EAEmE;GACnE,GAAI;GACJ,SAAS;IAAE,GAAG,KAAK;IAAS,cAAc;IAAM;GACjD,CAAC;AAEF,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,GAAG,gCAAgC,OAAO,OAAO,IAAI,IAAI,kBAAkB,CAAC,SAAS,kBAAkB,EAAE,EAAE,iBAAiB,CAAC,mBAAmB,OAAO;GAEhK,KAAK,OACH,QAAO,GAAG,oCAAoC,OAAO,OAAO,IAAI,IAAI,kBAAkB,CAAC,SAAS,kBAAkB,EAAE,EAAE,iBAAiB,CAAC;GAE1I,KAAK,OACH,QAAO,GAAG,gCAAgC,OAAO,OAAO,IAAI,IAAI,kBAAkB,CAAC,SAAS,kBAAkB,EAAE,EAAE,iBAAiB,CAAC;GAEtI,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;AAElE,WAAO,YAAY,KAAK,YAAY,IAChC,GAAG,mCAAmC,OAAO,mBAAmB,OAAO,OAAO,IAAI,IAAI,kBAAkB,CAAC,SAAS,kBAAkB,EAAE,EAAE,iBAAiB,CAAC,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,YAAY,KAC3L,GAAG,gCAAgC,OAAO,OAAO,IAAI,IAAI,kBAAkB,CAAC,SAAS,kBAAkB,EAAE,EAAE,iBAAiB,CAAC,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,YAAY;;;;AAKxK,SAAQ,YAAR;EACE,KAAK,IACH,QAAO,GAAG,QAAQ,eAAe,MAAM,CAAC;EAC1C,KAAK,KACH,QAAO,GAAG,QAAQ,eAAe,MAAM,CAAC;EAC1C,KAAK,IACH,QAAO,GAAG,QAAQ,eAAe,MAAM,CAAC;EAC1C,KAAK,IACH,QAAO,GAAG,QAAQ,eAAe,MAAM,CAAC;EAC1C,KAAK,KACH,QAAO,IAAI,QAAQ,eAAe,MAAM,CAAC;EAC3C,KAAK,KACH,QAAO,IAAI,QAAQ,eAAe,MAAM,CAAC;EAC3C,KAAK;EACL,KAAK,mBACH,SAAQ,eAAe,qBAAqB,UAAU,MACpD,QACA,eAAe,GAAG,GAAG,eAAe,MAAM,CAAC,WAAW,GAAG,MAAM,GAChE;EACH,KAAK;EACL,KAAK,iBACH,SAAQ,eAAe,mBAAmB,UAAU,MAClD,QACA,eAAe,GAAG,UAAU,eAAe,MAAM,CAAC,WAAW,IAAI,MAAM,GACxE;EACH,KAAK;EACL,KAAK,iBACH,SAAQ,eAAe,mBAAmB,UAAU,MAClD,QACA,eAAe,GAAG,UAAU,eAAe,MAAM,KAAK,IAAI,QAC3D;EACH,KAAK,OACH,QAAO,OAAO,OAAO;EACvB,KAAK,UACH,QAAO,UAAU,OAAO;EAC1B,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM,CAAC,KAAI,MAAK,eAAe,EAAE,CAAC;AAC/D,UAAO,eAAe,UAClB,WAAW,QAAQ,aAAa,GAChC,QAAQ,QAAQ,aAAa;;EAEnC,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,aAAa,aAAa,GAAG,IAC7B,aAAa,aAAa,GAAG,EAC7B;IACA,IAAI,CAAC,OAAO,UAAU;IAGtB,MAAM,qBAAqB,EAAE,iBAAiB;AAC9C,QACE,CAAC,gBACD,qBAAqB,OAAO,mBAAmB,IAC/C,qBAAqB,QAAQ,mBAAmB,EAChD;KACA,MAAM,WAAW,YAAY,OAAO,EAAE,cAAc,oBAAoB,CAAC;KACzE,MAAM,YAAY,YAAY,QAAQ,EAAE,cAAc,oBAAoB,CAAC;AAC3E,SAAI,CAAC,sBAAsB,YAAY,UAAU;MAC/C,MAAM,UAAU;AAChB,eAAS;AACT,cAAQ;YACH;AACL,cAAQ;AACR,eAAS;;eAIP,cAAc;AAChB,aAAQ,eAAe,MAAM;AAC7B,cAAS,eAAe,OAAO;;AAGnC,WAAO,eAAe,eAClB,WAAW,QAAQ,OAAO,OAAO,GACjC,QAAQ,QAAQ,OAAO,OAAO;;AAEpC;;EAEF,QACE;;;;;;;;;;;;;;;;;;ACpKN,MAAaC,oCAGV,WAAW,SAAS,WACpB,SAAyC,qBAAgC;CACxE,MAAM,EACJ,QACA,uBACA,sBACA,yBACA,sBACA,cACA,kBACE;AAEJ,KAAI,CAAC,WAAW,CAAC,iBAAkB;CAEnC,MAAM,EAAE,KAAK,KAAK,OAAO;CAEzB,MAAM,gBAAgB;CAEtB,MAAM,oBAAoB,IAAmB,eAA0C;AACrF,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF;EAGF,MAAM,iBAAiB,GAAG,MACvB,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,CACnB,QAAO,iBAAiB,KAAK;GAE/B,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAEF,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cAAc,MAAM;IACzB,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACA,SAAS;KAAE,GAAG,QAAQ;KAAS;KAAS;KAAkB;IAC3D,CAAC;IACF,CACD,OAAO,QAAQ;AAElB,MAAI,eAAe,WAAW,EAC5B;EAGF,MAAMC,eACJ,GAAG,eAAe,OAAO,GAAG,GAAG,eAAe,GAAI,IAAI,GAAG,eAAe;AAE1E,SAAO,GAAG,MAAM,IAAI,aAAa,GAAG;;AAGtC,QAAO,iBAAiB,cAAc,UAAU,EAAE,KAAK;;;;;;;;;;ACtE3D,MAAaC,0CACX,WACA,YACG;CACH,MAAM,EACJ,QACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAGJ,MAAM,oBAAoB,OAAmD;AAC3E,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO;EAGT,MAAM,iBAAiB,GAAG,MACvB,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,CACnB,QAAO,iBAAiB,KAAK;GAE/B,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD,QAAO;GAET,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cAAc,MAAM;IACzB,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACD,CAAC;IACF,CACD,OAAO,QAAQ;AAElB,MAAI,eAAe,WAAW,EAC5B,QAAO;AAGT,SAAO,EACL,MAAM,GAAG,MACL,EACE,UAAU,QAAQ,KAAK,GAAG,WAAW,GACjC,EAAE,MAAM,EAAE,QAAQ,gBAAgB,EAAE,GACpC,gBACL,GACD,GAAG,QAAQ,KAAK,GAAG,WAAW,GAAG,WAAW,SAAS,gBAAgB,EAC1E;;CAGH,MAAM,qBAAqB,iBAAiB,cAAc,UAAU,CAAC;AACrE,QAAO,uBAAuB,QAAQ,EAAE,GAAG;;;;;;;;;;AC9D7C,MAAaC,oCACX,WACA,YACG;CACH,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAsB,cAAgC;AAC9E,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,qBAAqB;EAG1C,MAAM,iBAAiB,EAAE;EACzB,IAAI,sBAAsB;EAC1B,IAAI,YAAY;AAEhB,OAAK,MAAM,QAAQ,GAAG,OAAO;AAE3B,OAAI,OAAO,SAAS,UAAU;AAC5B,0BAAsB;AACtB;;AAIF,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,iBAAiB,iBAAiB,KAAK;AAC7C,QAAI,gBAAgB;AAClB,SAAI,CAAC,aAAa,qBAAqB;AACrC,qBAAe,KAAK,oBAAoB;AACxC,4BAAsB;;AAExB,iBAAY;AACZ,oBAAe,KAAK,eAAe;;AAErC;;GAIF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAGF,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;GAC/C,MAAM,gBAAgB,cAAc,MAAM;IACxC,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD,eAAe,KAAK,eAAe,aAAa;IAChD;IACD,CAAC;AAEF,OAAI,eAAe;AACjB,QAAI,CAAC,aAAa,qBAAqB;AACrC,oBAAe,KAAK,oBAAoB;AACxC,2BAAsB;;AAExB,gBAAY;AACZ,mBAAe,KAAK,cAAc;;;EAItC,MAAM,aAAa,eAAe,KAAK,gBAAgB,GAAG,GAAG,IAAI,GAAG,WAAW,KAAK,IAAI;EAExF,MAAM,CAAC,QAAQ,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,MAAM,SAAS,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG;AAE5F,SAAO,aAAa,GAAG,SAAS,aAAa,WAAW;;AAG1D,QAAO,iBAAiB,WAAW,KAAK;;;;;;;;;;AC7E1C,MAAaC,sCACX,WACA,YACG;CACH,MAAM,EACJ,QACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,QAAQ,cAAc,UAAU;CAEtC,MAAM,oBAAoB,IAAmB,eAAuC;AAClF,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO;EAGT,MAAM,iBAAiB,GAAG,MACvB,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,CACnB,QAAO,iBAAiB,KAAK;GAE/B,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD,QAAO;GAET,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cAAc,MAAM;IACzB,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACD,CAAC;IACF,CACD,OAAO,QAAQ;AAElB,MAAI,eAAe,WAAW,EAC5B,QAAO;EAGT,MAAMC,gBAA8B,GAAG,GAAG,aAAa,gBAAgB;AAIvE,SAAO,GAAG,MAAM,EAAE,KAAK,eAAe,GAAG;;AAG3C,QAAO,iBAAiB,OAAO,KAAK;;;;;;;;;;AC9DtC,MAAaC,iCAA6D,WAAW,YAAY;CAC/F,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAmB,cAAwB;AACnE,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,qBAAqB;EAG1C,MAAMC,QAAkB,GAAG,MACxB,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,CACnB,QAAO,iBAAiB,KAAK;GAE/B,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD,QAAO;GAET,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cAAc,MAAM;IACzB,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD,eAAe,KAAK,eAAe,aAAa;IAChD;IACD,CAAC;IACF,CACD,OAAO,QAAQ;EAElB,MAAM,aAAa,MAAM,KAAK,GAAG;EAEjC,MAAM,CAAC,WAAW,aAAa,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG;EAC9D,MAAM,CAAC,QAAQ,UACb,MAAM,SAAS,IACX,CAAC,GAAG,UAAU,GAAG,GAAG,eAAe,OAAO,MAAM,OAAO,IAAI,YAAY,GACvE,CAAC,WAAW,UAAU;AAE5B,SAAO,aAAa,GAAG,SAAS,aAAa,WAAW;;AAG1D,QAAO,iBAAiB,cAAc,UAAU,EAAE,KAAK;;;;;AC1DzD,MAAM,eAAe,QAAgB,IAAI,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI;;;;;;;;AAS7E,MAAaC,oCACX,WACA,SACA,SACG;CACH,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAmB,cAAwB;AACnE,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,qBAAqB;EAG1C,MAAM,aAAa,KAAK,GAAG,GAAG,WAAW,CAAC;EAC1C,IAAI,gBAAgB;EAEpB,MAAMC,cAAwB,GAAG,MAC9B,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,qBAAqB,iBAAiB,KAAK;AACjD,QAAI,oBAAoB;AACtB,qBAAgB;AAEhB,YAAO,YAAY,mBAAmB,GAAG,qBAAqB,IAAI,mBAAmB;;AAEvF,WAAO;;GAET,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD,QAAO;GAET,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cACL,MACA;IACE,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACD,EACD,KACD;IACD,CACD,OAAO,QAAQ;AAElB,SAAO,YAAY,SAAS,IACxB,YAAY,WAAW,KAAK,CAAC,gBAC3B,YAAY,KACZ,GAAG,WAAW,IAAI,YAAY,KAAK,IAAI,CAAC,KAC1C;;CAGN,MAAM,iBAAiB,iBAAiB,cAAc,UAAU,EAAE,KAAK;AACvE,QAAO,YAAY,eAAe,GAAG,iBAAiB,IAAI,eAAe;;;;;;;;;;ACtE3E,MAAaC,+BAA2D,WAAW,YAAY;CAC7F,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAsB,6BAA+C;AAC7F,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAEhF,QAAO,2BAA2B,qBAAgD;EAGpF,MAAM,MACJ,kBAAkB,GAAG,IAAI,GAAG,MAAM,MAAK,MAAK,OAAO,MAAM,YAAY,GAAG,EAAE,KAAK,MAAM,GACjF,cAAc,GAAG,GACjB;EAEN,MAAM,iBAAiB,EAAE;EACzB,IAAI,sBAAsB;EAC1B,IAAI,YAAY;AAEhB,OAAK,MAAM,QAAQ,IAAI,OAAO;AAE5B,OAAI,OAAO,SAAS,UAAU;AAC5B,0BAAsB,KAAK,aAAa,SAA6B,KAAK;AAC1E;;AAIF,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,iBAAiB,iBACrB,MACA,IAAI,MAAM,WAAW,KACnB,EAAE,IAAI,OAAO,SAAS,KAAK,IAAI,cAAyC,GAAG,EAC9E;;AAED,QAAI,gBAAgB;AAClB,SAAI,CAAC,aAAa,qBAAqB;AACrC,qBAAe,KAAK,oBAAoB;AACxC,4BAAsB;;AAExB,iBAAY;AACZ,oBAAe,KAAK,eAAe;;AAErC;;GAIF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAGF,MAAM,gBAAgB,KAAK,eAAe,aAAa;GAEvD,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;GAE/C,MAAM,gBAAgB,cAAc,MAAM;IACxC,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACA;IACD,CAAC;AAEF,OAAI,eAAe;AACjB,QAAI,CAAC,aAAa,qBAAqB;AACrC,oBAAe,KAAK,oBAAoB;AACxC,2BAAsB;;AAExB,gBAAY;AACZ,mBAAe,KAAK,cAAc;;;AAItC,MAAI,eAAe,WAAW,EAC5B,QAAO;EAGT,MAAM,QAAQ,GAAG,IAAI,cAAc,GAAG,KAAK;EAC3C,MAAM,aAAa,QAAQ,IAAI,WAAY,MAAM,EAAE,GAAG,IAAI;EAC1D,MAAM,WAAW,IAAI,OAAO,CAAC,4BAA6B,SAAS,eAAe,SAAS;EAE3F,MAAM,CAAC,UAAU,YAAa,CAAC,eAAe,cAAc,CAAW,KAAI,QACzE,IAAI,MACA,QACE,kBAAkB,KAAK,cAAc,CAAC,OAAO,MAAM,CAAC,GACpD,kBAAkB,KAAK,cAAc,CAAC,MAAM,CAAC,GAC/C,QACE,kBAAkB,KAAK,cAAc,CAAC,MAAM,CAAC,GAC7C,kBAAkB,KAAK,aAAa,CAC3C;EAED,MAAM,SAAS,WAAW,GAAG,SAAS,IAAI,MAAM,GAAG;EACnD,MAAM,SAAS,WAAW,KAAK,WAAW,MAAM,GAAG;AAEnD,SAAO,GAAG,SAAS,eAAe,KAChC,gBAAgB,IAAI,GAAG,KAAK,aAAa,eAAmC,WAAW,KAAK,GAC7F,GAAG;;AAGN,QAAO,iBAAiB,WAAW,KAAK;;;;;;;;;;;AC7G1C,MAAaC,0CAER,WAAW,YAAY;CAC1B,MAAM,EACJ,QACA,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,gBAAgB,WAAW;CAEjC,MAAMC,SAAgB,EAAE;CAExB,MAAMC,cAAmC,EAAE;CAC3C,MAAMC,8BAAwC,IAAI,KAAK;CAEvD,MAAM,qBAAqB,UAAkB;AAC3C,MAAI,CAAC,YAAY,IAAI,MAAM,CACzB,aAAY,IAAI,uBAAO,IAAI,KAAK,CAAC;EAEnC,MAAM,iBAAiB,GAAG,MAAM,GAAG,YAAY,IAAI,MAAM,CAAE,OAAO;AAClE,cAAY,IAAI,MAAM,CAAE,IAAI,eAAe;AAC3C,SAAO;;CAGT,MAAM,eAAe,SAAmB;EACtC,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,MACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD,QAAO;EAGT,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;EAE/C,MAAM,kBAAkB,OAAO,YAC5B,CAAC,GAAG,YAAY,SAAS,CAAC,CAA6B,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CACrF;EAED,MAAM,gBAAgB,cACpB,MACA;GACE,GAAG;GACH,cAAc,sBAAsB,WAAW,UAAU;GACzD;GACA;GACA;GACD,EACD,EAAE,iBAAiB,QAAQ,CAC5B;AAED,MAAI,CAAC,OAAO,cAAc,CACxB,QAAO;EAGT,MAAM,EAAE,KAAK,QAAQ,iBAAiB;AAEtC,MAAI,OAAO,QAAQ,YAAY,CAAC,IAC9B,QAAO;;AAIT,MAAI,WAAW,mBAAmB,MAAM,QAAQ,aAAa,CAC3D,QAAO,KAAK,GAAG,aAAa;WACnB,WAAW,yBAAyB,OAAO,aAAa,EAAE;AACnE,UAAO,OAAO,aAAa,aAAa;AAIxC,QAAK,MAAM,KAAK,OAAO,KAAK,aAAa,CAAE,aAAY,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE;;AAGhF,SAAO;;CAGT,MAAM,oBAAoB,IAAsB,6BAA+C;AAC7F,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAEhF,QAAO,2BAA2B,qBAAgD;EAGpF,MAAM,iBAAiB,EAAE;EACzB,IAAI,sBAAsB;EAC1B,IAAI,YAAY;AAEhB,OAAK,MAAM,QAAQ,GAAG,OAAO;AAE3B,OAAI,OAAO,SAAS,UAAU;AAC5B,0BAAsB;AACtB;;AAIF,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,iBAAiB,iBAAiB,MAAM,GAAG,MAAM,WAAW,EAAE;;AAEpE,QAAI,gBAAgB;AAClB,SAAI,CAAC,aAAa,qBAAqB;AACrC,qBAAe,KAAK,oBAAoB;AACxC,4BAAsB;;AAExB,iBAAY;AACZ,oBAAe,KAAK,eAAe;;AAErC;;GAIF,MAAM,gBAAgB,YAAY,KAAK;AACvC,OAAI,eAAe;AACjB,QAAI,CAAC,aAAa,qBAAqB;AACrC,oBAAe,KAAK,oBAAoB;AACxC,2BAAsB;;AAExB,gBAAY;AACZ,mBAAe,KAAK,cAAc;;;AAItC,MAAI,eAAe,WAAW,EAC5B,QAAO;AAGT,SAAO,GAAG,GAAG,MAAM,SAAS,GAAG,GAAG,eAAe,KAAK,gBAAgB,GAAG,GAAG,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC;;AAG1G,KAAI,cACF,QAAO;EAAE,KAAK,iBAAiB,WAAW,KAAK;EAAE;EAAQ;AAE3D,QAAO;EAAE,KAAK,iBAAiB,WAAW,KAAK;EAAE,QAAQ;EAAa;;;;;;;;;;AClJxE,MAAa,iBAAiB,EAAE;;;;;;AAOhC,MAAaC,mCAER,WAAW,YAAY;CAC1B,MAAM,EACJ,QACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAmB,cAAwB;AACnE,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF,QAAO,YAAY,iBAAiB;EAGtC,MAAM,aAAa,GAAG,WAAW,aAAa;EAC9C,IAAI,gBAAgB;EAEpB,MAAMC,cAAyC,GAAG,MAC/C,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,qBAAqB,iBAAiB,KAAK;AACjD,QAAI,oBAAoB;AACtB,qBAAgB;AAChB,YAAO;;AAET;;GAEF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAEF,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cAAc,MAAM;IACzB,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACD,CAAC;IACF,CACD,OAAO,QAAQ;AAElB,SAAO,YAAY,SAAS,IACxB,YAAY,WAAW,KAAK,CAAC,gBAC3B,YAAY,KACZ,GAAG,aAAa,aAAa,GAC/B;;CAGN,MAAM,SAAS,iBAAiB,cAAc,UAAU,EAAE,KAAK;AAE/D,QAAO,UAAU,MAAM,EAAE,KAAK,QAAQ,GAAG;;;;;;;;;;AChE3C,MAAaC,sCACX,WACA,YACG;;CAEH,MAAM,EACJ,QACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,eACA,UAAU,EAAE,KACV;CAEJ,MAAM,EAAE,oBAAoB,OAAO;AAInC,KAAI,CAAC,GAAI;CAET,MAAM,oBAAoB,IAAmB,eAAmD;AAC9F,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAChF;EAGF,MAAM,aAAa,GAAG,WAAW,aAAa;EAC9C,IAAI,gBAAgB;EAEpB,MAAMC,cAAyC,GAAG,MAC/C,KAAI,SAAQ;AACX,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,qBAAqB,iBAAiB,KAAK;AACjD,QAAI,oBAAoB;AACtB,qBAAgB;AAChB,YAAO;;AAET;;GAEF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BAEjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAEF,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;AAC/C,UAAO,cAAc,MAAM;IACzB,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACD,CAAC;IACF,CACD,OAAO,QAAQ;AAElB,MAAI,YAAY,WAAW,EAAG;EAE9B,MAAM,SACJ,YAAY,WAAW,KAAK,CAAC,gBACzB,YAAY,KACZ,GAAG,GAAG,WAAW,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,aAAa;AAEjE,SAAO,GAAG,MAAM,GAAG,GAAG,MAAM,QAAQ,GAAG;;AAGzC,QAAO,iBAAiB,cAAc,UAAU,EAAE,KAAK;;;;;;;;;;AC3EzD,MAAaC,gCAA4D,WAAW,YAAY;CAC9F,MAAM,EACJ,QACA,oBACA,uBACA,sBACA,yBACA,sBACA,eACA,cACA,kBACE;CAEJ,MAAM,oBAAoB,IAAsB,6BAA+C;AAC7F,MAAI,CAAC,mBAAmB,IAAI,cAAc,GAAG,MAAiC,IAAI,CAEhF,QAAO,2BAA2B,qBAAgD;EAGpF,MAAM,iBAAiB,EAAE;EACzB,IAAI,sBAAsB;EAC1B,IAAI,YAAY;AAEhB,OAAK,MAAM,QAAQ,GAAG,OAAO;AAE3B,OAAI,OAAO,SAAS,UAAU;AAC5B,0BAAsB;AACtB;;AAIF,OAAI,YAAY,KAAK,EAAE;IACrB,MAAM,iBAAiB,iBAAiB,MAAM,GAAG,MAAM,WAAW,EAAE;;AAEpE,QAAI,gBAAgB;AAClB,SAAI,CAAC,aAAa,qBAAqB;AACrC,qBAAe,KAAK,oBAAoB;AACxC,4BAAsB;;AAExB,iBAAY;AACZ,oBAAe,KAAK,eAAe;;AAErC;;GAIF,MAAM,CAAC,kBAAkB,kBAAkB,aAAa,KAAK;AAC7D,OACE,CAAC,mBAAmB,MAAM,kBAAkB,eAAe,IAC3D,KAAK,UAAU,wBACf,KAAK,aAAa,2BACjB,yBAAyB,UAAa,KAAK,UAAU,qBAEtD;GAGF,MAAM,gBAAgB,KAAK,eAAe,aAAa;GAEvD,MAAM,YAAY,UAAU,QAAQ,KAAK,MAAM;GAE/C,MAAM,gBAAgB,cAAc,MAAM;IACxC,GAAG;IACH,cAAc,sBAAsB,WAAW,UAAU;IACzD;IACA;IACD,CAAC;AAEF,OAAI,eAAe;AACjB,QAAI,CAAC,aAAa,qBAAqB;AACrC,oBAAe,KAAK,oBAAoB;AACxC,2BAAsB;;AAExB,gBAAY;AACZ,mBAAe,KAAK,cAAc;;;AAItC,MAAI,eAAe,WAAW,EAC5B,QAAO;AAGT,SAAO,GAAG,GAAG,MAAM,SAAS,GAAG,GAAG,eAAe,KAAK,gBAAgB,GAAG,GAAG,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC;;AAG1G,QAAO,iBAAiB,WAAW,KAAK;;;;;AC5D1C,MAAM,mBAAmB;CAAE,KAAK;CAAM,MAAM;CAAO,KAAK;CAAM,MAAM;CAAO;AAK3E,MAAMC,mBACJ,IACA,sBAEA,GAAG,WAAW,MAAM,IAAI,GAAG,WAAW,UAAU,GAC5C,EAAE,MAAM,EAAE,UAAU,mBAAmB,EAAE,GACzC;AAEN,MAAM,YAAY,MAAc,GAAG,QAAQ,WAAW,OAAO;AAE7D,MAAMC,kBAA2E;CAC/E,YAAY;CACZ,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB,UAAU;CACX;AACD,MAAM,iBAAiB,GAAW,GAAmC,MAAc;CACjF,MAAM,SAAS,QAAQ,EAAE,WAAW,gBAAgB,MAAM,EAAE,QAAQ,EAAE;AACtE,QAAO,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW;;AAI5C,MAAM,iBAAiB,GAAQ,iBAC7B,OAAO,MAAM,YACT,IACA,qBAAqB,GAAG,aAAa,GACnC,YAAY,GAAG,EAAE,cAAc,CAAC,GAChC;;;;;;AAOR,MAAaC,qCACX,MACA,UAAU,EAAE,KACuC;CACnD,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,EAAE,cAAc,uBAAuB;CAC7C,MAAM,aAAa,GAAG,SAAS;AAG/B,KAAI,iBAAiB,KAAK,CAAE,QAAO;AAEnC,KAAI,gBAAgB,SAAS;AAE3B,MAAI,QAAQ,MAAM,CAAC,MAAK,MAAK,OAAO,MAAM,SAAS,CAAE,QAAO;EAE5D,MAAM,iBAAiB,SAAS,MAAM;AAEtC,UAAQ,YAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,MAAM;IACT,MAAM,oBAAoB,eAAe,MAAM,OAAO;IACtD,MAAM,iBAAiB,SAAS,MAAM;AACtC,WAAO,iBACH,EACE,MAAM,EACJ,QAAQ,EACN,QAAQ,EACN,QAAQ,QAAQ,eAAe,WAAW,kBAAkB,QAAQ,eAAe,WACpF,EACF,EACF,EACF,GACD;;GAGN,KAAK;GACL,KAAK,SAAS;IACZ,MAAM,eAAe,QAAQ,MAAM;AACnC,QAAI,aAAa,SAAS,GAAG;KAC3B,MAAM,MAAM,aAAa,KAAI,OAAM,EACjC,MAAM,EACJ,QAAQ,EAAE,QAAQ,EAAE,QAAQ,QAAQ,eAAe,mBAAmB,EAAE,WAAW,EAAE,EACtF,EACF,EAAE;AACH,YAAO,EAAE,MAAM,eAAe,OAAO,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,KAAK,EAAE;;AAE5E,WAAO;;GAGT,KAAK;GACL,KAAK,cAAc;IACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,QAAI,aAAa,UAAU,KAAK,aAAa,MAAM,aAAa,IAAI;KAClE,MAAM,SAAS,QAAQ,eAAe,mBAAmB,aAAa,GAAG,mBAAmB,eAAe,mBAAmB,aAAa,GAAG;AAC9I,YAAO,EACL,MAAM,EACJ,QAAQ,EAAE,QAAQ,EAAE,QAAQ,eAAe,eAAe,KAAK,OAAO,KAAK,QAAQ,EAAE,EACtF,EACF;;AAEH,WAAO;;GAGT,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,kBAAkB;IACrB,MAAM,iBAAiB,SAAS,MAAM;AACtC,QAAI,CAAC,eAAgB,QAAO;AAE5B,WAAO,EACL,MAAM,EACJ,QAAQ,EACN,QAAQ,EACN,QALO,cAAc,gBAAgB,YAAY,eAAe,EAMjE,EACF,EACF,EACF;;;;AAKP,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACH,QAAO,EACL,OAAO,GACJ,QAAQ,GACN,iBAAiB,cAAc,cAAc,OAAO,aAAa,EACnE,EACF,EACF;EAEH,KAAK,IACH,QAAO,EAAE,MAAM,GAAG,QAAQ,cAAc,OAAO,aAAa,EAAE,EAAE;EAElE,KAAK,KACH,QAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,cAAc,OAAO,aAAa,EAAE,EAAE,EAAE,EAAE;EAE1F,KAAK,OACH,QAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;EAEtD,KAAK,UACH,QAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;EAE9B,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM,CAAC,KAAI,MAAK,cAAc,GAAG,aAAa,CAAC;AAC5E,OAAI,aAAa,SAAS,GAAG;IAC3B,MAAM,MAAM,aAAa,KAAI,OAAM,EAAE,MAAM,GAAG,QAAQ,cAAc,GAAG,aAAa,EAAE,EAAE,EAAE;AAC1F,WAAO,EAAE,MAAM,eAAe,OAAO,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,KAAK,EAAE;;AAE5E,UAAO;;EAGT,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,aAAa,aAAa,GAAG,IAC7B,aAAa,aAAa,GAAG,EAC7B;IACA,IAAI,CAAC,OAAO,UAAU;IAGtB,MAAM,qBAAqB,EAAE,iBAAiB;AAC9C,QACE,qBAAqB,OAAO,mBAAmB,IAC/C,qBAAqB,QAAQ,mBAAmB,EAChD;KACA,MAAM,WAAW,YAAY,OAAO,EAAE,cAAc,oBAAoB,CAAC;KACzE,MAAM,YAAY,YAAY,QAAQ,EAAE,cAAc,oBAAoB,CAAC;AAC3E,SAAI,CAAC,sBAAsB,YAAY,UAAU;MAC/C,MAAM,UAAU;AAChB,eAAS;AACT,cAAQ;YACH;AACL,cAAQ;AACR,eAAS;;;AAGb,WAAOF,gBAAc,YAAY,EAAE,OAAO,GAAG,QAAQ;KAAE,KAAK;KAAO,KAAK;KAAQ,EAAE,EAAE,CAAC;;AAEvF,UAAO;;EAGT,KAAK;EACL,KAAK,iBACH,QAAOA,gBAAc,YAAY,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,KAAK,MAAM,KAAK,EAAE,EAAE,CAAC;EAEtF,KAAK;EACL,KAAK,mBACH,QAAOA,gBAAc,YAAY,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAK,EAAE,EAAE,CAAC;EAEpF,KAAK;EACL,KAAK,iBACH,QAAOA,gBAAc,YAAY,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,KAAK,SAAS,EAAE,EAAE,CAAC;;AAEtF,QAAO;;;;;AC1OT,MAAM,gBAAgB,OAAe,GAAG,WAAW,MAAM,IAAI,GAAG,WAAW,UAAU;AAGrF,MAAM,SAAS,GAAQ,iBACrB,IAAI,OAAO,MAAM,YAAY,CAAC,eAAe,GAAG,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC;AAEjF,MAAM,UAAU,QAAgB,aAAqBG,WAAS,QAAQ,OAAO,KAAK;AAElF,MAAM,qBAAqB,MACzB,GAAG,IAAI,WAAW,wBAAwB,OAAO,GAAG,MAAM,CAAC,WAAW,KAAK,OAAO,GAAG,OAAO;;;;;;AAO9F,MAAaC,+BACX,MAEA,UAAU,EAAE,KACT;CACH,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,EACJ,cACA,cACA,oBACA,sBAAsB,CAAC,IAAI,GAAG,EAC9B,2BAA2B,OACzB;CAEJ,MAAM,eAAe,gBAAgB;CACrC,MAAM,eACJ,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,qBAAqB,OAAO,aAAa;CAE3C,MAAM,OAAO,MACX,mBAAmB,GAAG;EAAE;EAAqB;EAA0B,CAAC;CAE1E,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB;UACS,WAAW;EACpB,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,aAAa,UAAU,IAAI,MAAM,CAAC;EACxC,MAAM,gBAAgB,kBAAkB,IAAI,MAAM,CAAC,kBAAkB,iCACnE,eAAe,OAAwB,EACrC,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO,EAAE,QAAQ,MAAM,EAAE,UAAU;GAAM,GACvE,CAAC,EACF,QACD,CAAC;AAEF,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,GAAG,cAAc,KAAK;GAE/B,KAAK,OACH,QAAO,GAAG,cAAc;GAE1B,KAAK,OACH,QAAO,GAAG,cAAc;GAE1B,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;AAElE,QAAI,YAAY,KAAK,YAAY,EAC/B,QAAO,GAAG,cAAc,GAAG,GAAG,IAAI,WAAW,KAAK,UAAU;AAE9D,WAAO,GAAG,cAAc,GAAG,GAAG,GAAG;;;;CAKvC,MAAM,aAAa,GAAG,SAAS;AAC/B,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACH,QAAO,GAAG,IAAI,MAAM,CAAC,GAAG,WAAW,GACjC,eACI,IAAI,aAAa,MAAM,CAAC,GACxB,eACE,aAAa,MAAM,GACnB,MAAM,OAAO,aAAa;EAGpC,KAAK;EACL,KAAK,iBACH,QAAO,OACL,aAAa,IAAI,MAAM,CAAC,IAAI,eAAe,IAAI,aAAa,MAAM,CAAC,GAAG,MAAM,OAAO,aAAa,CAAC,IACjG,aAAa,WAAW,CACzB;EAEH,KAAK;EACL,KAAK,mBACH,QAAO,OACL,eACI,cAAc,IAAI,MAAM,CAAC,eAAe,IAAI,aAAa,MAAM,CAAC,CAAC,OAAO,IAAI,aAAa,MAAM,CAAC,KAChG,aAAa,IAAI,MAAM,CAAC,MAAM,kBAAkB,MAAM,CAAC,KAC3D,aAAa,WAAW,CACzB;EAEH,KAAK;EACL,KAAK,iBACH,QAAO,OACL,eACI,cAAc,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,cAAc,IAAI,aAAa,MAAM,CAAC,CAAC,OAAO,IAAI,aAAa,MAAM,CAAC,KACtH,aAAa,IAAI,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,MAC1D,aAAa,WAAW,CACzB;EAEH,KAAK,OACH,QAAO,GAAG,IAAI,MAAM,CAAC;EAEvB,KAAK,UACH,QAAO,GAAG,IAAI,MAAM,CAAC;EAEvB,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM;AACnC,UAAO,OACL,GAAG,IAAI,MAAM,CAAC,OAAO,aAClB,KAAI,QACH,eACI,GAAG,IAAI,aAAa,IAAI,CAAC,KACzB,qBAAqB,KAAK,aAAa,GACrC,GAAG,aAAa,IAAI,KACpB,MAAM,KAAK,aAAa,CAC/B,CACA,KAAK,KAAK,CAAC,IACd,aAAa,WAAW,CACzB;;EAGH,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,SAAS,KACtB,uBAAuB,aAAa,GAAG,IACvC,uBAAuB,aAAa,GAAG,CAEvC,QAAO;GAGT,MAAM,CAAC,OAAO,UAAU;GAGxB,MAAM,qBAAqB,EAAE,iBAAiB;GAC9C,MAAM,WAAW,qBAAqB,OAAO,mBAAmB,GAC5D,YAAY,OAAO,EAAE,cAAc,oBAAoB,CAAC,GACxD;GACJ,MAAM,YAAY,qBAAqB,QAAQ,mBAAmB,GAC9D,YAAY,QAAQ,EAAE,cAAc,oBAAoB,CAAC,GACzD;GACJ,IAAI,aAAa,OAAO,MAAM,SAAS,GAAI,eAAe,GAAG,UAAU,QAAS;GAChF,IAAI,cAAc,OAAO,MAAM,UAAU,GAAI,eAAe,GAAG,WAAW,SAAU;AAEpF,OACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;IACA,MAAM,UAAU;AAChB,kBAAc;AACd,iBAAa;;GAGf,MAAM,kBACJ,qBAAqB,OAAO,aAAa,IAAI,qBAAqB,QAAQ,aAAa;GACzF,MAAM,kBAAkB,KAAa,QACnC,eAAe,IAAI,IAAI,GAAG,kBAAkB,MAAM,MAAM,KAAK,aAAa;GAE5E,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,eAAe,OAAO,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,eAAe,QAAQ,YAAY;AAEpI,UAAO,eAAe,YAAY,IAAI,WAAW,KAAK,OAAO,YAAY,KAAK;;;AAIlF,QAAO;;;;;ACvLT,MAAM,mBAAmB,OACvB,GACG,QAAQ,SAAS,MAAM,CACvB,QAAQ,cAAc,KAAK,CAC3B,QAAQ,WAAW,KAAK;AAE7B,MAAM,iBAAiB,IAAY,aACjC,GAAG,WAAW,MAAM,IAAI,GAAG,WAAW,UAAU,GAAG,EAAE,KAAK,UAAU,GAAG;;;;;;AAOzE,MAAaC,iCAAgD,MAAM,UAAU,EAAE,KAAmB;CAChG,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,EAAE,cAAc,uBAAuB;CAC7C,MAAM,eAAe,gBAAgB;CACrC,MAAMC,cAA4B,EAAE,KAAK,OAAO;CAChD,MAAM,yBAAyB,MAC7B,eACI,EAAE,KAAK,GAAG,KAAK,GACf,qBAAqB,GAAG,aAAa,GACnC,YAAY,GAAG,EAAE,cAAc,CAAC,GAChC;CAER,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB,QAAO;UACE,WAAW;EACpB,MAAM,EAAE,MAAM,cAAc;AAE5B,UAAQ,MAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK,OACH,QAAO,GACJ,OAAO,CACN,EAAE,KAAK,OAAO,EACd,MAAM,MAAM,WAAW,KAAK,CAAC,YAAY,MAAM,MAAM,GAAG,GACpD,8BAA8B,MAAM,MAAM,IAAI,QAAQ,GACtD,mCAAmC,OAAO,QAAmC,CAClF,EACF;GAEH,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;IAElE,MAAM,gBAAgB,EACpB,QAAQ;KACN,EACE,QAAQ,CACN,EAAE,KAAK,OAAO,EACd,MAAM,MAAM,WAAW,KAAK,CAAC,YAAY,MAAM,MAAM,GAAG,GACpD,8BAA8B,MAAM,MAAM,IAAI,QAAQ,GACtD,mCAAmC,OAAO,QAAmC,CAClF,EACF;KACD,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,eAAe,CAAC,EAAE;KACpC;KACD,EACF;AAED,QAAI,YAAY,KAAK,YAAY,GAAG;KAClC,MAAM,aAAa,EACjB,QAAQ;MAAC,EAAE,KAAK,OAAO;MAAE,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,eAAe,CAAC,EAAE;MAAE;MAAE,EAClE;AACD,YAAO,GAAG,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,UAAU,EAAE,CAAC,EAAE;;AAEpE,WAAO,GAAG,KAAK,CAAC,eAAe,UAAU,EAAE;;;;CAKjD,MAAM,aAAa,GAAG,SAAS;AAC/B,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACH,QAAO,GACJ,gBAAgB,WAAW,GAAG,CAAC,aAAa,sBAAsB,MAAM,CAAC,EAC3E;EAEH,KAAK;EACL,KAAK,UACH,QAAO,GACJ,GAAG,eAAe,YAAY,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,EAClE;EAGH,KAAK;EACL,KAAK,QAEH,QAAO,cAAc,YAAY,EAAE,IAAI,CAAC,aADnB,QAAQ,MAAM,CAAC,KAAI,MAAK,sBAAsB,EAAE,CAAC,CACJ,EAAE,CAAC;EAGvE,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,aAAa,aAAa,GAAG,IAC7B,aAAa,aAAa,GAAG,EAC7B;IACA,IAAI,CAAC,OAAO,UAAU;IAGtB,MAAM,qBAAqB,EAAE,iBAAiB;AAC9C,QACE,CAAC,gBACD,qBAAqB,OAAO,mBAAmB,IAC/C,qBAAqB,QAAQ,mBAAmB,EAChD;KACA,MAAM,WAAW,YAAY,OAAO,EAAE,cAAc,oBAAoB,CAAC;KACzE,MAAM,YAAY,YAAY,QAAQ,EAAE,cAAc,oBAAoB,CAAC;AAC3E,SAAI,CAAC,sBAAsB,YAAY,UAAU;MAC/C,MAAM,UAAU;AAChB,eAAS;AACT,cAAQ;YACH;AACL,cAAQ;AACR,eAAS;;eAEF,cAAc;AACvB,aAAQ,EAAE,KAAK,OAAO;AACtB,cAAS,EAAE,KAAK,QAAQ;;AAG1B,WAAO,cAAc,YADU,EAAE,MAAM;KAAC;KAAO;KAAa;KAAO,EAAE,CAC3B;;AAE5C,UAAO;;EAGT,KAAK;EACL,KAAK,iBAIH,QAAO,cAAc,YAHU,EAC7B,IAAI,CAAC,sBAAsB,MAAM,EAAE,YAAY,EAChD,CACyC;EAG5C,KAAK;EACL,KAAK,mBAIH,QAAO,cAAc,YAHU,EAC7B,YAAY,CAAC,aAAa,sBAAsB,MAAM,CAAC,EACxD,CACyC;EAG5C,KAAK;EACL,KAAK,iBAIH,QAAO,cAAc,YAHU,EAC7B,UAAU,CAAC,aAAa,sBAAsB,MAAM,CAAC,EACtD,CACyC;;AAG9C,QAAO;;;;;AC1KT,MAAM,YAAY,QAAgB,aAAqBC,WAAS,KAAK,OAAO,KAAK,GAAG;AAEpF,MAAM,cAAc,MAClB,GAAG,aAAa,EAAE,GAAG,WACnB,oBACC,MAAc,KAAK,EAAE,YAAY,EAAE,CAAE,SAAS,GAAG,GACnD;;;;;;AAOH,MAAaC,4BACX,MAEA,UAAU,EAAE,KACT;CACH,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,EAAE,uBAAuB;CAC/B,MAAM,aAAa,GAAG,SAAS;AAG/B,KAEE,gBAAgB,WAEf,uBAAuB,MAAM,IAAI,eAAe,UAAU,eAAe,aAE1E,iBAAiB,KAAK,CAEtB,QAAO;AAGT,SAAQ,YAAR;EACE,KAAK;EACL,KAAK,KACH,QAAO,SAAS,IAAI,MAAM,GAAG,WAAW,MAAM,CAAC,IAAI,eAAe,KAAK;EAEzE,KAAK;EACL,KAAK,KACH,QAAO,IAAI,MAAM,IAAI,WAAW,MAAM,CAAC;EAEzC,KAAK;EACL,KAAK,KACH,QAAO,IAAI,MAAM,IAAI,WAAW,MAAM,CAAC;EAEzC,KAAK;EACL,KAAK,iBACH,QAAO,SAAS,IAAI,MAAM,IAAI,WAAW,MAAM,CAAC,KAAK,eAAe,iBAAiB;EAEvF,KAAK;EACL,KAAK,mBACH,QAAO,SAAS,IAAI,MAAM,GAAG,WAAW,MAAM,CAAC,KAAK,eAAe,mBAAmB;EAExF,KAAK;EACL,KAAK,iBACH,QAAO,SAAS,IAAI,MAAM,IAAI,WAAW,MAAM,CAAC,IAAI,eAAe,iBAAiB;EAEtF,KAAK;EACL,KAAK,UACH,QAAO,SAAS,IAAI,MAAM,MAAM,eAAe,UAAU;EAE3D,KAAK;EACL,KAAK,QAEH,QAAO,SACL,KAFmB,QAAQ,MAAM,CAEf,KAAI,QAAO,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IACvE,eAAe,QAChB;EAGH,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,SAAS,KACtB,uBAAuB,aAAa,GAAG,IACvC,uBAAuB,aAAa,GAAG,CAEvC,QAAO;GAGT,MAAM,CAAC,OAAO,UAAU;GACxB,MAAM,WAAW,qBAAqB,OAAO,KAAK,GAC9C,YAAY,OAAO,EAAE,cAAc,MAAM,CAAC,GAC1C;GACJ,MAAM,YAAY,qBAAqB,QAAQ,KAAK,GAChD,YAAY,QAAQ,EAAE,cAAc,MAAM,CAAC,GAC3C;GACJ,IAAI,aAAa,OAAO,MAAM,SAAS,GAAG,QAAQ;GAClD,IAAI,cAAc,OAAO,MAAM,UAAU,GAAG,SAAS;AAErD,OACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;IACA,MAAM,UAAU;AAChB,kBAAc;AACd,iBAAa;;AAGf,UAAO,SACL,MAAM,MAAM,IAAI,WAAW,WAAW,CAAC,IAAI,MAAM,IAAI,WAAW,YAAY,CAAC,KAC7E,eAAe,aAChB;;;;AAKL,QAAO;;;;;AC/GT,MAAM,2BAA2B,GAAY,WAAmB,iBAC9D,gBAAgB,OAAO,MAAM,WACzB,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,YAAY,GAC7B;;;;;;AAOjC,MAAaC,2BACX,MAEA,OAAO,EAAE,KACN;CACH,MAAM,EACJ,cACA,QACA,cACA,qBACA,iBACA,0BACA,iBACE;CACJ,MAAM,eAAe,KAAK,gBAAgB;CAC1C,MAAM,oBAAoB,GAAG,KAAK,SAAS;CAC3C,MAAM,YAAY,mBAA8C;CAGhE,MAAM,cAAc,MAAW,GAAG,YAAY,IAAI;CAClD,MAAM,eAAe,MAAW,wBAAwB,GAAG,WAAW,aAAa;CACnF,MAAM,iBAAiB,MAAW,WAAW,YAAY,EAAE,CAAC;CAE5D,MAAM,iBAAiB,MACrB,mBAAmB,GAAG;EAAE;EAAqB;EAA0B,CAAC;CAE1E,MAAM,IAAI,6CAA2C,EAAE;CACvD,MAAM,OAAO,EAAE,MAAM;CACrB,MAAM,SAAS,EAAE,QAAQ;CACzB,MAAM,UAAU,EAAE,SAAS;AAE3B,SAAQ,mBAAR;EACE,KAAK;EACL,KAAK,UACH,QAAO;EAGT,KAAK;EACL,KAAK,cAAc;AACjB,OAAI,CAAC,aACH,QAAO,4BAA4B,MAAM,KAAK;GAGhD,MAAM,eAAe,QAAQ,KAAK,OAAO,EAAE,oBAAoB,MAAM,CAAC,CACnE,MAAM,GAAG,EAAE,CACX,KAAI,MACH,cACE,UAAW,UAAqD,EAAE,EAAE,EAAE,EAAE,SAAS,EAClF,CACF;AACH,OACE,aAAa,SAAS,KACtB,CAAC,aAAa,aAAa,GAAG,IAC9B,CAAC,aAAa,aAAa,GAAG,CAE9B,QAAO;AAET,UAAO,4BAA4B;IAAE,GAAG;IAAM,OAAO;IAAc,EAAE,KAAK;;EAG5E,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,KAAK,MAAM;AACxC,OAAI,aAAa,WAAW,EAAG,QAAO;GACtC,MAAM,iBAAiB,aAAa,KAAI,MACtC,eACI,cACE,UAAW,UAAqD,EAAE,EAAE,EAAE,EAAE,SAAS,EAClF,GACD,qBAAqB,GAAG,aAAa,GACnC,GAAG,aAAa,EAAE,KAClB,GAAG,cAAc,EAAE,GAC1B;AACD,UAAO,GAAG,eAAe,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,eAAe,SAAS,IAAI,MAAM,GAAG,GAAG,KAAK,GAAG,eAAe,GAAG,GAAG;;;AAI5H,KAAI,OAAO,KAAK,UAAU,UACxB,QAAO,KAAK,QAAQ,SAAS;AAG/B,QAAO,eACH,cACE,UAAW,UAAqD,EAAE,EAAE,KAAK,MAAM,EAAE,SAC/E,KAAK,MACR,GACD,qBAAqB,KAAK,OAAO,aAAa,GAC5C,GAAG,aAAa,KAAK,MAAM,KAC3B,GAAG,cAAc,KAAK,MAAM;;;;;;;;;;ACvFpC,MAAaC,2BAA8C;CACzD,KAAK,CAAC,MAAM,8BAA8B;CAC1C,MAAM,CAAC,UAAU,kCAAkC;CACnD,KAAK,CAAC,gBAAgB,4BAA4B;CAClD,KAAK,CAAC,mBAAmB,+BAA+B;CACxD,MAAM,CAAC,4BAA4B,wCAAwC;CAC3E,MAAM,CAAC,+BAA+B,2CAA2C;CACjF,UAAU,CAAC,YAAY,wBAAwB;CAC/C,YAAY,CAAC,eAAe,2BAA2B;CACvD,UAAU,CAAC,aAAa,yBAAyB;CACjD,gBAAgB,CAAC,oBAAoB,gCAAgC;CACrE,kBAAkB,CAAC,uBAAuB,mCAAmC;CAC7E,gBAAgB,CAAC,qBAAqB,iCAAiC;CACvE,MAAM;CACN,SAAS;CACT,IAAI,CAAC,wBAAwB,4BAA4B;CACzD,OAAO,CAAC,4BAA4B,kCAAkC;CACtE,SAAS,CAAC,cAAc,2BAA2B;CACnD,YAAY,CAAC,kBAAkB,+BAA+B;CAC/D;;AAGD,MAAM,4BAA4B,EAAE;;;;;;AAOpC,MAAaC,8BACX,MAEA,OAAO,EAAE,KACN;CACH,MAAM,EAAE,OAAO,UAAU,cAAc,YAAY;;CAEnD,MAAM,EACJ,eAAe,qBACf,aAAa,mBAAmB,6BAC9B;CAEJ,MAAM,iBAAiB,IAAI,IACzB,OAAO,QAAQ,yBAAyB,CACzC;AACD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,iBAAiB,CACzD,gBAAe,IAAI,GAAG,IAAI,EAAE,MAAM;CAEpC,MAAM,cAAc,OAAO,YAAY,eAAe;CAEtD,MAAM,EAAE,OAAO,YAAY,UAAU,UACnC,iBACE,aAAa,OAAO,EAClB,WAAW,KAAK,aAAa;EAC3B,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACF,CAAC,IAA+B,EAAE,CACpC,EACD,SACD,IAAI;EACH,MAAM;EACN,OAAO;EACP,OAAO;EACR;CAED,MAAM,aAAa,YAAY,eAC7B,YAAY,GAAG,WAAW,KAAuC,CAAC,OAAO,MAAM;AAEjF,QAAO,OAAO,eAAe,WAAW,aAAa,WAAW,gBAAgB,UAAU,IAAI;;;;;;;AAQhG,MAAaC,0BAAyC,MAAM,SAAS;CACnE,MAAM,EAAE,OAAO,aAAa;;CAE5B,MAAM,EACJ,WACA,sBAAsB,CAAC,IAAI,GAAG,EAC9B,2BAA2B,IAC3B,kBAAkB,KAClB,oBAAoB,4BACpB,iBAAiB,yBACjB,iBAAiB,MACjB,YAAY,UACV,qCAAmC,EAAE;CAEzC,MAAM,iBAAiB,mBAAmB,WAAW,SAAS,OAAO;EACnE;EACA;EACD,CAAC;CAEF,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB,QAAO;UACE,WAAW;EACpB,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,oBAAoB,4BAA4B,KAAK,OAAO;GAChE,GAAI;GACJ,QAAQ,iBAAiB,WAAW,iBAAiB,EAAE,CAAC;GACzD,CAAC;EAGF,MAAM,OAAO,WAAW,eAAe,UAAU,KAAK;AAEtD,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,IAAI,MAAM,SAAS,GAAG,gBAAgB,iBAAiB,MAAM,MAAM,GAAG,GAAG,kBAAkB;GAEpG,KAAK,OACH,QAAO,IAAI,MAAM,SAAS,GAAG,aAAa,iBAAiB,MAAM,MAAM,GAAG,GAAG,kBAAkB;GAEjG,KAAK,OACH,QAAO,IAAI,MAAM,SAAS,GAAG,uBAAuB,iBAAiB,MAAM,MAAM,GAAG,GAAG,kBAAkB;GAE3G,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,KAAK,QAAQ,MAAM,MAAM;AACpC,QAAI,YAAY,KAAK,YAAY,EAC/B,QAAO,IAAI,MAAM,SAAS,KAAK,GAAG,GAAG,YAAY,IAAI,oBAAoB,iBAAiB,MAAM,MAAM,GAAG,GAAG,kBAAkB;AAEhI,WAAO,IAAI,MAAM,SAAS,KAAK,GAAG,GAAG,UAAU,mBAAmB,iBAAiB,MAAM,MAAM,GAAG,GAAG,kBAAkB;;;;CAK7H,MAAM,QAAQ,eAAe,MAAM;EACjC,GAAG;EACH;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,aAAa,GAAG,SAAS;AAC/B,MACG,eAAe,QACd,eAAe,WACf,eAAe,aACf,eAAe,iBACjB,CAAC,MAED,QAAO;CAKT,MAAM,eAAe;EACnB,GAAG;EACH,GAJwB,kBAAkB,MAAM,KAAK;EAKrD,GAAG;EACJ;AAED,QAAO,8BAA8B,UAAU,CAC5C,KAAI,SAAQ,GAAG,aAAa,QAAQ,CACpC,KAAK,IAAI,CACT,MAAM;;;;;;;;;;ACzKX,MAAaC,+BAA6C,SAAQ,GAAG,eAAe,KAAK,SAAS,CAAC;;;;;;AAOnG,MAAaC,2BAA0C,MAAM,OAAO,EAAE,KAAK;CACzE,MAAM,EACJ,sBAAsB,CAAC,IAAI,GAAG,EAC9B,2BAA2B,IAC3B,kBAAkB,KAClB,oBAAoB,6BACpB,iBAAiB,6BACjB,iBAAiB,SACf;CAEJ,MAAM,iBAAiB,MACrB,mBAAmB,GAAG;EAAE;EAAqB;EAA0B,CAAC;CAE1E,MAAM,YAAY,cAAc,KAAK,MAAM;CAE3C,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB;UACS,WAAW;AAEpB,MAAI,MAAM,WAAW,aAAc,QAAO;EAE1C,MAAM,EAAE,MAAM,cAAc;EAG5B,MAAM,oBAAoB;EAE1B,MAAM,oBAAoB,6BACxB,eAAe,KAAK,OAAwB,EAC1C,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO;GAAmB,GACxD,CAAC,EACF,KACD;AAED,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,gCAAgC,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,kBAAkB,mBAAmB,UAAU;GAEnJ,KAAK,OACH,QAAO,oCAAoC,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,kBAAkB;GAE1H,KAAK,OACH,QAAO,gCAAgC,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,kBAAkB;GAEtH,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;AAElE,WAAO,mBAAmB,YAAY,KAAK,YAAY,IAAI,mBAAmB,UAAU,QAAQ,GAAG,eAAe,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,kBAAkB,IAAI,GAAG,GAAG;;;;CAK/M,MAAM,QAAQ,eAAe,MAAM;EACjC,GAAG;EACH;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,WAAW,kBAAkB,MAAM,KAAK;CAE9C,MAAM,oBAAoB,GAAG,SAAS;AACtC,MACG,sBAAsB,QACrB,sBAAsB,YACtB,sBAAsB,aACtB,sBAAsB,kBACxB,CAAC,MAED,QAAO;AAGT,QAAO,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,MAAM;;;;;;;;;;;AC/EnD,MAAaC,qCAAoD,MAAM,MAAM,SAAS;;CAGpF,MAAM,EACJ,WACA,QACA,mBACA,cACA,aACA,kBACA,gBACA,sBAAsB,CAAC,IAAI,GAAG,EAC9B,0BACA,gBACA,oBAAoB,6BACpB,iBAAiB,gCACf,QAAQ,EAAE;CAEd,MAAM,EAAE,kBAAkB,EAAE,KAAK,QAAQ,EAAE;CAE3C,MAAM,gBAAgB,WAAW;CAEjC,MAAMC,SAAgB,EAAE;CAExB,MAAMC,cAAmC,EAAE;CAE3C,MAAM,YAAY,QAChB,gBAAgB;EAAE;EAAK;EAAQ,GAAG;EAAE;EAAK,QAAQ;EAAa;CAEhE,MAAM,iBAAiB,MACrB,mBAAmB,GAAG;EAAE;EAAqB;EAA0B,CAAC;CAE1E,MAAM,YAAY,cAAc,KAAK,MAAM;CAE3C,MAAM,YAAY,iBAAiB,KAAK;AAExC,KAAI,cAAc,MAChB;UACS,WAAW;AAEpB,MAAI,MAAM,WAAW,aAAc,QAAO,SAAS,GAAG;EAEtD,MAAM,EAAE,MAAM,cAAc;EAG5B,MAAM,oBAAoB;EAE1B,MAAM,EAAE,KAAK,WAAW,QAAQ,iBAAiB,uCAC/C,eAAe,KAAK,OAAwB,EAC1C,gBAAe,OAAM;GAAE,GAAG;GAAG,OAAO;GAAmB,GACxD,CAAC,EACF;GAAE,GAAI;GAAkC,QAAQ,EAAE;GAAiB,CACpE;;AAGD,MAAI,MAAM,QAAQ,aAAa,CAC7B,QAAO,KAAK,GAAG,aAAa;MAE5B,QAAO,OAAO,aAAa,aAAa;AAG1C,UAAQ,MAAR;GACE,KAAK,MACH,QAAO,SACL,gCAAgC,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,UAAU,mBAAmB,UAAU,MACnI;GAEH,KAAK,OACH,QAAO,SACL,oCAAoC,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,UAAU,GAC1G;GAEH,KAAK,OACH,QAAO,SACL,gCAAgC,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,UAAU,GACtG;GAEH,KAAK;GACL,KAAK;GACL,KAAK,WAAW;IACd,MAAM,KAAK,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO;AAElE,WAAO,SACL,mBAAmB,YAAY,KAAK,YAAY,IAAI,mBAAmB,UAAU,QAAQ,GAAG,eAAe,UAAU,OAAO,cAAc,kBAAkB,CAAC,SAAS,UAAU,IAAI,GAAG,GAAG,YAC3L;;;;CAKP,MAAM,QAAQ,eAAe,MAAM;EACjC;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,cAAc,kBAAkB,MAAM,KAAK;CACjD,MAAM,uBAAuB,GAAG,YAAY;CAC5C,MAAM,CAAC,MAAM,SAAS;AAEtB,MACG,yBAAyB,QACxB,yBAAyB,YACzB,yBAAyB,aACzB,yBAAyB,kBAC3B,CAAC,MAED,QAAO,SAAS,GAAG;UACV,yBAAyB,aAAa,yBAAyB,cACxE,QAAO,SAAS,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,cAAc;UACrD,KAAK,gBAAgB,QAC9B,QAAO,SAAS,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,YAAY,GAAG,QAAQ,MAAM,CAAC;UACrE,yBAAyB,QAAQ,yBAAyB,UAAU;EAC7E,MAAM,aAAa,QAAQ,KAAK,MAAM;AACtC,MAAI,eAAe;AACjB,QAAK,MAAM,KAAK,WACd,QAAO,KAAK,qBAAqB,GAAG,aAAa,GAAG,YAAY,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE;AAE3F,UAAO,SACL,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,YAAY,IAAI,WAC7C,KAAK,IAAI,MACR,iBACI,GAAG,cAAc,gBAAgB,SAAS,IAAI,WAAW,UAAU,WAAW,SAAS,OACvF,IACL,CACA,KAAK,KAAK,CAAC,GACf;;EAEH,MAAMC,WAAqB,EAAE;AAC7B,OAAK,MAAM,KAAK,YAAY;GAC1B,MAAM,gBAAgB,kBAAmB,KAAK,MAAM;AACpD,YAAS,KAAK,GAAG,cAAc,gBAAgB;AAC/C,eAAY,GAAG,mBAAmB,cAAc,KAAK,mBAAmB,qBACtE,GACA,aACD,GACG,YAAY,GAAG,EAAE,cAAc,CAAC,GAChC;;AAEN,SAAO,SAAS,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,YAAY,IAAI,SAAS,KAAK,KAAK,CAAC,GAAG;YAC9E,yBAAyB,aAAa,yBAAyB,eAAe;EAEvF,MAAM,CAAC,OAAO,UADO,QAAQ,KAAK,OAAO,EAAE,oBAAoB,MAAM,CAAC,CAEnE,MAAM,GAAG,EAAE,CACX,KAAI,MAAM,qBAAqB,GAAG,aAAa,GAAG,YAAY,GAAG,EAAE,cAAc,CAAC,GAAG,EAAG;AAC3F,MAAI,eAAe;AACjB,UAAO,KAAK,OAAO,OAAO;AAC1B,UAAO,SACL,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,YAAY,GAC1C,iBAAiB,GAAG,cAAc,gBAAgB,SAAS,MAAM,IAClE,OAAO,iBAAiB,GAAG,cAAc,gBAAgB,SAAS,MAAM,MAC1E;;EAEH,MAAM,iBAAiB,kBAAmB,KAAK,MAAM;EACrD,MAAM,kBAAkB,kBAAmB,KAAK,MAAM;AACtD,cAAY,GAAG,mBAAmB,cAAc,KAAK,oBAAoB;AACzE,cAAY,GAAG,mBAAmB,cAAc,KAAK,qBAAqB;AAC1E,SAAO,SACL,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,YAAY,GAAG,cAAc,eAAe,OAAO,cAAc,kBAClG;;CAGH,IAAI,aAAa,KAAK;AACtB,KAAI,OAAO,KAAK,UAAU,SACxB,KAAI,qBAAqB,KAAK,OAAO,aAAa,CAChD,cAAa,YAAY,KAAK,OAAO,EAAE,cAAc,CAAC;KAItD,cAAa,UAAU,KAAK,MAAM,GAC9B,MAAM,WAAW,YAAY,GAAG,GACL;CAInC,IAAI,YAAY;AAChB,KAAI,cACF,QAAO,KAAK,WAAW;MAClB;AACL,cAAY,kBAAmB,KAAK,MAAM;AAC1C,cAAY,GAAG,mBAAmB,cAAc,KAAK,eAAe;;AAGtE,QAAO,SACL,GAAG,OAAO,KAAK,QAAQ,MAAM,GAAG,YAAY,GAC1C,gBACI,iBACE,GAAG,cAAc,gBAAgB,SAAS,MAC1C,MACF,GAAG,cAAc,cACpB,MAAM,CACV;;;;;AC1MH,MAAM,iBAAoB,OAAgB,UAAa,iBACrD,qBAAqB,OAAO,CAAC,CAAC,gBAAgB,OAAO,UAAU,SAAS,GACpE,OAAO,YAAY,OAAO,EAAE,cAAc,CAAC,CAAC,cAAc,CAAC,CAAC,GAC5D;;;;;;AAON,MAAaC,8BACX,MAEA,UAAU,EAAE,KACT;CACH,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;;CAEhD,MAAM,EAAE,cAAc,uBAAuB;AAG7C,KAAI,gBAAgB,WAAW,iBAAiB,KAAK,CAAE;CAEvD,MAAM,aAAa,GAAG,SAAS;AAC/B,SAAQ,YAAR;EACE,KAAK,IACH,QAAO,GAAG,QAAQ,cAAc,OAAO,OAAO,aAAa,EAAE;EAE/D,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MAAM;GACT,MAAM,iBAAiB,gBAAgB;AACvC,UAAO,GACJ,QAAQ,GACN,iBAAiB,cAAc,OAAO,OAAO,aAAa,EAC5D,EACF;;EAGH,KAAK,WACH,QAAO,GAAG,QAAQ,EAAE,UAAU,OAAO,EAAE;EAEzC,KAAK,aACH,QAAO,GAAG,QAAQ,EAAE,YAAY,OAAO,EAAE;EAE3C,KAAK,WACH,QAAO,GAAG,QAAQ,EAAE,UAAU,OAAO,EAAE;EAEzC,KAAK,iBACH,QAAO,EAAE,KAAK,GAAG,QAAQ,EAAE,UAAU,OAAO,EAAE,EAAE;EAElD,KAAK,mBACH,QAAO,EAAE,KAAK,GAAG,QAAQ,EAAE,YAAY,OAAO,EAAE,EAAE;EAEpD,KAAK,iBACH,QAAO,EAAE,KAAK,GAAG,QAAQ,EAAE,UAAU,OAAO,EAAE,EAAE;EAElD,KAAK,OACH,QAAO,GAAG,QAAQ,MAAM;EAE1B,KAAK,UACH,QAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM;AACnC,UAAO,GACJ,QAAQ,GACN,gBAAgB,cAAc,aAAa,KAAI,QAC9C,cAAc,KAAK,KAAK,aAAa,CACtC,EACF,EACF;;EAGH,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,MAAM;AACnC,OACE,aAAa,UAAU,KACvB,aAAa,aAAa,GAAG,IAC7B,aAAa,aAAa,GAAG,EAC7B;IACA,MAAM,CAAC,OAAO,UAAU;IAGxB,MAAM,qBAAqB,EAAE,iBAAiB;IAC9C,MAAM,WAAW,qBAAqB,OAAO,mBAAmB,GAC5D,YAAY,OAAO,EAAE,cAAc,CAAC,GACpC;IACJ,MAAM,YAAY,qBAAqB,QAAQ,mBAAmB,GAC9D,YAAY,QAAQ,EAAE,cAAc,CAAC,GACrC;IACJ,IAAI,aAAa,OAAO,MAAM,SAAS,GAAG,QAAQ;IAClD,IAAI,cAAc,OAAO,MAAM,UAAU,GAAG,SAAS;AACrD,QACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;KACA,MAAM,UAAU;AAChB,mBAAc;AACd,kBAAa;;AAGf,WAAO,eAAe,YAClB,GAAG,QAAQ;KAAE,KAAK;KAAY,KAAK;KAAa,EAAE,GAClD,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,IAAI,YAAY,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC,EAAE;SAE/E,QAAO;;;AAIb,QAAO;;;;;;;;;;ACxGT,MAAaC,iCACX,MAEA,EAAE,cAAc,oBAAoB,UAAU,EAAE,KAAK,EAAE,KACf;CACxC,MAAM,EACJ,oBAAoB,IACpB,cAAc,KACd,aAAa,OACX;AAOJ,KAAI,iBAAiB,KAAK,CAAE;CAE5B,MAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB;CAChD,MAAM,eAAe,gBAAgB;CAErC,MAAM,aAAa,GAAG,SAAS;AAE/B,KAEE,CAAC,MAEA,iBACE,CAAC,OAGC,CAAC,MAAM;EAAC;EAAkB;EAAoB;EAAiB,CAAC,SAAS,WAAW,EAEzF;AAGF,SAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MAAM;GACT,MAAM,oBAAoB;IACxB,KAAK,GAAG;IACR,MAAM,GAAG;IACT,KAAK,GAAG;IACR,MAAM,GAAG;IACT,KAAK,GAAG;IACR,MAAM,GAAG;IACV,CAAC;AACF,UAAO,GACJ,QACC,gBAAgB,eAAe,MAC3B,GAAG,GAAG,MAAM,OAAO,GACnB,GACG,oBAAoB,eACjB,IAAK,MAAM,GACX,qBAAqB,OAAO,aAAa,GACvC,YAAY,OAAO,EAAE,cAAc,UAAU,CAAC,GAC9C,OACP,EACR;;EAGH,KAAK,WACH,QAAO,GAAG,QAAQ,GAAG,GAAG,YAAY,eAAe,IAAK,MAAM,GAAG,GAAG,SAAS,EAAE;EAEjF,KAAK,aACH,QAAO,GAAG,QAAQ,GAAG,GAAG,aAAa,eAAe,IAAK,MAAM,GAAG,GAAG,SAAS,EAAE;EAElF,KAAK,WACH,QAAO,GAAG,QAAQ,GAAG,GAAG,WAAW,eAAe,IAAK,MAAM,GAAG,GAAG,SAAS,EAAE;EAEhF,KAAK,iBACH,QAAO,GACJ,QAAQ,GACN,GAAG,UAAU,eAAe,GAAI,UAAU,KAAK,IAAK,MAAM,EAAE,IAAI,GAAG,IAAI,MAAM,IAC/E,EACF;EAEH,KAAK,mBACH,QAAO,GACJ,QAAQ,GAAG,GAAG,UAAU,eAAe,GAAI,UAAU,IAAK,MAAM,EAAE,IAAI,GAAG,GAAG,MAAM,IAAI,EACxF;EAEH,KAAK,iBACH,QAAO,GACJ,QAAQ,GAAG,GAAG,UAAU,eAAe,GAAI,UAAU,KAAK,IAAK,MAAM,CAAC,GAAG,IAAI,SAAS,EACxF;EAEH,KAAK,OACH,QAAO,GAAG,QAAQ,GAAG,GAAG,KAAK,MAAM,EAAE;EAEvC,KAAK,UACH,QAAO,GAAG,QAAQ,GAAG,GAAG,MAAM,MAAM,EAAE;EAExC,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,eAAe,QAAQ,MAAM;AACnC,UAAO,GACJ,QAAQ,GACN,eAAe,OAAO,GAAG,KAAK,GAAG,QAAQ,aAAa,KAAI,QACzD,eACI,IAAK,IAAI,GACT,qBAAqB,KAAK,aAAa,GACrC,YAAY,KAAK,EAAE,cAAc,UAAU,CAAC,GAC5C,IACP,EACF,EACF;;EAGH,KAAK;EACL,KAAK,cAAc;GACjB,MAAM,eAAe,QAAQ,OAAO,EAAE,oBAAoB,MAAM,CAAC;AACjE,OACE,aAAa,SAAS,KACtB,CAAC,aAAa,aAAa,GAAG,IAC9B,CAAC,aAAa,aAAa,GAAG,CAE9B;GAGF,MAAM,CAAC,OAAO,UAAU;GAExB,MAAM,WAAW,qBAAqB,OAAO,aAAa,GACtD,YAAY,OAAO,EAAE,cAAc,UAAU,CAAC,GAC9C;GACJ,MAAM,YAAY,qBAAqB,QAAQ,aAAa,GACxD,YAAY,QAAQ,EAAE,cAAc,UAAU,CAAC,GAC/C;GACJ,MAAM,aAAa,OAAO,MAAM,SAAS,GAAG,QAAQ;GACpD,MAAM,cAAc,OAAO,MAAM,UAAU,GAAG,SAAS;GACvD,MAAM,oBAAoB,CAAC,YAAY,YAAY;AACnD,OACE,CAAC,sBACD,eAAe,YACf,gBAAgB,aAChB,YAAY,UACZ;AACA,sBAAkB,KAAK;AACvB,sBAAkB,KAAK;;AAGzB,UAAO,GACJ,QAAQ,GACN,eAAe,YAAY,GAAG,UAAU,GAAG,aAAa,eACrD,kBAAkB,KAAI,MAAK,IAAK,EAAE,CAAC,GACnC,kBAAkB,OAAM,MAAK,qBAAqB,GAAG,aAAa,CAAC,GACjE,kBAAkB,KAAI,MAAK,YAAY,GAAG,EAAE,cAAc,UAAU,CAAC,CAAC,GACtE,mBACP,EACF;;;;;;;;;;;;ACjGP,MAAaC,oBAA2D;CACtE,MAAM,EAAE;CACR,QAAQ,EACN,kBAAkB,MACnB;CACD,QAAQ,EAAE;CACV,OAAO;EACL,gBAAgB;EAChB,qBAAqB,CAAC,KAAK,IAAI;EAC/B,0BAA0B;EAC1B,aAAa;EACd;CACD,OAAO,EACL,gBAAgB,UACjB;CACD,YAAY;EACV,qBAAqB;EACrB,gBAAgB;EAChB,aAAa;EACd;CACF;;;;;;AAOD,MAAaC,2BAA+D,EAC1E,GAAG,mBACJ;AAED,MAAM,wBAAwB;CAC5B,KAAK;CACL,SAAS;CACT,eAAe;CACf,kBAAkB;CAClB,MAAM;CACN,SAAS;CACT,WAAW;CACX,MAAM;CACN,eAAe;CACf,SAAS;CACT,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,QAAQ;CACR,WAAW;CACX,MAAM;CACN,KAAK;CACN;;AAGD,MAAMC,4BAA0C,MAAK,EAAE;AACvD,MAAM,4BAA4B;CAChC,KAAK;CACL,SAAS;CACT,eAAe;CACf,kBAAkB;CAClB,MAAM;CACN,SAAS;CACT,WAAW;CACX,MAAM;CACN,eAAe;CACf,SAAS;CACT,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,QAAQ;CACR,WAAW;CACX,MAAM;CACN,KAAK;CACN;AAED,MAAMC,6BAAoE;CACxE,KAAK;CACL,MAAM;CACN,SAAS;CACT,kBAAkB;CAClB,MAAM;CACN,KAAK;CACN;AAeD,MAAM,4BAA4B;CAChC,QAAQ;CACR,QAAQ,EAAE;CACV,qBAAqB,CAAC,IAAI,GAAG;CAC7B,0BAA0B;CAC1B,oBAAoB,EAAE;CACtB,aAAa;CACb,kBAAkB;CAClB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,yBAAyB;CACzB,iBAAiB;CACjB,gBAAgB;CAChB,QAAQ;CACR,WAAW;CACX,cAAc,EAAE;CAChB,aAAa,EAAE;CAChB;AAED,MAAM,sCAAsC,IAAI,IAAkB;CAChE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,aAAa,IAAI,IAAkB;CACvC;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAgKF,SAAS,YACP,WACA,cAAiD,EAAE,EACnD;CACA,MAAM,UAAU,OAAO,gBAAgB,WAAW,EAAE,QAAQ,GAAG,YAAY,EAAE,GAAG;CAEhF,MAAMC,SAAiC;EACrC,GAAG;EACH,GAAI,CAAC,QAAQ,UAAU,WAAW,IAAI,QAAQ,OAAO,GAChD,kBAAkB,QAAQ,UAAU,WAAW,OAChD;EACJ,GAAG;EACH,GAAI,CAAC,QAAQ,WACV,OAAO,KAAK,kBAAkB,CAAC,SAAS,QAAQ,UAAU,GAAG,GAAG,EAAE,QAAQ,OAAO,GAAG;EACxF;CAED,MAAM,SAAS,GAAG,OAAO,OAAO;CAEhC,MAAM,EACJ,oBAAoB,2BACpB,cAAc,qBACd,mBAAmB,0BACnB,cACA,qBAAqB,4BACrB,oBAAoB,2BACpB,eAAe,sBACf,WACA,gBAAgB,uBAChB,YACE;CAEJ,MAAM,yBAAyB,cAAsD;AAEnF,SAAO,OADmB,qBAAqB;GAAE;GAAc;GAAW,CAAC,KACvC,WAChC,OACA,OAAO,iBAAiB,YACtB,eACA;;CAGR,MAAM,oBACJ,OAAO,6BAA6B,aAChC,2BACC,0BAA0B,WAAW;CAE5C,MAAMC,iBACJ,OAAO,0BAA0B,aAC7B,uBAAuB,sBAAsB,IAC3C,MAAK,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GACvE,wBACF,WAAW,qBACT,0BACA,oCAAoC,IAAI,OAAO,GAC5C,wBAAwB,sBAAsB,UAC/C;CAEV,MAAM,iBACH,OAAO,yBAAyB,aAAa,uBAAuB,UACpE,oCAAoC,IAAI,OAAO,IAChD,OAAO,yBAAyB,cAChC,wBACI,iBACA,SACJ,sBAAsB,WACtB;CAEF,MAAM,sBAAsB,4BAA4B,2BAA2B;CACnF,MAAM,SAAS,iBAAiB,OAAO,OAAO;CAC9C,MAAMC,gBAAoD,GAAG,MAC3D,iBAAiB,oBAAoB,GAAG,EAAE,IAA+B,EAAE,CAAC;CAE9E,MAAM,qBACJ,6BACA,2BAA2B,WAC3B,2BAA2B;CAG7B,IAAIC,gBAA+B,EAAE;;AAGrC,KAAI,OAAO,cAAc,YAAY;EACnC,MAAM,mBAAmB,UAAU,UAAU;AAC7C,MAAI,OAAO,qBAAqB,WAE9B;;OAAI,CAAC,iBACH,QAAO,WAAW,kBACd;IAAE,KAAK;IAAoB,QAAQ,EAAE;IAAE,GACvC,WAAW,wBACT;IAAE,KAAK;IAAoB,QAAQ,EAAE;IAAE,GACvC,WAAW,YACT,IAAI,mBAAmB,KACvB,WAAW,kBACT,kBACA,WAAW,WACT,iBACA,WAAW,cACT,QACA,WAAW,kBACT,EAAE,GACF,WAAW,aAAa,WAAW,cACjC,SACA;QAGpB,iBAAgB;;CAIpB,MAAMC,eAA8C,EAAE;CACtD,MAAM,eAAe,kBAAkB,OAAO;AAC9C,MAAK,MAAM,KAAK;;AAEd,KAAI,OAAO,EAAE,cAAc,WACzB,cAAa,EAAE,SAAoC,EAAE,QAAQ,EAAE;CAInE,MAAM,gBAAgB,SAAmB;EACvC,IAAIC;EACJ,IAAIC;AACJ,MAAI,KAAK,GACP,oBAAmB,cAAc,KAAK;AAExC,MAAI,aAAa,SAAS,GAAG;GAC3B,MAAM,WAAW,aAAa,QAAO,MAAK,EAAE,SAAS,KAAK,MAAM;AAChE,OAAI,SAAS,SAAS,GAAG;IACvB,MAAM,QAAQ,SAAS;;AAEvB,QAAI,OAAO,MAAM,cAAc,WAC7B,kBAAiB,MAAM;;;AAI7B,SAAO,CAAC,kBAAkB,eAAe;;CAI3C,MAAMC,eAAwC;EAC5C,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;AAED,KAAI,OAAO,8BAA8B,WACvC,QAAO,0BAA0B,WAAW,aAAa;AAG3D,SAAQ,QAAR;EACE,KAAK;EACL,KAAK,oBAAoB;GACvB,MAAM,KAAK,eACP,QAAQ,YAAW,MAAK,eAAe,GAAG,aAAa,CAAC,GACxD;AACJ,OAAI,WAAW,mBACb,QAAO,KAAK,UAAU,KAAK,KAAK,UAE9B,QAAQ,QAAQ,QAAQ,SAAS,SAAY,4BAA4B,KAAK,MAAM,CACrF;AAEH,UAAO,KAAK,UAAU,IAAI,6BAA6B,EAAE;;EAG3D,KAAK,MACH,QAAO,6BAA6B,WAAW,aAAa;EAE9D,KAAK;EACL,KAAK,sBACH,QAAO,uCAAuC,WAAW,aAAa;EAExE,KAAK,UACH,QAAO,iCAAiC,WAAW,aAAa;EAElE,KAAK,gBACH,QAAO,sCAAsC,WAAW,aAAa;EAEvE,KAAK,MACH,QAAO,6BAA6B,WAAW,aAAa;EAE9D,KAAK,OACH,QAAO,8BAA8B,WAAW,aAAa;EAE/D,KAAK,UACH,QAAO,iCAAiC,WAAW,aAAa;EAElE,KAAK,YACH,QAAO,mCAAmC,WAAW,aAAa;EAEpE,KAAK,gBACH,QAAO,uCAAuC,WAAW,aAAa;EAExE,KAAK,mBACH,QAAO,4BAA4B,WAAW,aAAa;EAE7D,KAAK,OACH,QAAO,8BAA8B,WAAW,aAAa;EAE/D,KAAK,SACH,QAAO,gCAAgC,WAAW,aAAa;EAEjE,KAAK,UACH,QAAO,iCAAiC,WAAW,aAAa;EAElE,KAAK,YACH,QAAO,mCAAmC,WAAW,aAAa;EAEpE,QACE,QAAO;;;;;;AC7jBb,MAAM,0BACH,UACA,OAAO,UAAU,OAAO,gBACvB,KAAK;CAAE;CAAO;CAAU;CAAO;CAAa,EAAE,EAAE,cAAc,OAAO,CAAC;;;;;;AAO1E,MAAaC,wBAA8C,uBACzD,4BACD;;;;;;AAMD,MAAaC,+BAAqD,uBAChE,4BACD;;;;;;AAMD,MAAaC,2BACX,uBAAuB,wBAAwB;;;;;;AAMjD,MAAaC,4BACX,uBAAuB,yBAAyB;;;;;;AAyClD,MAAaC,iCAAgD;;;;;;AAM7D,MAAaC,qCAAoD;;;;;;AAMjE,MAAaC,kCAAiD"}