@lovrozagar/oat 0.1.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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +401 -0
  3. package/bin/oat.js +2 -0
  4. package/dist/cli.js +386 -0
  5. package/dist/config/define-config.d.ts +165 -0
  6. package/dist/config/define-config.d.ts.map +1 -0
  7. package/dist/config/define-config.js +24 -0
  8. package/dist/config/define-config.js.map +1 -0
  9. package/dist/config/load.d.ts +10 -0
  10. package/dist/config/load.d.ts.map +1 -0
  11. package/dist/config/load.js +61 -0
  12. package/dist/config/load.js.map +1 -0
  13. package/dist/index.d.ts +17 -0
  14. package/dist/index.js +9 -0
  15. package/dist/reference/defects.d.ts +254 -0
  16. package/dist/reference/defects.d.ts.map +1 -0
  17. package/dist/reference/defects.js +265 -0
  18. package/dist/reference/defects.js.map +1 -0
  19. package/dist/reference/dialect.d.ts +104 -0
  20. package/dist/reference/dialect.d.ts.map +1 -0
  21. package/dist/reference/dialect.js +174 -0
  22. package/dist/reference/dialect.js.map +1 -0
  23. package/dist/reference/http.d.ts +79 -0
  24. package/dist/reference/http.d.ts.map +1 -0
  25. package/dist/reference/http.js +889 -0
  26. package/dist/reference/http.js.map +1 -0
  27. package/dist/reference/model.d.ts +56 -0
  28. package/dist/reference/model.d.ts.map +1 -0
  29. package/dist/reference/model.js +156 -0
  30. package/dist/reference/model.js.map +1 -0
  31. package/dist/reference/query.d.ts +45 -0
  32. package/dist/reference/query.d.ts.map +1 -0
  33. package/dist/reference/query.js +353 -0
  34. package/dist/reference/query.js.map +1 -0
  35. package/dist/reference/spec.d.ts +13 -0
  36. package/dist/reference/spec.d.ts.map +1 -0
  37. package/dist/reference/spec.js +547 -0
  38. package/dist/reference/spec.js.map +1 -0
  39. package/dist/reference/store-api.d.ts +59 -0
  40. package/dist/reference/store-api.d.ts.map +1 -0
  41. package/dist/reference/store-api.js +76 -0
  42. package/dist/reference/store-api.js.map +1 -0
  43. package/dist/reference/stores/memory.d.ts +27 -0
  44. package/dist/reference/stores/memory.d.ts.map +1 -0
  45. package/dist/reference/stores/memory.js +97 -0
  46. package/dist/reference/stores/memory.js.map +1 -0
  47. package/dist/reference/stores/postgres.d.ts +61 -0
  48. package/dist/reference/stores/postgres.d.ts.map +1 -0
  49. package/dist/reference/stores/postgres.js +406 -0
  50. package/dist/reference/stores/postgres.js.map +1 -0
  51. package/dist/reference/stores/sqlite-driver.d.ts +54 -0
  52. package/dist/reference/stores/sqlite-driver.d.ts.map +1 -0
  53. package/dist/reference/stores/sqlite-driver.js +99 -0
  54. package/dist/reference/stores/sqlite-driver.js.map +1 -0
  55. package/dist/reference/stores/sqlite.d.ts +68 -0
  56. package/dist/reference/stores/sqlite.d.ts.map +1 -0
  57. package/dist/reference/stores/sqlite.js +464 -0
  58. package/dist/reference/stores/sqlite.js.map +1 -0
  59. package/dist/report/console.d.ts +33 -0
  60. package/dist/report/console.d.ts.map +1 -0
  61. package/dist/report/console.js +237 -0
  62. package/dist/report/console.js.map +1 -0
  63. package/dist/report/matrix.d.ts +131 -0
  64. package/dist/report/matrix.d.ts.map +1 -0
  65. package/dist/report/matrix.js +865 -0
  66. package/dist/report/matrix.js.map +1 -0
  67. package/dist/report/render.d.ts +66 -0
  68. package/dist/report/render.d.ts.map +1 -0
  69. package/dist/report/render.js +423 -0
  70. package/dist/report/render.js.map +1 -0
  71. package/dist/runtime/async.d.ts +34 -0
  72. package/dist/runtime/async.d.ts.map +1 -0
  73. package/dist/runtime/async.js +130 -0
  74. package/dist/runtime/async.js.map +1 -0
  75. package/dist/runtime/auth.d.ts +46 -0
  76. package/dist/runtime/auth.d.ts.map +1 -0
  77. package/dist/runtime/auth.js +236 -0
  78. package/dist/runtime/auth.js.map +1 -0
  79. package/dist/runtime/checks.d.ts +89 -0
  80. package/dist/runtime/checks.d.ts.map +1 -0
  81. package/dist/runtime/checks.js +3400 -0
  82. package/dist/runtime/checks.js.map +1 -0
  83. package/dist/runtime/client.d.ts +65 -0
  84. package/dist/runtime/client.d.ts.map +1 -0
  85. package/dist/runtime/client.js +122 -0
  86. package/dist/runtime/client.js.map +1 -0
  87. package/dist/runtime/finding.d.ts +50 -0
  88. package/dist/runtime/finding.d.ts.map +1 -0
  89. package/dist/runtime/finding.js +50 -0
  90. package/dist/runtime/finding.js.map +1 -0
  91. package/dist/runtime/fixture.d.ts +20 -0
  92. package/dist/runtime/fixture.d.ts.map +1 -0
  93. package/dist/runtime/fixture.js +175 -0
  94. package/dist/runtime/fixture.js.map +1 -0
  95. package/dist/runtime/progress.d.ts +41 -0
  96. package/dist/runtime/progress.d.ts.map +1 -0
  97. package/dist/runtime/progress.js +186 -0
  98. package/dist/runtime/progress.js.map +1 -0
  99. package/dist/runtime/run.d.ts +69 -0
  100. package/dist/runtime/run.d.ts.map +1 -0
  101. package/dist/runtime/run.js +575 -0
  102. package/dist/runtime/run.js.map +1 -0
  103. package/dist/runtime/teardown.d.ts +38 -0
  104. package/dist/runtime/teardown.d.ts.map +1 -0
  105. package/dist/runtime/teardown.js +129 -0
  106. package/dist/runtime/teardown.js.map +1 -0
  107. package/dist/runtime/validate.d.ts +31 -0
  108. package/dist/runtime/validate.d.ts.map +1 -0
  109. package/dist/runtime/validate.js +111 -0
  110. package/dist/runtime/validate.js.map +1 -0
  111. package/dist/runtime/world.d.ts +49 -0
  112. package/dist/runtime/world.d.ts.map +1 -0
  113. package/dist/runtime/world.js +119 -0
  114. package/dist/runtime/world.js.map +1 -0
  115. package/dist/spec/collection.d.ts +31 -0
  116. package/dist/spec/collection.d.ts.map +1 -0
  117. package/dist/spec/collection.js +121 -0
  118. package/dist/spec/collection.js.map +1 -0
  119. package/dist/spec/conventions.d.ts +103 -0
  120. package/dist/spec/conventions.d.ts.map +1 -0
  121. package/dist/spec/conventions.js +275 -0
  122. package/dist/spec/conventions.js.map +1 -0
  123. package/dist/spec/extensions.d.ts +74 -0
  124. package/dist/spec/extensions.d.ts.map +1 -0
  125. package/dist/spec/extensions.js +335 -0
  126. package/dist/spec/extensions.js.map +1 -0
  127. package/dist/spec/graph.d.ts +89 -0
  128. package/dist/spec/graph.d.ts.map +1 -0
  129. package/dist/spec/graph.js +318 -0
  130. package/dist/spec/graph.js.map +1 -0
  131. package/dist/spec/load.d.ts +36 -0
  132. package/dist/spec/load.d.ts.map +1 -0
  133. package/dist/spec/load.js +166 -0
  134. package/dist/spec/load.js.map +1 -0
  135. package/dist/spec/types.d.ts +57 -0
  136. package/dist/spec/types.d.ts.map +1 -0
  137. package/dist/spec/types.js +24 -0
  138. package/dist/spec/types.js.map +1 -0
  139. package/labs/README.md +130 -0
  140. package/labs/annotated-openapi.yaml +311 -0
  141. package/labs/anyrow.config.ts +107 -0
  142. package/labs/demo.mjs +124 -0
  143. package/labs/local.config.ts +41 -0
  144. package/labs/minimal.config.ts +32 -0
  145. package/package.json +80 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * PostgREST-shaped query engine for the reference backend.
3
+ *
4
+ * Deliberately simple and readable — its job is to be *obviously* correct so that any finding
5
+ * oat reports against the clean baseline is oat's fault, not the reference's. Defects are
6
+ * applied as explicit, local deviations rather than woven into the logic.
7
+ */
8
+ import { SqlError } from "./store-api.js";
9
+ /* One error type across every store, so the HTTP layer has a single thing to catch. Two
10
+ * separate classes meant a rejected filter surfaced as 400 on the SQL stores and 500 here — the
11
+ * conformance suite reported it as a defect, correctly. */
12
+ export { SqlError as QueryError } from "./store-api.js";
13
+ const COMPARATORS = new Set([
14
+ "eq",
15
+ "neq",
16
+ "gt",
17
+ "gte",
18
+ "lt",
19
+ "lte",
20
+ "in",
21
+ "nin",
22
+ "like",
23
+ "ilike",
24
+ "is",
25
+ "contains",
26
+ ]);
27
+ /** Splits on commas that sit at paren depth zero. */
28
+ function splitTopLevel(input) {
29
+ const parts = [];
30
+ let depth = 0;
31
+ let start = 0;
32
+ for (let i = 0; i < input.length; i++) {
33
+ const ch = input[i];
34
+ if (ch === "(")
35
+ depth++;
36
+ else if (ch === ")")
37
+ depth--;
38
+ else if (ch === "," && depth === 0) {
39
+ parts.push(input.slice(start, i));
40
+ start = i + 1;
41
+ }
42
+ }
43
+ parts.push(input.slice(start));
44
+ return parts.map((p) => p.trim()).filter((p) => p.length > 0);
45
+ }
46
+ function parseFilter(expression, options, defects) {
47
+ const trimmed = expression.trim();
48
+ const group = /^(and|or)\((.*)\)$/s.exec(trimmed);
49
+ if (group?.[1] && group[2] !== undefined) {
50
+ const combinator = group[1];
51
+ const children = splitTopLevel(group[2]).map((part) => parseFilter(part, options, defects));
52
+ if (children.length === 0) {
53
+ throw new SqlError("invalid_filter", `empty ${combinator}() group`);
54
+ }
55
+ /* The joiner is swapped, not the parse: the expression is still read correctly, it is just
56
+ * evaluated with the other combinator's semantics. */
57
+ const effective = defects.has("FILTER_GROUP_COMBINATOR_SWAPPED")
58
+ ? (combinator === "and" ? "or" : "and")
59
+ : combinator;
60
+ return effective === "and"
61
+ ? (row) => children.every((child) => child(row))
62
+ : (row) => children.some((child) => child(row));
63
+ }
64
+ const segments = trimmed.split(".");
65
+ if (segments.length < 3) {
66
+ throw new SqlError("invalid_filter", `malformed filter term "${trimmed}"`);
67
+ }
68
+ const [field, op] = segments;
69
+ const rawValue = segments.slice(2).join(".");
70
+ if (!COMPARATORS.has(op)) {
71
+ throw new SqlError("invalid_filter", `unknown operator "${op}"`);
72
+ }
73
+ if (!options.filterable.includes(field)) {
74
+ /* Correct behaviour is to reject. The defect drops the term instead — the single most
75
+ * common real-world filter bug, and invisible to schema validation. */
76
+ if (defects.has("FILTER_IGNORED"))
77
+ return () => true;
78
+ throw new SqlError("invalid_filter", `field "${field}" is not filterable`);
79
+ }
80
+ return buildComparator(field, op, rawValue, defects);
81
+ }
82
+ function buildComparator(field, op, rawValue, defects) {
83
+ const value = coerce(rawValue);
84
+ switch (op) {
85
+ case "eq":
86
+ if (defects.has("FILTER_EQ_NOT_APPLIED"))
87
+ return () => true;
88
+ return (row) => looseEqual(row[field], value);
89
+ case "neq":
90
+ /* Three-valued logic leaking through: in SQL, `col <> x` is NULL — not true — when col
91
+ * is NULL, so those rows silently vanish unless the query says `OR col IS NULL`. */
92
+ if (defects.has("NEQ_DROPS_NULLS")) {
93
+ return (row) => row[field] !== null && row[field] !== undefined && !looseEqual(row[field], value);
94
+ }
95
+ return (row) => !looseEqual(row[field], value);
96
+ case "gt":
97
+ return (row) => compare(row[field], value) > 0;
98
+ case "gte":
99
+ return (row) => compare(row[field], value) >= 0;
100
+ case "lt":
101
+ return (row) => compare(row[field], value) < 0;
102
+ case "lte":
103
+ return (row) => compare(row[field], value) <= 0;
104
+ case "in":
105
+ case "nin": {
106
+ const members = stripParens(rawValue).split(",").map((s) => coerce(s.trim()));
107
+ return (row) => {
108
+ const hit = members.some((member) => looseEqual(row[field], member));
109
+ return op === "in" ? hit : !hit;
110
+ };
111
+ }
112
+ case "is": {
113
+ if (rawValue === "null")
114
+ return (row) => row[field] === null || row[field] === undefined;
115
+ if (rawValue === "true")
116
+ return (row) => row[field] === true;
117
+ if (rawValue === "false")
118
+ return (row) => row[field] === false;
119
+ throw new SqlError("invalid_filter", `is.${rawValue} is not a recognised predicate`);
120
+ }
121
+ case "contains":
122
+ return (row) => Array.isArray(row[field]) && row[field].some((v) => looseEqual(v, value));
123
+ case "like":
124
+ case "ilike": {
125
+ const pattern = likeToRegExp(rawValue, op === "ilike", defects);
126
+ return (row) => typeof row[field] === "string" && pattern.test(row[field]);
127
+ }
128
+ default:
129
+ throw new SqlError("invalid_filter", `unhandled operator "${op}"`);
130
+ }
131
+ }
132
+ /**
133
+ * `*` is the wildcard. Everything else — notably `%` and `_`, which users type constantly —
134
+ * must be escaped so it matches literally. Forgetting to is a real bug class: a value
135
+ * containing `%` then matches every row.
136
+ */
137
+ function likeToRegExp(pattern, insensitive, defects) {
138
+ const escaped = defects.has("LIKE_UNESCAPED")
139
+ ? pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/[%_]/g, ".*")
140
+ : pattern.replace(/[.+^${}()|[\]\\%_]/g, "\\$&");
141
+ return new RegExp(`^${escaped.replace(/\*/g, ".*")}$`, insensitive ? "i" : "");
142
+ }
143
+ function stripParens(value) {
144
+ return value.startsWith("(") && value.endsWith(")") ? value.slice(1, -1) : value;
145
+ }
146
+ function coerce(raw) {
147
+ if (raw === "null")
148
+ return null;
149
+ if (raw === "true")
150
+ return true;
151
+ if (raw === "false")
152
+ return false;
153
+ if (raw !== "" && !Number.isNaN(Number(raw)))
154
+ return Number(raw);
155
+ return raw;
156
+ }
157
+ function looseEqual(a, b) {
158
+ if (a === b)
159
+ return true;
160
+ if (a === null || a === undefined || b === null || b === undefined)
161
+ return false;
162
+ return String(a) === String(b);
163
+ }
164
+ function compare(a, b) {
165
+ if (a === null || a === undefined)
166
+ return -1;
167
+ if (b === null || b === undefined)
168
+ return 1;
169
+ if (typeof a === "number" && typeof b === "number")
170
+ return a - b;
171
+ const as = String(a);
172
+ const bs = String(b);
173
+ return as < bs ? -1 : as > bs ? 1 : 0;
174
+ }
175
+ function parseOrder(expression, options) {
176
+ return splitTopLevel(expression).map((term) => {
177
+ const [field, ...modifiers] = term.split(".");
178
+ if (field === undefined || !options.sortable.includes(field)) {
179
+ throw new SqlError("invalid_order", `field "${field ?? ""}" is not sortable`);
180
+ }
181
+ const descending = modifiers.includes("desc");
182
+ return {
183
+ descending,
184
+ field,
185
+ /* Postgres default: NULLs sort last ascending, first descending. */
186
+ nullsFirst: modifiers.includes("nullsfirst")
187
+ ? true
188
+ : modifiers.includes("nullslast")
189
+ ? false
190
+ : descending,
191
+ };
192
+ });
193
+ }
194
+ /** Advances per query so tied rows land differently each time — see UNSTABLE_SORT below. */
195
+ let unstableRotation = 0;
196
+ function applyOrder(rows, terms, options, defects) {
197
+ /* A sort without a total order is not a sort — equal keys may come back in any order, and
198
+ * keyset pagination built on it silently loses rows. The tiebreak is what makes paging sound.
199
+ *
200
+ * Array.prototype.sort is stable, so simply dropping the tiebreak would still yield a
201
+ * deterministic order and the defect would be unobservable. A real database without a
202
+ * tiebreak returns tied rows in whatever order the plan produced, varying between queries —
203
+ * so the defect rotates the input to reproduce that. */
204
+ const effective = defects.has("UNSTABLE_SORT")
205
+ ? terms
206
+ : [...terms, { descending: false, field: options.identity, nullsFirst: false }];
207
+ let input = [...rows];
208
+ if (defects.has("UNSTABLE_SORT") && input.length > 1) {
209
+ unstableRotation = (unstableRotation + 1) % input.length;
210
+ input = [...input.slice(unstableRotation), ...input.slice(0, unstableRotation)];
211
+ }
212
+ return input.sort((left, right) => {
213
+ for (const term of effective) {
214
+ const a = left[term.field];
215
+ const b = right[term.field];
216
+ const aNull = a === null || a === undefined;
217
+ const bNull = b === null || b === undefined;
218
+ if (aNull && bNull)
219
+ continue;
220
+ if (aNull || bNull) {
221
+ const nullRank = aNull ? -1 : 1;
222
+ return term.nullsFirst ? nullRank : -nullRank;
223
+ }
224
+ const delta = compare(a, b);
225
+ if (delta !== 0)
226
+ return term.descending ? -delta : delta;
227
+ }
228
+ return 0;
229
+ });
230
+ }
231
+ /* ------------------------------------------------------------------ execution */
232
+ export function runQuery(source, params, options, defects,
233
+ /** Applied before the sparse fieldset, so a derived value cannot reintroduce a deselected
234
+ * column. Mirrors the SQL stores so every backend projects identically. */
235
+ transform) {
236
+ let rows = [...source];
237
+ if (options.softDeleteField !== undefined && !defects.has("SOFT_DELETE_LEAK")) {
238
+ const field = options.softDeleteField;
239
+ const mentionsTombstones = params.filter?.includes(field) === true;
240
+ if (!mentionsTombstones)
241
+ rows = rows.filter((row) => row[field] === null || row[field] === undefined);
242
+ }
243
+ const unfilteredCount = rows.length;
244
+ if (params.filter !== undefined && params.filter !== "") {
245
+ let predicate;
246
+ try {
247
+ predicate = parseFilter(params.filter, options, defects);
248
+ }
249
+ catch (error) {
250
+ /* Correct behaviour is a 400. The defect lets the parser's own exception escape,
251
+ * which the transport surfaces as a 500 — validation confused with crashing. */
252
+ if (defects.has("ERROR_500_ON_BAD_FILTER")) {
253
+ throw new Error(`unhandled filter parse failure: ${String(error)}`);
254
+ }
255
+ throw error;
256
+ }
257
+ const filtered = rows.filter(predicate);
258
+ /* The "no results must mean the query was wrong" guard — falls back to the unfiltered set
259
+ * and makes an empty result impossible to express. */
260
+ rows = defects.has("EMPTY_RESULT_RETURNS_ALL") && filtered.length === 0 ? rows : filtered;
261
+ }
262
+ if (params.q !== undefined && params.q !== "" && !defects.has("SEARCH_IGNORED")) {
263
+ const needle = params.q.toLowerCase();
264
+ rows = rows.filter((row) => options.searchable.some((field) => String(row[field] ?? "").toLowerCase().includes(needle)));
265
+ }
266
+ const terms = params.order === undefined || params.order === ""
267
+ ? []
268
+ : parseOrder(params.order, options);
269
+ if (defects.has("SORT_DESC_DROPS_NULLS")) {
270
+ for (const term of terms) {
271
+ if (!term.descending)
272
+ continue;
273
+ rows = rows.filter((row) => row[term.field] !== null && row[term.field] !== undefined);
274
+ }
275
+ }
276
+ rows = applyOrder(rows, defects.has("ORDER_IGNORED") ? [] : terms, options, defects);
277
+ const requestedLimit = params.limit ?? options.defaultLimit;
278
+ const limit = defects.has("LIMIT_EXCEEDS_MAX")
279
+ ? requestedLimit
280
+ : Math.min(requestedLimit, options.maxLimit);
281
+ const total = defects.has("COUNT_ALWAYS_ZERO")
282
+ ? 0
283
+ : defects.has("COUNT_IGNORES_FILTER")
284
+ ? unfilteredCount
285
+ : rows.length;
286
+ let offset;
287
+ let page;
288
+ if (params.cursor !== undefined && params.cursor !== "") {
289
+ const afterId = decodeCursor(params.cursor);
290
+ const index = rows.findIndex((row) => String(row[options.identity]) === afterId);
291
+ /* Under CURSOR_DRIFT the cursor resolves one row early, so the cursor walk and the
292
+ * offset walk disagree — each looks self-consistent in isolation. */
293
+ offset = index === -1 ? 0 : index + (defects.has("CURSOR_DRIFT") ? 0 : 1);
294
+ page = null;
295
+ }
296
+ else {
297
+ const requested = Math.max(params.page ?? 1, 1);
298
+ offset = (requested - 1) * limit + (defects.has("OFF_BY_ONE_PAGE") && requested > 1 ? 1 : 0);
299
+ page = requested;
300
+ }
301
+ /* LIMIT_IGNORED serves the whole set regardless of the requested page size — the caller's
302
+ * paging loop then appears to complete in one request. */
303
+ const window = defects.has("LIMIT_IGNORED")
304
+ ? rows.slice(offset)
305
+ : rows.slice(offset, offset + limit);
306
+ const last = window.at(-1);
307
+ const hasMore = defects.has("HASMORE_ALWAYS_FALSE")
308
+ ? false
309
+ : offset + window.length < rows.length;
310
+ const projected = window
311
+ .map((row) => (transform === undefined ? row : transform(row)))
312
+ .map((row) => project(row, params.select, defects, options.excludedSelect ?? []));
313
+ return {
314
+ count: total,
315
+ hasMore,
316
+ items: projected,
317
+ limit,
318
+ nextCursor: hasMore && last !== undefined ? encodeCursor(String(last[options.identity])) : null,
319
+ page,
320
+ };
321
+ }
322
+ function project(row, select, defects, excluded = []) {
323
+ if (select === undefined || select === "" || select === "*")
324
+ return { ...row };
325
+ if (defects.has("SELECT_IGNORED"))
326
+ return { ...row };
327
+ const fields = select.split(",").map((s) => s.trim()).filter(Boolean);
328
+ const rejected = fields.find((f) => excluded.includes(f));
329
+ if (rejected !== undefined) {
330
+ throw new SqlError("invalid_select", `field "${rejected}" is not selectable`);
331
+ }
332
+ const out = {};
333
+ for (const field of fields) {
334
+ if (Object.hasOwn(row, field))
335
+ out[field] = row[field];
336
+ }
337
+ return out;
338
+ }
339
+ export function encodeCursor(id) {
340
+ return Buffer.from(JSON.stringify({ id }), "utf8").toString("base64url");
341
+ }
342
+ export function decodeCursor(cursor) {
343
+ try {
344
+ const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
345
+ if (typeof parsed.id !== "string")
346
+ throw new Error("missing id");
347
+ return parsed.id;
348
+ }
349
+ catch {
350
+ throw new SqlError("invalid_cursor", "cursor is not a value produced by this API");
351
+ }
352
+ }
353
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/reference/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;2DAE2D;AAC3D,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAuCvD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC3B,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,MAAM;IACN,OAAO;IACP,IAAI;IACJ,UAAU;CACV,CAAC,CAAA;AAEF,qDAAqD;AACrD,SAAS,aAAa,CAAC,KAAa;IACnC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAA;aAClB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAA;aACvB,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;YACjC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;IACF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,OAAqB,EAAE,OAAkB;IACjF,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;IAEjC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QAC3F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,SAAS,UAAU,UAAU,CAAC,CAAA;QACpE,CAAC;QACD;8DACsD;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;YAC/D,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACvC,CAAC,CAAC,UAAU,CAAA;QACb,OAAO,SAAS,KAAK,KAAK;YACzB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,0BAA0B,OAAO,GAAG,CAAC,CAAA;IAC3E,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAyC,CAAA;IAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACjE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC;+EACuE;QACvE,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;QACpD,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,UAAU,KAAK,qBAAqB,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,eAAe,CACvB,KAAa,EACb,EAAU,EACV,QAAgB,EAChB,OAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAE9B,QAAQ,EAAE,EAAE,CAAC;QACZ,KAAK,IAAI;YACR,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;gBAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;YAC3D,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;QAC9C,KAAK,KAAK;YACT;gGACoF;YACpF,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,EAAE,EAAE,CACd,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;YACnF,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;QAC/C,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QAC/C,KAAK,KAAK;YACT,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAChD,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QAC/C,KAAK,KAAK;YACT,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAChD,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC7E,OAAO,CAAC,GAAG,EAAE,EAAE;gBACd,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;gBACpE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YAChC,CAAC,CAAA;QACF,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACX,IAAI,QAAQ,KAAK,MAAM;gBAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAAA;YACxF,IAAI,QAAQ,KAAK,MAAM;gBAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;YAC5D,IAAI,QAAQ,KAAK,OAAO;gBAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAA;YAC9D,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,MAAM,QAAQ,gCAAgC,CAAC,CAAA;QACrF,CAAC;QACD,KAAK,UAAU;YACd,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QAC1F,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAE,KAAK,OAAO,EAAE,OAAO,CAAC,CAAA;YAC/D,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3E,CAAC;QACD;YACC,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAA;IACpE,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,OAAe,EAAE,WAAoB,EAAE,OAAkB;IAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;QACrE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IACjD,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AACjF,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IAC1B,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IACjC,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;IAChE,OAAO,GAAG,CAAA;AACX,CAAC;AAED,SAAS,UAAU,CAAC,CAAU,EAAE,CAAU;IACzC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAChF,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,OAAO,CAAC,CAAU,EAAE,CAAU;IACtC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAA;IAC5C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAC3C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAChE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACpB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACtC,CAAC;AAUD,SAAS,UAAU,CAAC,UAAkB,EAAE,OAAqB;IAC5D,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,MAAM,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,UAAU,KAAK,IAAI,EAAE,mBAAmB,CAAC,CAAA;QAC9E,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC7C,OAAO;YACN,UAAU;YACV,KAAK;YACL,oEAAoE;YACpE,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC3C,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAChC,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,UAAU;SACd,CAAA;IACF,CAAC,CAAC,CAAA;AACH,CAAC;AAED,4FAA4F;AAC5F,IAAI,gBAAgB,GAAG,CAAC,CAAA;AAExB,SAAS,UAAU,CAClB,IAAW,EACX,KAAiB,EACjB,OAAqB,EACrB,OAAkB;IAElB;;;;;;4DAMwD;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC7C,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;IAEhF,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACrB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,gBAAgB,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;QACxD,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAChF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACjC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3B,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAA;YAC3C,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAA;YAC3C,IAAI,KAAK,IAAI,KAAK;gBAAE,SAAQ;YAC5B,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC9C,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC3B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;QACzD,CAAC;QACD,OAAO,CAAC,CAAA;IACT,CAAC,CAAC,CAAA;AACH,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,QAAQ,CACvB,MAAsB,EACtB,MAAmB,EACnB,OAAqB,EACrB,OAAkB;AAClB;2EAC2E;AAC3E,SAA2C;IAE3C,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IAEtB,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAA;QACrC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;QAClE,IAAI,CAAC,kBAAkB;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAA;IACtG,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAA;IAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACzD,IAAI,SAAoB,CAAA;QACxB,IAAI,CAAC;YACJ,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB;4FACgF;YAChF,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACpE,CAAC;YACD,MAAM,KAAK,CAAA;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACvC;8DACsD;QACtD,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC1F,CAAC;IAED,IAAI,MAAM,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACrC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC3F,CAAA;IACF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE;QAC9D,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,SAAQ;YAC9B,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAA;QACvF,CAAC;IACF,CAAC;IACD,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACpF,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,YAAY,CAAA;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC7C,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACpC,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;IAEf,IAAI,MAAc,CAAA;IAClB,IAAI,IAAmB,CAAA;IACvB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;QAChF;6EACqE;QACrE,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzE,IAAI,GAAG,IAAI,CAAA;IACZ,CAAC;SAAM,CAAC;QACP,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/C,MAAM,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5F,IAAI,GAAG,SAAS,CAAA;IACjB,CAAC;IAED;8DAC0D;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAClD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAEvC,MAAM,SAAS,GAAG,MAAM;SACtB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;SAC9D,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAA;IAElF,OAAO;QACN,KAAK,EAAE,KAAK;QACZ,OAAO;QACP,KAAK,EAAE,SAAS;QAChB,KAAK;QACL,UAAU,EAAE,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC/F,IAAI;KACJ,CAAA;AACF,CAAC;AAED,SAAS,OAAO,CACf,GAAQ,EACR,MAA0B,EAC1B,OAAkB,EAClB,WAA8B,EAAE;IAEhC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAA;IAC9E,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAA;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,UAAU,QAAQ,qBAAqB,CAAC,CAAA;IAC9E,CAAC;IACD,MAAM,GAAG,GAAQ,EAAE,CAAA;IACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,GAAG,CAAA;AACX,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IAC1C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAoB,CAAA;QAC/F,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;QAChE,OAAO,MAAM,CAAC,EAAE,CAAA;IACjB,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,4CAA4C,CAAC,CAAA;IACnF,CAAC;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generates the reference backend's OpenAPI document from the entity model, fully annotated with
3
+ * the meta tags in the README. This is the "ideal citizen" spec: everything oat wants to know
4
+ * is declared, so a run against the clean baseline exercises the tag path rather than the
5
+ * heuristic fallbacks. The conformance suite also serves stripped variants to test the fallbacks.
6
+ */
7
+ import { type Dialect } from "./dialect.ts";
8
+ type Json = Record<string, unknown>;
9
+ export declare function buildSpec(dialect?: Dialect): Json;
10
+ /** Variant with every oat meta tag removed — exercises the heuristic fallbacks. */
11
+ export declare function buildUntaggedSpec(dialect?: Dialect): Json;
12
+ export {};
13
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/reference/spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAa,MAAM,cAAc,CAAA;AAGtD,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAmWnC,wBAAgB,SAAS,CAAC,OAAO,GAAE,OAAmB,GAAG,IAAI,CA0L5D;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,OAAmB,GAAG,IAAI,CAapE"}