@opensaas/stack-core 0.40.0 → 0.41.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 (86) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +52 -0
  4. package/dist/access/access-filter.d.ts +88 -18
  5. package/dist/access/access-filter.d.ts.map +1 -1
  6. package/dist/access/access-filter.js +343 -36
  7. package/dist/access/access-filter.js.map +1 -1
  8. package/dist/access/access-filter.test.js +759 -6
  9. package/dist/access/access-filter.test.js.map +1 -1
  10. package/dist/access/denied-relation-visibility.test.d.ts +2 -0
  11. package/dist/access/denied-relation-visibility.test.d.ts.map +1 -0
  12. package/dist/access/denied-relation-visibility.test.js +114 -0
  13. package/dist/access/denied-relation-visibility.test.js.map +1 -0
  14. package/dist/access/engine.d.ts +11 -0
  15. package/dist/access/engine.d.ts.map +1 -1
  16. package/dist/access/engine.js +26 -0
  17. package/dist/access/engine.js.map +1 -1
  18. package/dist/access/errors.d.ts +34 -0
  19. package/dist/access/errors.d.ts.map +1 -1
  20. package/dist/access/errors.js +47 -0
  21. package/dist/access/errors.js.map +1 -1
  22. package/dist/access/field-visibility.d.ts +2 -2
  23. package/dist/access/field-visibility.d.ts.map +1 -1
  24. package/dist/access/field-visibility.js +73 -23
  25. package/dist/access/field-visibility.js.map +1 -1
  26. package/dist/access/index.d.ts +7 -3
  27. package/dist/access/index.d.ts.map +1 -1
  28. package/dist/access/index.js +9 -2
  29. package/dist/access/index.js.map +1 -1
  30. package/dist/access/multi-column-read-write.test.js.map +1 -1
  31. package/dist/access/query-validation.d.ts +31 -0
  32. package/dist/access/query-validation.d.ts.map +1 -1
  33. package/dist/access/query-validation.js +75 -16
  34. package/dist/access/query-validation.js.map +1 -1
  35. package/dist/access/relationship-count.d.ts +41 -3
  36. package/dist/access/relationship-count.d.ts.map +1 -1
  37. package/dist/access/relationship-count.js +44 -7
  38. package/dist/access/relationship-count.js.map +1 -1
  39. package/dist/access/relationship-count.test.js +62 -0
  40. package/dist/access/relationship-count.test.js.map +1 -1
  41. package/dist/access/synthetic-include-read.test.d.ts +2 -0
  42. package/dist/access/synthetic-include-read.test.d.ts.map +1 -0
  43. package/dist/access/synthetic-include-read.test.js +121 -0
  44. package/dist/access/synthetic-include-read.test.js.map +1 -0
  45. package/dist/config/types.d.ts +22 -22
  46. package/dist/config/types.d.ts.map +1 -1
  47. package/dist/context/hook-pipeline.d.ts +2 -2
  48. package/dist/context/hook-pipeline.d.ts.map +1 -1
  49. package/dist/context/hook-pipeline.js.map +1 -1
  50. package/dist/context/index.d.ts +16 -1
  51. package/dist/context/index.d.ts.map +1 -1
  52. package/dist/context/index.js +76 -26
  53. package/dist/context/index.js.map +1 -1
  54. package/dist/context/nested-operations.d.ts +2 -2
  55. package/dist/context/nested-operations.d.ts.map +1 -1
  56. package/dist/context/nested-operations.js +21 -3
  57. package/dist/context/nested-operations.js.map +1 -1
  58. package/dist/context/write-pipeline.d.ts.map +1 -1
  59. package/dist/context/write-pipeline.js +23 -29
  60. package/dist/context/write-pipeline.js.map +1 -1
  61. package/dist/hooks/index.d.ts +16 -15
  62. package/dist/hooks/index.d.ts.map +1 -1
  63. package/dist/hooks/index.js.map +1 -1
  64. package/package.json +2 -2
  65. package/src/access/access-filter.test.ts +1403 -159
  66. package/src/access/access-filter.ts +525 -47
  67. package/src/access/denied-relation-visibility.test.ts +173 -0
  68. package/src/access/engine.ts +28 -0
  69. package/src/access/errors.ts +55 -0
  70. package/src/access/field-visibility.ts +105 -24
  71. package/src/access/index.ts +11 -0
  72. package/src/access/multi-column-read-write.test.ts +3 -2
  73. package/src/access/query-validation.ts +136 -9
  74. package/src/access/relationship-count.test.ts +75 -0
  75. package/src/access/relationship-count.ts +53 -10
  76. package/src/access/synthetic-include-read.test.ts +179 -0
  77. package/src/config/types.ts +22 -22
  78. package/src/context/hook-pipeline.ts +4 -2
  79. package/src/context/index.ts +120 -39
  80. package/src/context/nested-operations.ts +35 -11
  81. package/src/context/write-pipeline.ts +52 -32
  82. package/src/hooks/index.ts +22 -15
  83. package/tests/context.test.ts +193 -5
  84. package/tests/hook-context-secured.test.ts +424 -0
  85. package/tests/nested-access-and-hooks.test.ts +324 -0
  86. package/tsconfig.tsbuildinfo +1 -1
@@ -1,7 +1,8 @@
1
- import { checkAccess, getRelatedListConfig } from './engine.js';
1
+ import { checkAccess, getRelatedListConfig, resolveSyntheticReverseRelation, listSyntheticReverseRelationNames, } from './engine.js';
2
2
  import { READ_INCLUDE_MAX_DEPTH } from './depth-limits.js';
3
- import { AccessScopeDepthExceededError, RelationFilterAccessDeniedError } from './errors.js';
4
- import { LOGICAL_OPERATORS, RELATION_QUANTIFIERS, resolveQueryField, walkWhereReadAccess, } from './query-validation.js';
3
+ import { AccessScopeDepthExceededError, RelationFilterAccessDeniedError, UndeclaredCountKeyError, UndeclaredIncludeKeyError, } from './errors.js';
4
+ import { LOGICAL_OPERATORS, RELATION_QUANTIFIERS, resolveQueryField, validateQueryFieldReadAccess, validateQueryKeys, walkWhereReadAccess, } from './query-validation.js';
5
+ import { isToManyRelationshipField, resolveCountAccessEntryForList } from './relationship-count.js';
5
6
  import { getDbKey } from '../lib/case-utils.js';
6
7
  /** A plain object — excludes `null` and arrays, which `typeof x === 'object'` alone would admit. */
7
8
  function isPlainObject(value) {
@@ -56,25 +57,212 @@ export function emptyToOneAccessFilterTree() {
56
57
  function isToOneAccessFilterTreeEmpty(tree) {
57
58
  return Object.keys(tree.filters).length === 0 && Object.keys(tree.nested).length === 0;
58
59
  }
59
- /** Whether a relationship field is to-one (at most one related row) rather than to-many. */
60
- function isToOneRelationship(fieldConfig) {
60
+ /**
61
+ * Whether a relationship field is to-one (at most one related row) rather
62
+ * than to-many. Exported so `field-visibility.ts` can pick the same `null`
63
+ * (to-one) vs `[]` (to-many) shape for a denied relation's forced value
64
+ * (issue #1103) that this module used to decide whether to record the
65
+ * denial in the first place — one source of truth for arity, not two.
66
+ */
67
+ export function isToOneRelationship(fieldConfig) {
61
68
  return !('many' in fieldConfig && fieldConfig.many === true);
62
69
  }
70
+ export function emptyCountAccessDenialTree() {
71
+ return { keys: new Set(), nested: {} };
72
+ }
73
+ function isCountAccessDenialTreeEmpty(tree) {
74
+ return tree.keys.size === 0 && Object.keys(tree.nested).length === 0;
75
+ }
76
+ /**
77
+ * Normalize a caller's `_count` include value to the `_count.select` map it
78
+ * names. `true` (Prisma's "count every relation" shorthand) expands to every
79
+ * countable relation Prisma itself carries on this model — every DECLARED
80
+ * to-many relationship, plus every synthetic back-relation a list-only `ref`
81
+ * elsewhere in the config synthesizes onto it (issue #1082): Prisma's own
82
+ * `_count: true` has always counted both, and dropping the synthetic ones
83
+ * here would silently stop counting a relation the caller used to get a
84
+ * (previously unscoped) count for. Returns `null` for a shape that requests
85
+ * nothing countable (`false`, or an object with no usable `select`).
86
+ */
87
+ function normalizeCountSelect(requestedValue, fieldConfigs, listKey, config) {
88
+ if (requestedValue === true) {
89
+ const expanded = {};
90
+ for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {
91
+ if (isToManyRelationshipField(fieldConfig))
92
+ expanded[fieldName] = true;
93
+ }
94
+ for (const syntheticName of listSyntheticReverseRelationNames(listKey, config)) {
95
+ expanded[syntheticName] = true;
96
+ }
97
+ return expanded;
98
+ }
99
+ if (isPlainObject(requestedValue) && isPlainObject(requestedValue.select)) {
100
+ return requestedValue.select;
101
+ }
102
+ return null;
103
+ }
104
+ /**
105
+ * Scope a caller-supplied `_count` include value by each named relation's own
106
+ * `query` access — the `_count` counterpart to the rest of this module's
107
+ * relation scoping (issue #1087, closing the one key `buildAccessScopedInclude`
108
+ * used to allowlist through unscoped, #1082's "Out of scope").
109
+ *
110
+ * For each key in the caller's `_count.select` (or, for bare `_count: true`,
111
+ * every declared to-many relation — see `normalizeCountSelect`):
112
+ * - Not a declared to-many relationship and not a synthetic back-relation
113
+ * (#1082 — always genuinely countable) → THROWN as
114
+ * `UndeclaredCountKeyError`, matching `buildAccessScopedInclude`'s own
115
+ * rejection for the ordinary walk. A declared to-many relationship whose
116
+ * `ref` cannot be resolved is skipped instead, matching that same walk's
117
+ * handling of a config-level dangling ref (not a caller error).
118
+ * - The counting list's OWN field-level `read` access on the relationship
119
+ * field being counted denies it, or the related list's `query` access
120
+ * denies it (`=== false`) → omitted from the select sent to Prisma and
121
+ * added to the returned `deniedKeys`, so `filterReadableFields` can inject
122
+ * `0` post-query (a count is session-relative; denial doesn't mean "no such
123
+ * relation"). The field-level check has nothing to evaluate for a synthetic
124
+ * back-relation (no field of its own on this list) and is skipped for it —
125
+ * `resolveCountAccessEntryForList` (issue #1111). Both checks run BEFORE
126
+ * any caller-supplied nested `where` is validated — validating first would
127
+ * let a caller who cannot read a single row of the related list learn its
128
+ * field names and field-level read rules from a thrown `ValidationError`
129
+ * alone, reopening the exact oracle #915/ADR-0031 closed for a top-level
130
+ * predicate.
131
+ * - Otherwise → the caller-supplied nested `where` at that key (if any) is
132
+ * key- and read-access-validated against the RELATED list via the same
133
+ * `validateQueryKeys`/`validateQueryFieldReadAccess` primitives
134
+ * `createFindMany` already runs on a top-level `where` (#912/#915), then
135
+ * run through `buildAccessScopedWhere` — the same fold `createFindMany`
136
+ * applies to a top-level `where` (#916) — so a relation filter nested
137
+ * inside IT (e.g. `_count.select.posts.where.comments.some`) is scoped by
138
+ * THAT further list's own `query` access too, not just the counted
139
+ * relation's. The result is AND-combined with the counted relation's own
140
+ * access filter (if any) — reusing `andWhere`, never replacing the
141
+ * caller's condition, mirroring `buildAccessScopedInclude` itself.
142
+ */
143
+ async function buildAccessScopedCountSelect(requestedValue, fieldConfigs, args, config, listKey) {
144
+ const requestedSelect = normalizeCountSelect(requestedValue, fieldConfigs, listKey, config);
145
+ const deniedKeys = new Set();
146
+ if (!requestedSelect)
147
+ return { select: undefined, deniedKeys };
148
+ const select = {};
149
+ for (const [key, entryValue] of Object.entries(requestedSelect)) {
150
+ // A caller can explicitly exclude a key from the `true`-expanded set the
151
+ // same way Prisma's own `select` excludes a field.
152
+ if (entryValue === false)
153
+ continue;
154
+ const fieldConfig = fieldConfigs[key];
155
+ const isDeclaredToMany = isToManyRelationshipField(fieldConfig);
156
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ListConfig must accept any TypeInfo
157
+ let relatedConfig = null;
158
+ if (isDeclaredToMany && fieldConfig && 'ref' in fieldConfig) {
159
+ relatedConfig = getRelatedListConfig(fieldConfig.ref, config);
160
+ }
161
+ if (!relatedConfig && !isDeclaredToMany) {
162
+ const synthetic = resolveSyntheticReverseRelation(key, listKey, config);
163
+ if (synthetic) {
164
+ relatedConfig = {
165
+ listName: synthetic.sourceListName,
166
+ listConfig: synthetic.sourceListConfig,
167
+ };
168
+ }
169
+ }
170
+ if (!relatedConfig) {
171
+ // A declared to-many field whose `ref` didn't resolve is a config
172
+ // issue, not a caller error — skip it exactly like the ordinary
173
+ // include walk does for the same case.
174
+ if (isDeclaredToMany)
175
+ continue;
176
+ throw new UndeclaredCountKeyError(listKey, key);
177
+ }
178
+ // `fieldConfig` is undefined for a synthetic back-relation (#1082) — it has
179
+ // no field of its own on THIS list, so there is no field-level `read`
180
+ // access to fold in; `resolveCountAccessEntryForList` treats a missing
181
+ // `fieldAccess` as exempt, matching the ordinary include path's own lack
182
+ // of a field-level gate for a synthetic key (issue #1111).
183
+ const accessEntry = await resolveCountAccessEntryForList(relatedConfig.listConfig, args, fieldConfig?.access);
184
+ // Denial is checked BEFORE the caller's nested `where` is validated —
185
+ // mirroring `buildAccessScopedWhere`'s own ordering below. A fully denied
186
+ // relation counts `0` no matter what `where` the caller supplied, so
187
+ // validating it first would let a caller who cannot read a single row of
188
+ // the related list learn its field names and field-level read rules from
189
+ // a `ValidationError`'s message alone — the exact oracle #915/ADR-0031
190
+ // closed for a top-level predicate, reopened here if this ran first.
191
+ if (accessEntry.kind === 'denied') {
192
+ deniedKeys.add(key);
193
+ continue;
194
+ }
195
+ const requestedWhere = isPlainObject(entryValue) && isPlainObject(entryValue.where)
196
+ ? entryValue.where
197
+ : undefined;
198
+ let scopedRequestedWhere;
199
+ if (requestedWhere) {
200
+ // Mirrors `buildAccessScopedInclude`'s own `resolveSyntheticRelation`
201
+ // closure (#1092/#916) — a synthetic back-relation (#1082) named inside
202
+ // this count entry's own `where` resolves against its source list
203
+ // rather than being rejected as undeclared, at every hop.
204
+ const resolveSyntheticRelation = (syntheticKey, fromListName) => {
205
+ const synthetic = resolveSyntheticReverseRelation(syntheticKey, fromListName, config);
206
+ return synthetic
207
+ ? { listConfig: synthetic.sourceListConfig, listName: synthetic.sourceListName }
208
+ : null;
209
+ };
210
+ validateQueryKeys({
211
+ where: requestedWhere,
212
+ listConfig: relatedConfig.listConfig,
213
+ listName: relatedConfig.listName,
214
+ config,
215
+ isSudo: false,
216
+ resolveSyntheticRelation,
217
+ });
218
+ await validateQueryFieldReadAccess({
219
+ where: requestedWhere,
220
+ listConfig: relatedConfig.listConfig,
221
+ listName: relatedConfig.listName,
222
+ session: args.session,
223
+ context: args.context,
224
+ isSudo: false,
225
+ });
226
+ // A relation filter (`some`/`every`/`none`/`is`/`isNot`) nested inside
227
+ // the caller's own `where` names a THIRD list one hop further out —
228
+ // e.g. `_count.select.posts.where.comments.some`. Validation above only
229
+ // checked keys against the counted relation's OWN fields; without this,
230
+ // that nested relation would reach Prisma unscoped by ITS list's
231
+ // `query` access, letting the resulting count reveal whether
232
+ // inaccessible rows over there exist. `buildAccessScopedWhere` is the
233
+ // same fold `createFindMany` runs on an ordinary top-level `where`
234
+ // (#916) — reused here rather than re-derived.
235
+ scopedRequestedWhere = (await buildAccessScopedWhere(requestedWhere, relatedConfig.listConfig, relatedConfig.listName, config, args, resolveSyntheticRelation));
236
+ }
237
+ const scopedWhere = andWhere(accessEntry.kind === 'scoped' ? accessEntry.where : undefined, scopedRequestedWhere);
238
+ select[key] = scopedWhere ? { where: scopedWhere } : true;
239
+ }
240
+ return { select: Object.keys(select).length > 0 ? select : undefined, deniedKeys };
241
+ }
63
242
  /**
64
243
  * Build the access-scoped `include` for exactly the relations a read
65
244
  * requested, recursing only into branches `requestedInclude` itself names.
66
245
  *
67
246
  * For each key in `requestedInclude`:
68
- * - Not a config-declared relationship access control does not govern it;
69
- * passed through unchanged (e.g. a fragment/caller key that isn't a
70
- * relationship at all).
247
+ * - A declared field that isn't a relationship (scalar, virtual, …) → access
248
+ * control does not govern it; passed through unchanged (a virtual key is
249
+ * stripped later by `stripVirtualFieldsFromInclude`, #628).
250
+ * - Not declared at all → resolved via `resolveSyntheticReverseRelation`
251
+ * (the synthetic-back-relation case above); `_count` is scoped by
252
+ * `buildAccessScopedCountSelect` (issue #1087 — each named relation's own
253
+ * `query` access, exactly like any other relation this walk scopes; a
254
+ * denied one is recorded for `filterReadableFields` to inject `0` for,
255
+ * post-query, since Prisma cannot be asked for a guaranteed `0`); anything
256
+ * else throws `UndeclaredIncludeKeyError` rather than reaching the
257
+ * database unscoped.
71
258
  * - A declared relationship whose related list's `query` access denies it
72
259
  * (`=== false`) → dropped entirely, no matter what the request asked for
73
260
  * nested beneath it (#566): the caller chooses *which* relations, access
74
- * control chooses *whether* and *with what filter*. For a to-one relation
75
- * this denial is also recorded in `toOneAccessFilters` (`kind: 'denied'`),
76
- * so `filterReadableFields` can still surface an explicit `null` for it
77
- * (issue #974) rather than an absent key.
261
+ * control chooses *whether* and *with what filter*. This denial is also
262
+ * recorded in `toOneAccessFilters` (`kind: 'denied'`), for either arity, so
263
+ * `filterReadableFields` can still surface an explicit `null` (to-one,
264
+ * issue #974) or `[]` (to-many, issue #1103) for it rather than an absent
265
+ * key.
78
266
  * - Otherwise, for a to-**many** relation → the access `where` is
79
267
  * AND-combined with any caller-supplied nested `where` (never replaced —
80
268
  * the other half of #566), and a caller-supplied `take` rides through
@@ -103,36 +291,119 @@ export async function buildAccessScopedInclude(requestedInclude, fieldConfigs, a
103
291
  }
104
292
  const result = {};
105
293
  const toOneAccessFilters = emptyToOneAccessFilterTree();
294
+ const countDenials = emptyCountAccessDenialTree();
106
295
  for (const [relationName, requestedValue] of Object.entries(requestedInclude)) {
296
+ // A caller can explicitly opt a relation OUT of a Prisma include with
297
+ // `false` (its `Include` type allows a bare `boolean`), or end up with an
298
+ // `undefined` value from a conditionally-built object
299
+ // (`{ posts: cond ? true : undefined }`) — Prisma treats both the same as
300
+ // the key being absent. Treat them identically here too, before this key
301
+ // ever reaches access evaluation: an explicitly-disabled relation was
302
+ // never actually requested, so it must not be evaluated, dropped as
303
+ // "denied", or recorded as needing a post-query fixup (issue #1103 code
304
+ // review) — any of those would surface a value (`[]`/`null`) for a key
305
+ // the caller deliberately excluded.
306
+ if (requestedValue === false || requestedValue === undefined)
307
+ continue;
107
308
  const fieldConfig = fieldConfigs[relationName];
108
309
  const isDeclaredRelationship = fieldConfig?.type === 'relationship' && 'ref' in fieldConfig && !!fieldConfig.ref;
109
- if (!isDeclaredRelationship) {
310
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ListConfig must accept any TypeInfo
311
+ let relatedConfig;
312
+ let isToOne;
313
+ if (isDeclaredRelationship) {
314
+ relatedConfig = getRelatedListConfig(fieldConfig.ref, config);
315
+ if (!relatedConfig)
316
+ continue;
317
+ isToOne = isToOneRelationship(fieldConfig);
318
+ }
319
+ else if (fieldConfig) {
320
+ // A declared field that is not a relationship — access control does
321
+ // not govern it here; passed through unchanged.
110
322
  result[relationName] = requestedValue;
111
323
  continue;
112
324
  }
113
- const relatedConfig = getRelatedListConfig(fieldConfig.ref, config);
114
- if (!relatedConfig)
325
+ else if (relationName === '_count') {
326
+ const { select, deniedKeys } = await buildAccessScopedCountSelect(requestedValue, fieldConfigs, args, config, listKey);
327
+ if (select)
328
+ result[relationName] = { select };
329
+ if (deniedKeys.size > 0)
330
+ countDenials.keys = deniedKeys;
115
331
  continue;
116
- const isToOne = isToOneRelationship(fieldConfig);
332
+ }
333
+ else {
334
+ const synthetic = resolveSyntheticReverseRelation(relationName, listKey, config);
335
+ if (!synthetic) {
336
+ throw new UndeclaredIncludeKeyError(listKey, relationName);
337
+ }
338
+ relatedConfig = { listName: synthetic.sourceListName, listConfig: synthetic.sourceListConfig };
339
+ // Always to-many — a list-only ref has one construction site and no
340
+ // arity branch, and one-to-one is structurally impossible for it.
341
+ isToOne = false;
342
+ }
117
343
  const queryAccess = relatedConfig.listConfig.access?.operation?.query;
118
344
  const accessResult = await checkAccess(queryAccess, {
119
345
  session: args.session,
120
346
  context: args.context,
121
347
  });
122
348
  if (accessResult === false) {
123
- if (isToOne) {
124
- toOneAccessFilters.filters[relationName] = { kind: 'denied' };
125
- }
349
+ // Recorded for either arity (issue #1103) — a to-many relation is
350
+ // dropped from `include` here exactly like a to-one one, and needs the
351
+ // same post-query fixup so its key comes back `[]`, not silently
352
+ // absent from the row.
353
+ toOneAccessFilters.filters[relationName] = { kind: 'denied' };
126
354
  continue;
127
355
  }
128
356
  const accessWhere = typeof accessResult === 'object' ? accessResult : undefined;
129
357
  const requestedEntry = asEntryObject(requestedValue);
358
+ // #1092 — a nested `where`/`orderBy` gets the same #912/#915 checks the
359
+ // top-level `where`/`orderBy` already gets, resolved against the RELATED
360
+ // list (`relatedConfig`) rather than the current one, and run only once
361
+ // the relation is known to be accessible at all (same ordering reason as
362
+ // the top-level checks: don't leak a field's name/read-gating status to a
363
+ // caller who has zero access to the relation to begin with).
364
+ const resolveSyntheticRelation = (key, fromListName) => {
365
+ const synthetic = resolveSyntheticReverseRelation(key, fromListName, config);
366
+ return synthetic
367
+ ? { listConfig: synthetic.sourceListConfig, listName: synthetic.sourceListName }
368
+ : null;
369
+ };
370
+ validateQueryKeys({
371
+ where: requestedEntry?.where,
372
+ orderBy: requestedEntry?.orderBy,
373
+ listConfig: relatedConfig.listConfig,
374
+ listName: relatedConfig.listName,
375
+ config,
376
+ isSudo: false,
377
+ resolveSyntheticRelation,
378
+ });
379
+ await validateQueryFieldReadAccess({
380
+ where: requestedEntry?.where,
381
+ orderBy: requestedEntry?.orderBy,
382
+ listConfig: relatedConfig.listConfig,
383
+ listName: relatedConfig.listName,
384
+ session: args.session,
385
+ context: args.context,
386
+ isSudo: false,
387
+ });
388
+ // The two checks above only reach the entry's own top-level keys — a
389
+ // relation quantifier (`some`/`every`/`none`/`is`/`isNot`) nested inside
390
+ // this `where` names a DEEPER related list, which needs the same
391
+ // treatment the top-level `where` already gets from `buildAccessScopedWhere`
392
+ // (#916): scope it by that deeper list's own `query` access and check ITS
393
+ // fields' read access, recursing through every further hop. Only for
394
+ // to-many — a to-one entry never carries `requestedEntry.where` through to
395
+ // Prisma at all (see below), so there is nothing here to scope.
396
+ const scopedRequestedWhere = !isToOne && requestedEntry?.where !== undefined
397
+ ? (await buildAccessScopedWhere(requestedEntry.where, relatedConfig.listConfig, relatedConfig.listName, config, args, resolveSyntheticRelation))
398
+ : requestedEntry?.where;
130
399
  let nestedInclude;
131
400
  let nestedToOneFilters;
401
+ let nestedCountDenials;
132
402
  if (requestedEntry?.include) {
133
403
  const nested = await buildAccessScopedInclude(requestedEntry.include, relatedConfig.listConfig.fields, args, config, relatedConfig.listName, depth + 1);
134
404
  nestedInclude = nested.include;
135
405
  nestedToOneFilters = nested.toOneAccessFilters;
406
+ nestedCountDenials = nested.countDenials;
136
407
  }
137
408
  const entry = {};
138
409
  if (isToOne) {
@@ -145,7 +416,7 @@ export async function buildAccessScopedInclude(requestedInclude, fieldConfigs, a
145
416
  }
146
417
  }
147
418
  else {
148
- const mergedWhere = andWhere(accessWhere, requestedEntry?.where);
419
+ const mergedWhere = andWhere(accessWhere, scopedRequestedWhere);
149
420
  if (mergedWhere)
150
421
  entry.where = mergedWhere;
151
422
  if (requestedEntry?.take !== undefined)
@@ -160,9 +431,12 @@ export async function buildAccessScopedInclude(requestedInclude, fieldConfigs, a
160
431
  if (nestedToOneFilters && !isToOneAccessFilterTreeEmpty(nestedToOneFilters)) {
161
432
  toOneAccessFilters.nested[relationName] = nestedToOneFilters;
162
433
  }
434
+ if (nestedCountDenials && !isCountAccessDenialTreeEmpty(nestedCountDenials)) {
435
+ countDenials.nested[relationName] = nestedCountDenials;
436
+ }
163
437
  result[relationName] = Object.keys(entry).length > 0 ? entry : true;
164
438
  }
165
- return { include: result, toOneAccessFilters };
439
+ return { include: result, toOneAccessFilters, countDenials };
166
440
  }
167
441
  export function emptyToOneAccessVisibilityTree() {
168
442
  return { filters: {}, nested: {} };
@@ -274,32 +548,55 @@ export async function resolveToOneAccessVisibility(items, tree, args) {
274
548
  * caller can observe that an inaccessible related row exists (an `every`
275
549
  * that "should" pass instead fails), but never that row's field values,
276
550
  * which is the property this ticket exists to close.
551
+ *
552
+ * A quantifier's value of literal `null` (`is: null`/`isNot: null`, a to-one
553
+ * relation's existence check) is passed through untouched rather than folded:
554
+ * it names no fields to read-check or scope, and AND-folding an access filter
555
+ * into it would silently invert the caller's own predicate (see the inline
556
+ * comment at that branch).
557
+ *
558
+ * `resolveSyntheticRelation` (#1092/#1108) extends this to a key that
559
+ * resolves to a synthetic back-relation (#1082) rather than a declared
560
+ * field, recursing against its SOURCE list. Only `buildAccessScopedInclude`
561
+ * passes it, for the include-nested `where` position; the top-level `where`
562
+ * this function was originally built for (`context/index.ts`) omits it, so
563
+ * a synthetic key there is unaffected — matching #1092's own scope, which
564
+ * deliberately left the top-level checks unchanged.
277
565
  */
278
566
  export async function buildAccessScopedWhere(where,
279
567
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ListConfig must accept any TypeInfo
280
- listConfig, listName, config, args) {
568
+ listConfig, listName, config, args,
569
+ // #1092/#1108 — the include-nested position's own addition, exactly
570
+ // mirroring `validateQueryKeys`'s `resolveSyntheticRelation` (see that
571
+ // module's doc comment): every top-level `where` caller omits this, so
572
+ // top-level behavior is unchanged.
573
+ resolveSyntheticRelation) {
281
574
  if (where === null || typeof where !== 'object')
282
575
  return where;
283
576
  if (Array.isArray(where)) {
284
- return Promise.all(where.map((entry) => buildAccessScopedWhere(entry, listConfig, listName, config, args)));
577
+ return Promise.all(where.map((entry) => buildAccessScopedWhere(entry, listConfig, listName, config, args, resolveSyntheticRelation)));
285
578
  }
286
579
  const result = {};
287
580
  for (const [key, value] of Object.entries(where)) {
288
581
  if (LOGICAL_OPERATORS.has(key)) {
289
- result[key] = await buildAccessScopedWhere(value, listConfig, listName, config, args);
582
+ result[key] = await buildAccessScopedWhere(value, listConfig, listName, config, args, resolveSyntheticRelation);
290
583
  continue;
291
584
  }
292
585
  const resolved = resolveQueryField(key, listConfig.fields);
293
- if (!resolved ||
294
- !resolved.isRelationship ||
295
- value === null ||
296
- typeof value !== 'object' ||
297
- Array.isArray(value)) {
298
- result[key] = value;
299
- continue;
300
- }
301
- const related = getRelatedListConfig(resolved.fieldConfig.ref, config);
302
- if (!related) {
586
+ // A synthetic back-relation (#1082) carries no `ref` of its own to
587
+ // follow — its "related" list for recursion is the SOURCE list it
588
+ // stands for, given directly by the resolver, not `getRelatedListConfig`.
589
+ const related = resolved?.isRelationship
590
+ ? getRelatedListConfig(resolved.fieldConfig.ref, config)
591
+ : !resolved
592
+ ? (() => {
593
+ const synthetic = resolveSyntheticRelation?.(key, listName);
594
+ return synthetic
595
+ ? { listConfig: synthetic.listConfig, listName: synthetic.listName }
596
+ : null;
597
+ })()
598
+ : null;
599
+ if (!related || value === null || typeof value !== 'object' || Array.isArray(value)) {
303
600
  result[key] = value;
304
601
  continue;
305
602
  }
@@ -321,8 +618,18 @@ listConfig, listName, config, args) {
321
618
  nestedEntry[quantifier] = quantifierValue;
322
619
  continue;
323
620
  }
621
+ if (quantifierValue === null) {
622
+ // `is: null` / `isNot: null` tests EXISTENCE of a to-one relation,
623
+ // not its fields — there is nothing to read-check or scope, and
624
+ // AND-folding the access filter in here would silently invert the
625
+ // caller's predicate: `is: null` ("has no related row") would
626
+ // become `is: <accessWhere>` ("has a related row matching the
627
+ // filter"), the opposite of what was asked. Passed through as-is.
628
+ nestedEntry[quantifier] = null;
629
+ continue;
630
+ }
324
631
  await walkWhereReadAccess(quantifierValue, related.listConfig, related.listName, args);
325
- const scopedNested = await buildAccessScopedWhere(quantifierValue, related.listConfig, related.listName, config, args);
632
+ const scopedNested = await buildAccessScopedWhere(quantifierValue, related.listConfig, related.listName, config, args, resolveSyntheticRelation);
326
633
  nestedEntry[quantifier] = accessWhere
327
634
  ? andWhere(accessWhere, scopedNested)
328
635
  : scopedNested;
@@ -336,7 +643,7 @@ listConfig, listName, config, args) {
336
643
  // (fully-allowed related list) is returned exactly as the caller wrote
337
644
  // it, so an already-permitted query is not perturbed by this pass.
338
645
  await walkWhereReadAccess(value, related.listConfig, related.listName, args);
339
- const scopedNested = await buildAccessScopedWhere(value, related.listConfig, related.listName, config, args);
646
+ const scopedNested = await buildAccessScopedWhere(value, related.listConfig, related.listName, config, args, resolveSyntheticRelation);
340
647
  result[key] = accessWhere
341
648
  ? { is: andWhere(accessWhere, scopedNested) }
342
649
  : scopedNested;
@@ -1 +1 @@
1
- {"version":3,"file":"access-filter.js","sourceRoot":"","sources":["../../src/access/access-filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"access-filter.js","sourceRoot":"","sources":["../../src/access/access-filter.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,4BAA4B,EAC5B,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAA;AACnG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAgH/C,oGAAoG;AACpG,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IACrD,MAAM,KAAK,GAAuB,EAAE,CAAA;IACpC,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;IAC7C,IAAI,aAAa,CAAC,OAAO,CAAC;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;IACnD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;IAC/C,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,OAAO,GAAG,OAAwC,CAAA;IAC1D,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;IAC/C,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CACf,WAAqC,EACrC,WAAqC;IAErC,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAA;IAC5C,CAAC;IACD,OAAO,WAAW,IAAI,WAAW,CAAA;AACnC,CAAC;AAkCD,MAAM,UAAU,0BAA0B;IACxC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED,SAAS,4BAA4B,CAAC,IAA2B;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;AACxF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAwB;IAC1D,OAAO,CAAC,CAAC,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAC9D,CAAC;AAoBD,MAAM,UAAU,0BAA0B;IACxC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,4BAA4B,CAAC,IAA2B;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;AACtE,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAC3B,cAAuB,EACvB,YAAyC,EACzC,OAAe,EACf,MAAsB;IAEtB,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAA4B,EAAE,CAAA;QAC5C,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACpE,IAAI,yBAAyB,CAAC,WAAW,CAAC;gBAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;QACxE,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,iCAAiC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/E,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,CAAA;QAChC,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,aAAa,CAAC,cAAc,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,OAAO,cAAc,CAAC,MAAM,CAAA;IAC9B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,KAAK,UAAU,4BAA4B,CACzC,cAAuB,EACvB,YAAyC,EACzC,IAAyD,EACzD,MAAsB,EACtB,OAAe;IAEf,MAAM,eAAe,GAAG,oBAAoB,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3F,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;IAE9D,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAChE,yEAAyE;QACzE,mDAAmD;QACnD,IAAI,UAAU,KAAK,KAAK;YAAE,SAAQ;QAElC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAA;QAE/D,qGAAqG;QACrG,IAAI,aAAa,GAA6D,IAAI,CAAA;QAClF,IAAI,gBAAgB,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;YAC5D,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,GAAa,EAAE,MAAM,CAAC,CAAA;QACzE,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,+BAA+B,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YACvE,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,GAAG;oBACd,QAAQ,EAAE,SAAS,CAAC,cAAc;oBAClC,UAAU,EAAE,SAAS,CAAC,gBAAgB;iBACvC,CAAA;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,kEAAkE;YAClE,gEAAgE;YAChE,uCAAuC;YACvC,IAAI,gBAAgB;gBAAE,SAAQ;YAC9B,MAAM,IAAI,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;QAED,4EAA4E;QAC5E,sEAAsE;QACtE,uEAAuE;QACvE,yEAAyE;QACzE,2DAA2D;QAC3D,MAAM,WAAW,GAAG,MAAM,8BAA8B,CACtD,aAAa,CAAC,UAAU,EACxB,IAAI,EACJ,WAAW,EAAE,MAAM,CACpB,CAAA;QAED,sEAAsE;QACtE,0EAA0E;QAC1E,qEAAqE;QACrE,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,qEAAqE;QACrE,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QAED,MAAM,cAAc,GAClB,aAAa,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;YAC1D,CAAC,CAAE,UAAU,CAAC,KAAiC;YAC/C,CAAC,CAAC,SAAS,CAAA;QAEf,IAAI,oBAAyD,CAAA;QAC7D,IAAI,cAAc,EAAE,CAAC;YACnB,sEAAsE;YACtE,wEAAwE;YACxE,kEAAkE;YAClE,0DAA0D;YAC1D,MAAM,wBAAwB,GAAG,CAC/B,YAAoB,EACpB,YAAoB,EACY,EAAE;gBAClC,MAAM,SAAS,GAAG,+BAA+B,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;gBACrF,OAAO,SAAS;oBACd,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,cAAc,EAAE;oBAChF,CAAC,CAAC,IAAI,CAAA;YACV,CAAC,CAAA;YACD,iBAAiB,CAAC;gBAChB,KAAK,EAAE,cAAc;gBACrB,UAAU,EAAE,aAAa,CAAC,UAAU;gBACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;gBAChC,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,wBAAwB;aACzB,CAAC,CAAA;YACF,MAAM,4BAA4B,CAAC;gBACjC,KAAK,EAAE,cAAc;gBACrB,UAAU,EAAE,aAAa,CAAC,UAAU;gBACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,KAAK;aACd,CAAC,CAAA;YACF,uEAAuE;YACvE,oEAAoE;YACpE,wEAAwE;YACxE,wEAAwE;YACxE,iEAAiE;YACjE,6DAA6D;YAC7D,sEAAsE;YACtE,mEAAmE;YACnE,+CAA+C;YAC/C,oBAAoB,GAAG,CAAC,MAAM,sBAAsB,CAClD,cAAc,EACd,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,QAAQ,EACtB,MAAM,EACN,IAAI,EACJ,wBAAwB,CACzB,CAAwC,CAAA;QAC3C,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAC1B,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC7D,oBAAoB,CACrB,CAAA;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAC3D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,CAAA;AACpF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,gBAAyC,EACzC,YAAyC,EACzC,IAGC,EACD,MAAsB,EACtB,OAAe,EACf,KAAK,GAAW,CAAC;IAMjB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACnD,IAAI,KAAK,IAAI,sBAAsB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,6BAA6B,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAC3E,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,MAAM,kBAAkB,GAAG,0BAA0B,EAAE,CAAA;IACvD,MAAM,YAAY,GAAG,0BAA0B,EAAE,CAAA;IAEjD,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9E,sEAAsE;QACtE,0EAA0E;QAC1E,sDAAsD;QACtD,0EAA0E;QAC1E,yEAAyE;QACzE,sEAAsE;QACtE,oEAAoE;QACpE,wEAAwE;QACxE,uEAAuE;QACvE,oCAAoC;QACpC,IAAI,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,SAAS;YAAE,SAAQ;QAEtE,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;QAC9C,MAAM,sBAAsB,GAC1B,WAAW,EAAE,IAAI,KAAK,cAAc,IAAI,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAA;QAEnF,qGAAqG;QACrG,IAAI,aAAuE,CAAA;QAC3E,IAAI,OAAgB,CAAA;QAEpB,IAAI,sBAAsB,EAAE,CAAC;YAC3B,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,GAAa,EAAE,MAAM,CAAC,CAAA;YACvE,IAAI,CAAC,aAAa;gBAAE,SAAQ;YAC5B,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAA;QAC5C,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACvB,oEAAoE;YACpE,gDAAgD;YAChD,MAAM,CAAC,YAAY,CAAC,GAAG,cAAc,CAAA;YACrC,SAAQ;QACV,CAAC;aAAM,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,4BAA4B,CAC/D,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,MAAM,EACN,OAAO,CACR,CAAA;YACD,IAAI,MAAM;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,CAAA;YAC7C,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC;gBAAE,YAAY,CAAC,IAAI,GAAG,UAAU,CAAA;YACvD,SAAQ;QACV,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,+BAA+B,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YAChF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,yBAAyB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;YAC5D,CAAC;YACD,aAAa,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAA;YAC9F,oEAAoE;YACpE,kEAAkE;YAClE,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAA;QACrE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE;YAClD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAA;QAEF,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;YAC3B,kEAAkE;YAClE,uEAAuE;YACvE,iEAAiE;YACjE,uBAAuB;YACvB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;YAC7D,SAAQ;QACV,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/E,MAAM,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;QAEpD,wEAAwE;QACxE,yEAAyE;QACzE,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,6DAA6D;QAC7D,MAAM,wBAAwB,GAAG,CAC/B,GAAW,EACX,YAAoB,EACY,EAAE;YAClC,MAAM,SAAS,GAAG,+BAA+B,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;YAC5E,OAAO,SAAS;gBACd,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,cAAc,EAAE;gBAChF,CAAC,CAAC,IAAI,CAAA;QACV,CAAC,CAAA;QACD,iBAAiB,CAAC;YAChB,KAAK,EAAE,cAAc,EAAE,KAAK;YAC5B,OAAO,EAAE,cAAc,EAAE,OAAO;YAChC,UAAU,EAAE,aAAa,CAAC,UAAU;YACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,MAAM;YACN,MAAM,EAAE,KAAK;YACb,wBAAwB;SACzB,CAAC,CAAA;QACF,MAAM,4BAA4B,CAAC;YACjC,KAAK,EAAE,cAAc,EAAE,KAAK;YAC5B,OAAO,EAAE,cAAc,EAAE,OAAO;YAChC,UAAU,EAAE,aAAa,CAAC,UAAU;YACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;QAEF,qEAAqE;QACrE,yEAAyE;QACzE,iEAAiE;QACjE,6EAA6E;QAC7E,0EAA0E;QAC1E,qEAAqE;QACrE,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,oBAAoB,GACxB,CAAC,OAAO,IAAI,cAAc,EAAE,KAAK,KAAK,SAAS;YAC7C,CAAC,CAAE,CAAC,MAAM,sBAAsB,CAC5B,cAAc,CAAC,KAAK,EACpB,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,QAAQ,EACtB,MAAM,EACN,IAAI,EACJ,wBAAwB,CACzB,CAAkB;YACrB,CAAC,CAAC,cAAc,EAAE,KAAK,CAAA;QAE3B,IAAI,aAAkD,CAAA;QACtD,IAAI,kBAAqD,CAAA;QACzD,IAAI,kBAAqD,CAAA;QACzD,IAAI,cAAc,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAC3C,cAAc,CAAC,OAAO,EACtB,aAAa,CAAC,UAAU,CAAC,MAAM,EAC/B,IAAI,EACJ,MAAM,EACN,aAAa,CAAC,QAAQ,EACtB,KAAK,GAAG,CAAC,CACV,CAAA;YACD,aAAa,GAAG,MAAM,CAAC,OAAO,CAAA;YAC9B,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAA;YAC9C,kBAAkB,GAAG,MAAM,CAAC,YAAY,CAAA;QAC1C,CAAC;QAED,MAAM,KAAK,GAAuB,EAAE,CAAA;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,WAAW,EAAE,CAAC;gBAChB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG;oBACzC,IAAI,EAAE,QAAQ;oBACd,eAAe,EAAE,aAAa,CAAC,QAAQ;oBACvC,WAAW;iBACZ,CAAA;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;YAC/D,IAAI,WAAW;gBAAE,KAAK,CAAC,KAAK,GAAG,WAAW,CAAA;YAC1C,IAAI,cAAc,EAAE,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC,IAAI,CAAA;YACxE,IAAI,cAAc,EAAE,OAAO,KAAK,SAAS;gBAAE,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAA;YACjF,IAAI,cAAc,EAAE,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC,IAAI,CAAA;QAC1E,CAAC;QACD,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,OAAO,GAAG,aAAa,CAAA;QACzF,IAAI,kBAAkB,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5E,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAAA;QAC9D,CAAC;QACD,IAAI,kBAAkB,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5E,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAAA;QACxD,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACrE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAA;AAC9D,CAAC;AAiBD,MAAM,UAAU,8BAA8B;IAC5C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAyB,EACzB,IAA2B,EAC3B,IAGC;IAED,MAAM,QAAQ,GAAG,8BAA8B,EAAE,CAAA;IAEjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;YAC1C,SAAQ;QACV,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,SAAQ;YAC/C,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAA;YACpD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gBACxD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,KAAiC,CAAC,EAAE,CAAC,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,CAAA;YAC3D,SAAQ;QACV,CAAC;QAED,4IAA4I;QAC5I,MAAM,KAAK,GAAI,IAAI,CAAC,OAAO,CAAC,MAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;QAC3E,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;YACvC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YAC7D,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAA;QACF,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAC5F,CAAA;QACD,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAA;IAC9D,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAc,EAAE,CAAA;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,SAAQ;YAC/C,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAA;YACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;iBAC/C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,4BAA4B,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IAC1F,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAc;AACd,qGAAqG;AACrG,UAA2B,EAC3B,QAAgB,EAChB,MAAsB,EACtB,IAGC;AACD,oEAAoE;AACpE,uEAAuE;AACvE,uEAAuE;AACvE,mCAAmC;AACnC,wBAAmD;IAEnD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAE7D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAClB,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAC5F,CACF,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,sBAAsB,CACxC,KAAK,EACL,UAAU,EACV,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,wBAAwB,CACzB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;QAC1D,mEAAmE;QACnE,kEAAkE;QAClE,0EAA0E;QAC1E,MAAM,OAAO,GAAG,QAAQ,EAAE,cAAc;YACtC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;YACxD,CAAC,CAAC,CAAC,QAAQ;gBACT,CAAC,CAAC,CAAC,GAAG,EAAE;oBACJ,MAAM,SAAS,GAAG,wBAAwB,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;oBAC3D,OAAO,SAAS;wBACd,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE;wBACpE,CAAC,CAAC,IAAI,CAAA;gBACV,CAAC,CAAC,EAAE;gBACN,CAAC,CAAC,IAAI,CAAA;QAEV,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YACnB,SAAQ;QACV,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAA;QAC/D,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE;YAClD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAA;QAEF,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,+BAA+B,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC5E,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/E,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAA;QACxE,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAEhF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,WAAW,GAA4B,EAAE,CAAA;YAC/C,KAAK,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,IAAI,eAAe,EAAE,CAAC;gBAC5D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC1C,WAAW,CAAC,UAAU,CAAC,GAAG,eAAe,CAAA;oBACzC,SAAQ;gBACV,CAAC;gBACD,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;oBAC7B,mEAAmE;oBACnE,gEAAgE;oBAChE,kEAAkE;oBAClE,8DAA8D;oBAC9D,8DAA8D;oBAC9D,kEAAkE;oBAClE,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;oBAC9B,SAAQ;gBACV,CAAC;gBACD,MAAM,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACtF,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAC/C,eAAe,EACf,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,QAAQ,EAChB,MAAM,EACN,IAAI,EACJ,wBAAwB,CACzB,CAAA;gBACD,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW;oBACnC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAwC,CAAC;oBACjE,CAAC,CAAC,YAAY,CAAA;YAClB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAA;QAC3B,CAAC;aAAM,CAAC;YACN,qEAAqE;YACrE,yEAAyE;YACzE,sEAAsE;YACtE,uEAAuE;YACvE,mEAAmE;YACnE,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAC5E,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAC/C,KAAK,EACL,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,QAAQ,EAChB,MAAM,EACN,IAAI,EACJ,wBAAwB,CACzB,CAAA;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW;gBACvB,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAwC,CAAC,EAAE;gBACzE,CAAC,CAAC,YAAY,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAC3C,OAA4C,EAC5C,YAAyC,EACzC,MAAsB;IAEtB,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAA;IAE5B,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QAErC,IAAI,WAAW,EAAE,OAAO;YAAE,SAAQ;QAElC,MAAM,sBAAsB,GAC1B,WAAW,EAAE,IAAI,KAAK,cAAc,IAAI,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAA;QACnF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QAElC,IAAI,sBAAsB,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,GAAa,EAAE,MAAM,CAAC,CAAA;YAC7E,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,aAAa,GAAG,6BAA6B,CACjD,KAAK,CAAC,OAAO,EACb,aAAa,CAAC,UAAU,CAAC,MAAM,EAC/B,MAAM,CACP,CAAA;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAI,KAAiC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;gBAC/E,SAAQ;YACV,CAAC;QACH,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACrB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}