@quereus/quereus 4.16.0 → 4.17.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.
- package/dist/src/core/database-auto-analyze.d.ts +258 -0
- package/dist/src/core/database-auto-analyze.d.ts.map +1 -0
- package/dist/src/core/database-auto-analyze.js +616 -0
- package/dist/src/core/database-auto-analyze.js.map +1 -0
- package/dist/src/core/database-materialized-views.d.ts +42 -1
- package/dist/src/core/database-materialized-views.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.js +76 -3
- package/dist/src/core/database-materialized-views.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +17 -0
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +37 -0
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database.d.ts +8 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +135 -5
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +8 -8
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +27 -14
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.d.ts.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.js +23 -2
- package/dist/src/planner/analysis/expression-fingerprint.js.map +1 -1
- package/dist/src/planner/analysis/mv-body-functions.d.ts +46 -0
- package/dist/src/planner/analysis/mv-body-functions.d.ts.map +1 -0
- package/dist/src/planner/analysis/mv-body-functions.js +65 -0
- package/dist/src/planner/analysis/mv-body-functions.js.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts +32 -4
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.js +37 -5
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +2 -2
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.js +46 -6
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
- package/dist/src/planner/analysis/sat-checker.js +2 -5
- package/dist/src/planner/analysis/sat-checker.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +17 -5
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +122 -79
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +73 -55
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +14 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +19 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +3 -2
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +10 -6
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +24 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +8 -4
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +14 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +5 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +3 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +8 -3
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.d.ts +47 -0
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.d.ts.map +1 -0
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.js +200 -0
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.js.map +1 -0
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts +29 -0
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +55 -16
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.d.ts +96 -22
- package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.js +401 -82
- package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts +20 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +23 -4
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +7 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +19 -2
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +262 -40
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +2 -1
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +24 -6
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/shared/access-leaf.d.ts +12 -12
- package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -1
- package/dist/src/planner/rules/shared/access-leaf.js +3 -14
- package/dist/src/planner/rules/shared/access-leaf.js.map +1 -1
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
- package/dist/src/planner/stats/catalog-stats.js +6 -10
- package/dist/src/planner/stats/catalog-stats.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +3 -5
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +4 -7
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +58 -4
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +5 -3
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/fanout-lookup-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/fanout-lookup-join.js +9 -1
- package/dist/src/runtime/emit/fanout-lookup-join.js.map +1 -1
- package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
- package/dist/src/runtime/emit/limit-offset.js +50 -24
- package/dist/src/runtime/emit/limit-offset.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +33 -2
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.js +61 -5
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view.js +6 -1
- package/dist/src/runtime/emit/materialized-view.js.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.js +8 -0
- package/dist/src/runtime/emit/ordinal-slice.js.map +1 -1
- package/dist/src/schema/derivation.d.ts +15 -1
- package/dist/src/schema/derivation.d.ts.map +1 -1
- package/dist/src/schema/derivation.js.map +1 -1
- package/dist/src/schema/function.d.ts +9 -4
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +11 -9
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/schema.d.ts +14 -3
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +20 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +27 -0
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +55 -0
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +6 -13
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +8 -17
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/util/comparison.d.ts +19 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +22 -0
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +10 -0
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,49 +1,123 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Index-nested-loop candidate construction for `rule-join-physical-selection`.
|
|
3
3
|
*
|
|
4
|
-
* When a join's inner
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* When a join's inner side bottoms out in a table-access leaf whose module can
|
|
5
|
+
* answer an equality seek on the join key, the leaf is replaced by an
|
|
6
|
+
* `IndexSeekNode` whose seek keys are column references into the OUTER row.
|
|
7
|
+
* The node above stays the logical `JoinNode`, so the existing nested-loop
|
|
8
|
+
* emitter drives it: for each outer row it installs the outer row slot and
|
|
9
|
+
* re-opens the inner pipeline, and the seek-key expressions resolve through
|
|
10
|
+
* the runtime context by attribute id — the same machinery correlated
|
|
11
11
|
* subqueries already exercise.
|
|
12
12
|
*
|
|
13
13
|
* Join(inner, s, SeqScan(big)) Join(inner, s, IndexSeek(big, keys=[s.k]))
|
|
14
14
|
* ON big.id = s.k ──▶ ON big.id = s.k
|
|
15
15
|
* reads every row of big one seek per row of s
|
|
16
16
|
*
|
|
17
|
+
* Two admission arms for the inner leaf. A WALK leaf (plain full scan, or an
|
|
18
|
+
* ordering-only index walk) enforces nothing, so its `FilterInfo` may be
|
|
19
|
+
* replaced wholesale. A SEEK leaf (`IndexSeekNode`) already enforces the
|
|
20
|
+
* predicates the module claimed — `status = 'x'` below is nowhere else in the
|
|
21
|
+
* tree — so it is admitted by re-OFFERING those predicates to the module
|
|
22
|
+
* alongside the join key and re-applying whatever the module declines:
|
|
23
|
+
*
|
|
24
|
+
* Join(inner, s, IndexSeek(big, [status='x']))
|
|
25
|
+
* ON big.id = s.k
|
|
26
|
+
* ──▶ Join(inner, s, Filter[status='x'](IndexSeek(big, keys=[s.k])))
|
|
27
|
+
* or Join(inner, s, IndexSeek(big, keys=[status='x', s.k])) (composite index)
|
|
28
|
+
*
|
|
29
|
+
* The function takes `outer` / `inner` explicitly rather than reading a
|
|
30
|
+
* JoinNode's `left` / `right`: the caller asks for BOTH orientations of an
|
|
31
|
+
* inner join (seek the right driven by the left, and the mirror) and elects
|
|
32
|
+
* the cheaper — see `ruleJoinPhysicalSelection`. Here "outer" always means the
|
|
33
|
+
* side that will drive, and "inner" the side whose leaf becomes the seek,
|
|
34
|
+
* whichever JoinNode slot each came from.
|
|
35
|
+
*
|
|
17
36
|
* This module only CONSTRUCTS the candidate (recognize the shape, probe the
|
|
18
|
-
* module, cost it); the
|
|
19
|
-
*
|
|
37
|
+
* module, cost it); the cost comparison and the join rebuild live in the
|
|
38
|
+
* caller. Every gate below declines by returning null, which leaves the
|
|
20
39
|
* nested-loop / hash / merge competition unchanged.
|
|
21
40
|
*
|
|
22
41
|
* NOTE: one extra pair of `getBestAccessPlan` probes runs per qualifying
|
|
23
|
-
* equi-join, uncached (see `probeModule`)
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
42
|
+
* equi-join on the walk arm, uncached (see `probeModule`); the seek arm runs
|
|
43
|
+
* ONE probe — its baseline is the displaced seek's recorded cost, a field read
|
|
44
|
+
* rather than a second probe. Cheap for both shipped modules; memoize by
|
|
45
|
+
* (table, offered constraints) only if a third-party module with an expensive
|
|
46
|
+
* planner shows up in optimization profiles — mirrors the rule-key-set-seek
|
|
47
|
+
* tripwire.
|
|
27
48
|
*/
|
|
28
49
|
import type { RelationalPlanNode } from '../../nodes/plan-node.js';
|
|
29
50
|
import type { OptContext } from '../../framework/context.js';
|
|
30
|
-
import {
|
|
51
|
+
import type { JoinType } from '../../nodes/join-node.js';
|
|
31
52
|
import type { EquiJoinPair } from '../../nodes/join-utils.js';
|
|
53
|
+
import { type PredicateConstraint } from '../../analysis/constraint-extractor.js';
|
|
54
|
+
import type { TableSchema } from '../../../schema/table.js';
|
|
32
55
|
export interface IndexNestedLoopCandidate {
|
|
33
|
-
/**
|
|
34
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Rebuilt INNER subtree with the access leaf replaced by the correlated seek.
|
|
58
|
+
* Which JoinNode slot it belongs in is the caller's business — it is the
|
|
59
|
+
* `inner` argument's slot, which is the right one only in the un-mirrored case.
|
|
60
|
+
*/
|
|
61
|
+
readonly newInner: RelationalPlanNode;
|
|
35
62
|
/** Engine-currency cost, comparable with nestedLoop/hash/merge in the caller. */
|
|
36
63
|
readonly cost: number;
|
|
64
|
+
/**
|
|
65
|
+
* The two inputs `cost` was derived from, so the caller can re-price the same
|
|
66
|
+
* seek under a different driver (`batchedIndexNestedLoopJoinCost`) without
|
|
67
|
+
* re-probing: the module's row estimate for one seek, and the inner
|
|
68
|
+
* subtree's first-row latency.
|
|
69
|
+
*/
|
|
70
|
+
readonly rowsPerSeek: number;
|
|
71
|
+
readonly perSeekLatencyMs: number;
|
|
72
|
+
/**
|
|
73
|
+
* True when the rebuilt inner PROVABLY yields at most one row per outer row —
|
|
74
|
+
* see {@link provesAtMostOne}. What lets the caller drive this candidate as a
|
|
75
|
+
* one-branch `FanOutLookupJoinNode` (`atMostOne-*` branch), whose runtime
|
|
76
|
+
* throws on a second row.
|
|
77
|
+
*/
|
|
78
|
+
readonly atMostOne: boolean;
|
|
37
79
|
}
|
|
38
80
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
81
|
+
* PROOF — not an estimate — that the inner rebuilt from `combined` yields at
|
|
82
|
+
* most one row per outer row. `FanOutLookupJoinNode`'s `atMostOne-*` branch
|
|
83
|
+
* modes throw `QuereusError(CONSTRAINT)` at runtime on a second row, so the
|
|
84
|
+
* module's `rows: 1` estimate must not stand in: a module that estimates 1 and
|
|
85
|
+
* returns 2 would turn a working query into an error.
|
|
86
|
+
*
|
|
87
|
+
* Premise: every constraint in `combined` is enforced somewhere inside the
|
|
88
|
+
* rebuilt inner. That is total for the `=` constraints this proof reads, by
|
|
89
|
+
* construction rather than by argument — each one is either module-DECLINED, and
|
|
90
|
+
* `reapplyDeclinedPushed` re-applies every declined pushed constraint as a Filter
|
|
91
|
+
* (join-key leftovers need none: the ON condition the caller keeps above the seek
|
|
92
|
+
* covers them), or module-HANDLED, and a handled constraint is either consumed
|
|
93
|
+
* into the seek's bounds or recovered by `selectPhysicalNode`'s
|
|
94
|
+
* `reattachUnconsumedConstraints` — whose `RECLAIMABLE_OPS` set contains `'='`,
|
|
95
|
+
* so no equality can fall through it. A Filter only removes rows, so a constraint
|
|
96
|
+
* enforced by a filter rather than by the index counts just the same. Then: if
|
|
97
|
+
* some enforced key has EVERY column pinned by an equality whose collation
|
|
98
|
+
* refines the key's ({@link equalityRefinesKey}), any two surviving rows agree
|
|
99
|
+
* on the whole key and uniqueness forbids the second. Ranges, IN and OR_RANGE
|
|
100
|
+
* admit many values and never contribute. Over-fetch is harmless — a
|
|
101
|
+
* `COARSER_SAFE` seek's residual Filter re-applies the exact comparison above
|
|
102
|
+
* it — and the finer-index case (`MISMATCH_UNSAFE`) never reaches here: it
|
|
103
|
+
* degrades to a scan in `selectPhysicalNode` and `rebuiltSeek` declines the
|
|
104
|
+
* candidate first. NULL keys need no case: `col = NULL` matches nothing.
|
|
105
|
+
*
|
|
106
|
+
* Exported for direct unit coverage; it is the correctness core of the batched
|
|
107
|
+
* candidate.
|
|
108
|
+
*/
|
|
109
|
+
export declare function provesAtMostOne(tableSchema: TableSchema, combined: readonly PredicateConstraint[]): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Try to build an index-nested-loop candidate: the `inner` subtree rebuilt with
|
|
112
|
+
* its access leaf replaced by an `IndexSeekNode` correlated to `outer`, plus
|
|
41
113
|
* its engine-currency cost. Returns null when any gate declines; the caller's
|
|
42
114
|
* nested-loop / hash / merge competition is then unchanged.
|
|
43
115
|
*
|
|
44
|
-
* `
|
|
45
|
-
*
|
|
46
|
-
* left
|
|
116
|
+
* `joinType` is the type the REBUILT join will have with `outer` on the left
|
|
117
|
+
* (so a mirrored inner join passes 'inner'). `equiPairs` must be non-empty and
|
|
118
|
+
* oriented left=outer / right=inner — the caller flips them for the mirror.
|
|
119
|
+
* `outerRows` is the outer side's row estimate, the same input hash and merge
|
|
120
|
+
* selection use for that side.
|
|
47
121
|
*/
|
|
48
|
-
export declare function tryIndexNestedLoop(
|
|
122
|
+
export declare function tryIndexNestedLoop(joinType: JoinType, outer: RelationalPlanNode, inner: RelationalPlanNode, equiPairs: readonly EquiJoinPair[], outerRows: number, context: OptContext): IndexNestedLoopCandidate | null;
|
|
49
123
|
//# sourceMappingURL=index-nested-loop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-nested-loop.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/index-nested-loop.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index-nested-loop.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/index-nested-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,0BAA0B,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAS9D,OAAO,EAA+C,KAAK,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAgB/H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B;AA0eD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,OAAO,CAa3G;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,GACjB,wBAAwB,GAAG,IAAI,CA+EjC"}
|