@affino/datagrid-formula-engine 0.1.1
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/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/analysis/index.d.ts +2 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +1 -0
- package/dist/analysis/types.d.ts +44 -0
- package/dist/analysis/types.d.ts.map +1 -0
- package/dist/analysis/types.js +1 -0
- package/dist/contracts.d.ts +177 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +140 -0
- package/dist/coreTypes.d.ts +2 -0
- package/dist/coreTypes.d.ts.map +1 -0
- package/dist/coreTypes.js +1 -0
- package/dist/dependency/index.d.ts +2 -0
- package/dist/dependency/index.d.ts.map +1 -0
- package/dist/dependency/index.js +1 -0
- package/dist/evaluators/columnar.d.ts +6 -0
- package/dist/evaluators/columnar.d.ts.map +1 -0
- package/dist/evaluators/columnar.js +39 -0
- package/dist/evaluators/index.d.ts +5 -0
- package/dist/evaluators/index.d.ts.map +1 -0
- package/dist/evaluators/index.js +4 -0
- package/dist/evaluators/interpreter.d.ts +6 -0
- package/dist/evaluators/interpreter.d.ts.map +1 -0
- package/dist/evaluators/interpreter.js +156 -0
- package/dist/evaluators/jit.d.ts +7 -0
- package/dist/evaluators/jit.d.ts.map +1 -0
- package/dist/evaluators/jit.js +158 -0
- package/dist/evaluators/shared.d.ts +36 -0
- package/dist/evaluators/shared.d.ts.map +1 -0
- package/dist/evaluators/shared.js +242 -0
- package/dist/evaluators/vector.d.ts +6 -0
- package/dist/evaluators/vector.d.ts.map +1 -0
- package/dist/evaluators/vector.js +228 -0
- package/dist/formulaEngine/compile.d.ts +2 -0
- package/dist/formulaEngine/compile.d.ts.map +1 -0
- package/dist/formulaEngine/compile.js +1 -0
- package/dist/formulaEngine/core.d.ts +2 -0
- package/dist/formulaEngine/core.d.ts.map +1 -0
- package/dist/formulaEngine/core.js +1 -0
- package/dist/formulaEngine/evaluators.d.ts +2 -0
- package/dist/formulaEngine/evaluators.d.ts.map +1 -0
- package/dist/formulaEngine/evaluators.js +1 -0
- package/dist/formulaEngine/index.d.ts +5 -0
- package/dist/formulaEngine/index.d.ts.map +1 -0
- package/dist/formulaEngine/index.js +2 -0
- package/dist/formulaExecutionPlan.d.ts +2 -0
- package/dist/formulaExecutionPlan.d.ts.map +1 -0
- package/dist/formulaExecutionPlan.js +1 -0
- package/dist/graph/executionPlan.d.ts +66 -0
- package/dist/graph/executionPlan.d.ts.map +1 -0
- package/dist/graph/executionPlan.js +534 -0
- package/dist/graph/index.d.ts +2 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +3 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/runtime/compile.d.ts +7 -0
- package/dist/runtime/compile.d.ts.map +1 -0
- package/dist/runtime/compile.js +453 -0
- package/dist/runtime/evaluators.d.ts +5 -0
- package/dist/runtime/evaluators.d.ts.map +1 -0
- package/dist/runtime/evaluators.js +6 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/types.d.ts +63 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +1 -0
- package/dist/syntax/analysis.d.ts +14 -0
- package/dist/syntax/analysis.d.ts.map +1 -0
- package/dist/syntax/analysis.js +159 -0
- package/dist/syntax/ast.d.ts +18 -0
- package/dist/syntax/ast.d.ts.map +1 -0
- package/dist/syntax/ast.js +54 -0
- package/dist/syntax/core.d.ts +4 -0
- package/dist/syntax/core.d.ts.map +1 -0
- package/dist/syntax/core.js +1 -0
- package/dist/syntax/functionGroups/advancedFunctions.d.ts +2 -0
- package/dist/syntax/functionGroups/advancedFunctions.d.ts.map +1 -0
- package/dist/syntax/functionGroups/advancedFunctions.js +252 -0
- package/dist/syntax/functionGroups/dateFunctions.d.ts +2 -0
- package/dist/syntax/functionGroups/dateFunctions.d.ts.map +1 -0
- package/dist/syntax/functionGroups/dateFunctions.js +144 -0
- package/dist/syntax/functionGroups/logicFunctions.d.ts +2 -0
- package/dist/syntax/functionGroups/logicFunctions.d.ts.map +1 -0
- package/dist/syntax/functionGroups/logicFunctions.js +140 -0
- package/dist/syntax/functionGroups/numericFunctions.d.ts +2 -0
- package/dist/syntax/functionGroups/numericFunctions.d.ts.map +1 -0
- package/dist/syntax/functionGroups/numericFunctions.js +268 -0
- package/dist/syntax/functionGroups/textFunctions.d.ts +2 -0
- package/dist/syntax/functionGroups/textFunctions.d.ts.map +1 -0
- package/dist/syntax/functionGroups/textFunctions.js +118 -0
- package/dist/syntax/functionHelpers.d.ts +45 -0
- package/dist/syntax/functionHelpers.d.ts.map +1 -0
- package/dist/syntax/functionHelpers.js +553 -0
- package/dist/syntax/functions.d.ts +9 -0
- package/dist/syntax/functions.d.ts.map +1 -0
- package/dist/syntax/functions.js +139 -0
- package/dist/syntax/index.d.ts +10 -0
- package/dist/syntax/index.d.ts.map +1 -0
- package/dist/syntax/index.js +7 -0
- package/dist/syntax/legacy.d.ts +29 -0
- package/dist/syntax/legacy.d.ts.map +1 -0
- package/dist/syntax/legacy.js +188 -0
- package/dist/syntax/optimizer.d.ts +6 -0
- package/dist/syntax/optimizer.d.ts.map +1 -0
- package/dist/syntax/optimizer.js +362 -0
- package/dist/syntax/parser.d.ts +7 -0
- package/dist/syntax/parser.d.ts.map +1 -0
- package/dist/syntax/parser.js +239 -0
- package/dist/syntax/tokenizer.d.ts +14 -0
- package/dist/syntax/tokenizer.d.ts.map +1 -0
- package/dist/syntax/tokenizer.js +852 -0
- package/dist/syntax/types.d.ts +120 -0
- package/dist/syntax/types.d.ts.map +1 -0
- package/dist/syntax/types.js +1 -0
- package/dist/syntax/values.d.ts +25 -0
- package/dist/syntax/values.d.ts.map +1 -0
- package/dist/syntax/values.js +270 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import {} from "../syntax/core.js";
|
|
2
|
+
import { collectFormulaContextKeys, normalizeFormulaFieldName, normalizeFormulaFunctionRegistry, normalizeFormulaText, } from "../syntax/functions.js";
|
|
3
|
+
import { foldFormulaConstants, collectFormulaIdentifiers, validateFormulaFunctions, } from "../syntax/optimizer.js";
|
|
4
|
+
import { createFormulaErrorValue, normalizeFormulaRuntimeError, } from "../syntax/values.js";
|
|
5
|
+
import { throwFormulaError, } from "../syntax/ast.js";
|
|
6
|
+
import { parseFormula } from "../syntax/parser.js";
|
|
7
|
+
import { parseDataGridFormulaIdentifier, tokenizeFormula } from "../syntax/tokenizer.js";
|
|
8
|
+
import { compileFormulaAstBatchEvaluatorJit, compileFormulaAstColumnarBatchEvaluatorFused, compileFormulaAstColumnarBatchEvaluatorVector, compileFormulaAstColumnarBatchEvaluatorJit, compileFormulaAstEvaluator, compileFormulaAstEvaluatorJit, compileFormulaAstTokenIndexEvaluator, } from "./evaluators.js";
|
|
9
|
+
function hasRowAwareFormulaIdentifiers(root) {
|
|
10
|
+
if (root.kind === "identifier") {
|
|
11
|
+
return root.rowSelector.kind !== "current";
|
|
12
|
+
}
|
|
13
|
+
if (root.kind === "call") {
|
|
14
|
+
return root.args.some(hasRowAwareFormulaIdentifiers);
|
|
15
|
+
}
|
|
16
|
+
if (root.kind === "unary") {
|
|
17
|
+
return hasRowAwareFormulaIdentifiers(root.value);
|
|
18
|
+
}
|
|
19
|
+
if (root.kind === "binary") {
|
|
20
|
+
return hasRowAwareFormulaIdentifiers(root.left) || hasRowAwareFormulaIdentifiers(root.right);
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
function hasRuntimeContextFormulaFunctions(root, functionRegistry) {
|
|
25
|
+
if (root.kind === "call") {
|
|
26
|
+
const functionDefinition = functionRegistry.get(root.name.trim().toUpperCase());
|
|
27
|
+
if (functionDefinition === null || functionDefinition === void 0 ? void 0 : functionDefinition.requiresRuntimeContext) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return root.args.some(arg => hasRuntimeContextFormulaFunctions(arg, functionRegistry));
|
|
31
|
+
}
|
|
32
|
+
if (root.kind === "unary") {
|
|
33
|
+
return hasRuntimeContextFormulaFunctions(root.value, functionRegistry);
|
|
34
|
+
}
|
|
35
|
+
if (root.kind === "binary") {
|
|
36
|
+
return hasRuntimeContextFormulaFunctions(root.left, functionRegistry)
|
|
37
|
+
|| hasRuntimeContextFormulaFunctions(root.right, functionRegistry);
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
function serializeFormulaValue(value) {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
if (Array.isArray(value)) {
|
|
44
|
+
return `[${value.map(item => serializeFormulaValue(item)).join(",")}]`;
|
|
45
|
+
}
|
|
46
|
+
if (value == null) {
|
|
47
|
+
return "null";
|
|
48
|
+
}
|
|
49
|
+
if (typeof value === "number") {
|
|
50
|
+
return Number.isFinite(value) ? `n:${value}` : `n:${String(value)}`;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
return `s:${JSON.stringify(value)}`;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === "boolean") {
|
|
56
|
+
return value ? "b:1" : "b:0";
|
|
57
|
+
}
|
|
58
|
+
if (typeof value === "object" && "kind" in value && value.kind === "error") {
|
|
59
|
+
const errorValue = value;
|
|
60
|
+
return `e:${String((_a = errorValue.code) !== null && _a !== void 0 ? _a : "")}:${String((_b = errorValue.message) !== null && _b !== void 0 ? _b : "")}`;
|
|
61
|
+
}
|
|
62
|
+
return `u:${String(value)}`;
|
|
63
|
+
}
|
|
64
|
+
function serializeFormulaAstRowSelector(node) {
|
|
65
|
+
if (node.rowSelector.kind === "current") {
|
|
66
|
+
return "current";
|
|
67
|
+
}
|
|
68
|
+
if (node.rowSelector.kind === "absolute") {
|
|
69
|
+
return `absolute:${node.rowSelector.rowIndex}`;
|
|
70
|
+
}
|
|
71
|
+
if (node.rowSelector.kind === "absolute-window") {
|
|
72
|
+
return `absolute-window:${node.rowSelector.startRowIndex}:${node.rowSelector.endRowIndex}`;
|
|
73
|
+
}
|
|
74
|
+
if (node.rowSelector.kind === "relative") {
|
|
75
|
+
return `relative:${node.rowSelector.offset}`;
|
|
76
|
+
}
|
|
77
|
+
return `window:${node.rowSelector.startOffset}:${node.rowSelector.endOffset}`;
|
|
78
|
+
}
|
|
79
|
+
function serializeFormulaAst(node) {
|
|
80
|
+
var _a, _b;
|
|
81
|
+
switch (node.kind) {
|
|
82
|
+
case "number":
|
|
83
|
+
return `num(${node.value})`;
|
|
84
|
+
case "literal":
|
|
85
|
+
return `lit(${serializeFormulaValue(node.value)})`;
|
|
86
|
+
case "identifier":
|
|
87
|
+
return `id(${JSON.stringify((_a = node.sheetReference) !== null && _a !== void 0 ? _a : "")}:${JSON.stringify(node.referenceName)}:${JSON.stringify((_b = node.rangeReferenceName) !== null && _b !== void 0 ? _b : "")}:${serializeFormulaAstRowSelector(node)})`;
|
|
88
|
+
case "call":
|
|
89
|
+
return `call(${JSON.stringify(node.name)}:${node.args.map(arg => serializeFormulaAst(arg)).join(",")})`;
|
|
90
|
+
case "unary":
|
|
91
|
+
return `unary(${node.operator}:${serializeFormulaAst(node.value)})`;
|
|
92
|
+
case "binary":
|
|
93
|
+
return `binary(${node.operator}:${serializeFormulaAst(node.left)}:${serializeFormulaAst(node.right)})`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function hashFormulaAst(node) {
|
|
97
|
+
const serialized = serializeFormulaAst(node);
|
|
98
|
+
let hash = 0x811c9dc5;
|
|
99
|
+
for (let index = 0; index < serialized.length; index += 1) {
|
|
100
|
+
hash ^= serialized.charCodeAt(index);
|
|
101
|
+
hash = Math.imul(hash, 0x01000193);
|
|
102
|
+
}
|
|
103
|
+
return `fnv1a:${(hash >>> 0).toString(16).padStart(8, "0")}`;
|
|
104
|
+
}
|
|
105
|
+
function normalizeFormulaIdentifierKey(identifier, referenceParserOptions) {
|
|
106
|
+
return parseDataGridFormulaIdentifier(identifier, referenceParserOptions).name.trim();
|
|
107
|
+
}
|
|
108
|
+
function analyzeFormulaExpression(formulaText, options = {}) {
|
|
109
|
+
var _a;
|
|
110
|
+
const formula = normalizeFormulaText(formulaText);
|
|
111
|
+
const tokens = tokenizeFormula(formula, options.referenceParserOptions);
|
|
112
|
+
const ast = parseFormula(tokens, options.referenceParserOptions);
|
|
113
|
+
const functionRegistry = normalizeFormulaFunctionRegistry(options.functionRegistry, {
|
|
114
|
+
onFunctionOverride: options.onFunctionOverride,
|
|
115
|
+
});
|
|
116
|
+
validateFormulaFunctions(ast, functionRegistry);
|
|
117
|
+
const optimizedAst = foldFormulaConstants(ast);
|
|
118
|
+
const references = [];
|
|
119
|
+
collectFormulaIdentifiers(optimizedAst, references);
|
|
120
|
+
const identifiers = [];
|
|
121
|
+
const seenIdentifiers = new Set();
|
|
122
|
+
for (const reference of references) {
|
|
123
|
+
const normalized = normalizeFormulaIdentifierKey(reference, options.referenceParserOptions);
|
|
124
|
+
if (normalized.length === 0 || seenIdentifiers.has(normalized)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
seenIdentifiers.add(normalized);
|
|
128
|
+
identifiers.push(normalized);
|
|
129
|
+
}
|
|
130
|
+
const contextKeys = Array.from(new Set((() => {
|
|
131
|
+
const collected = [];
|
|
132
|
+
collectFormulaContextKeys(optimizedAst, functionRegistry, collected);
|
|
133
|
+
return collected.map(key => key.trim()).filter(key => key.length > 0);
|
|
134
|
+
})()));
|
|
135
|
+
const resolveDependencyToken = (_a = options.resolveDependencyToken) !== null && _a !== void 0 ? _a : ((identifier) => `field:${identifier}`);
|
|
136
|
+
const deps = [];
|
|
137
|
+
const dependencyTokenByIdentifier = new Map();
|
|
138
|
+
const seenDependencyTokens = new Set();
|
|
139
|
+
for (const identifier of identifiers) {
|
|
140
|
+
const token = resolveDependencyToken(identifier);
|
|
141
|
+
dependencyTokenByIdentifier.set(identifier, token);
|
|
142
|
+
if (seenDependencyTokens.has(token)) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
seenDependencyTokens.add(token);
|
|
146
|
+
deps.push(token);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
formula,
|
|
150
|
+
functionRegistry,
|
|
151
|
+
optimizedAst,
|
|
152
|
+
expressionHash: hashFormulaAst(optimizedAst),
|
|
153
|
+
identifiers,
|
|
154
|
+
deps,
|
|
155
|
+
contextKeys,
|
|
156
|
+
dependencyTokenByIdentifier,
|
|
157
|
+
hasRowAwareIdentifiers: hasRowAwareFormulaIdentifiers(optimizedAst),
|
|
158
|
+
hasRuntimeContextFunctions: hasRuntimeContextFormulaFunctions(optimizedAst, functionRegistry),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export function analyzeDataGridFormulaFieldDefinition(definition, options = {}) {
|
|
162
|
+
const analyzed = analyzeFormulaExpression(definition.formula, options);
|
|
163
|
+
return {
|
|
164
|
+
formula: analyzed.formula,
|
|
165
|
+
expressionHash: analyzed.expressionHash,
|
|
166
|
+
identifiers: analyzed.identifiers,
|
|
167
|
+
deps: analyzed.deps,
|
|
168
|
+
contextKeys: analyzed.contextKeys,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
export function bindCompiledFormulaArtifactToFieldDefinition(artifact, definition, options = {}) {
|
|
172
|
+
return artifact.bind(definition, options);
|
|
173
|
+
}
|
|
174
|
+
export function compileDataGridFormulaFieldArtifact(definition, options = {}) {
|
|
175
|
+
const analyzed = analyzeFormulaExpression(definition.formula, options);
|
|
176
|
+
const dependencyTokenIndexByToken = new Map();
|
|
177
|
+
for (let tokenIndex = 0; tokenIndex < analyzed.deps.length; tokenIndex += 1) {
|
|
178
|
+
const token = analyzed.deps[tokenIndex];
|
|
179
|
+
if (typeof token !== "string") {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
dependencyTokenIndexByToken.set(token, tokenIndex);
|
|
183
|
+
}
|
|
184
|
+
const resolveIdentifierToken = (identifier) => analyzed.dependencyTokenByIdentifier.get(identifier);
|
|
185
|
+
const resolveIdentifierTokenIndex = (identifier) => {
|
|
186
|
+
const token = resolveIdentifierToken(identifier);
|
|
187
|
+
if (!token) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return dependencyTokenIndexByToken.get(token);
|
|
191
|
+
};
|
|
192
|
+
const compileStrategy = (options.compileStrategy === "ast"
|
|
193
|
+
|| options.compileStrategy === "jit"
|
|
194
|
+
|| options.compileStrategy === "auto")
|
|
195
|
+
? options.compileStrategy
|
|
196
|
+
: "auto";
|
|
197
|
+
const allowDynamicCodegen = options.allowDynamicCodegen !== false;
|
|
198
|
+
let evaluator;
|
|
199
|
+
let activeFunctionContext;
|
|
200
|
+
let batchEvaluator = null;
|
|
201
|
+
let columnarBatchEvaluator = null;
|
|
202
|
+
const supportsBatchExecution = !analyzed.hasRowAwareIdentifiers && !analyzed.hasRuntimeContextFunctions;
|
|
203
|
+
const fusedColumnarBatchEvaluator = supportsBatchExecution
|
|
204
|
+
? compileFormulaAstColumnarBatchEvaluatorFused(analyzed.optimizedAst, resolveIdentifierTokenIndex)
|
|
205
|
+
: null;
|
|
206
|
+
const vectorColumnarBatchEvaluator = supportsBatchExecution
|
|
207
|
+
? compileFormulaAstColumnarBatchEvaluatorVector(analyzed.optimizedAst, resolveIdentifierTokenIndex)
|
|
208
|
+
: null;
|
|
209
|
+
const tokenIndexEvaluator = compileFormulaAstTokenIndexEvaluator(analyzed.optimizedAst, analyzed.functionRegistry, resolveIdentifierTokenIndex);
|
|
210
|
+
if (compileStrategy === "jit" && !allowDynamicCodegen) {
|
|
211
|
+
throwFormulaError(`Failed to compile JIT evaluator: dynamic code generation is disabled. Use compileStrategy 'ast' or allowDynamicCodegen: true.`);
|
|
212
|
+
}
|
|
213
|
+
if (analyzed.hasRowAwareIdentifiers || analyzed.hasRuntimeContextFunctions || compileStrategy === "ast" || !allowDynamicCodegen) {
|
|
214
|
+
evaluator = compileFormulaAstEvaluator(analyzed.optimizedAst, analyzed.functionRegistry, resolveIdentifierToken, () => activeFunctionContext);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
try {
|
|
218
|
+
evaluator = compileFormulaAstEvaluatorJit(analyzed.optimizedAst, analyzed.functionRegistry, resolveIdentifierTokenIndex, analyzed.deps);
|
|
219
|
+
batchEvaluator = compileFormulaAstBatchEvaluatorJit(analyzed.optimizedAst, analyzed.functionRegistry, resolveIdentifierTokenIndex);
|
|
220
|
+
columnarBatchEvaluator = compileFormulaAstColumnarBatchEvaluatorJit(analyzed.optimizedAst, analyzed.functionRegistry, resolveIdentifierTokenIndex);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
if (compileStrategy === "jit") {
|
|
224
|
+
const message = error instanceof Error
|
|
225
|
+
? error.message
|
|
226
|
+
: String(error !== null && error !== void 0 ? error : "Unknown JIT compile error.");
|
|
227
|
+
throwFormulaError(`Failed to compile JIT evaluator: ${message}`);
|
|
228
|
+
}
|
|
229
|
+
evaluator = compileFormulaAstEvaluator(analyzed.optimizedAst, analyzed.functionRegistry, resolveIdentifierToken);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const rowFallbackChunkSize = 128;
|
|
233
|
+
const bind = (fieldDefinition, bindOptions = {}) => {
|
|
234
|
+
var _a, _b;
|
|
235
|
+
const name = normalizeFormulaFieldName(fieldDefinition.name, "Formula name");
|
|
236
|
+
const field = normalizeFormulaFieldName((_a = fieldDefinition.field) !== null && _a !== void 0 ? _a : name, "Formula target field");
|
|
237
|
+
const runtimeErrorPolicy = (_b = bindOptions.runtimeErrorPolicy) !== null && _b !== void 0 ? _b : "coerce-zero";
|
|
238
|
+
const batchExecutionMode = analyzed.hasRowAwareIdentifiers || analyzed.hasRuntimeContextFunctions
|
|
239
|
+
? "row"
|
|
240
|
+
: fusedColumnarBatchEvaluator
|
|
241
|
+
? "columnar-fused"
|
|
242
|
+
: columnarBatchEvaluator
|
|
243
|
+
? "columnar-jit"
|
|
244
|
+
: vectorColumnarBatchEvaluator
|
|
245
|
+
? "columnar-vector"
|
|
246
|
+
: "columnar-ast";
|
|
247
|
+
const evaluateWithRuntimePolicy = (evaluate, contextMeta) => {
|
|
248
|
+
var _a;
|
|
249
|
+
try {
|
|
250
|
+
return evaluate();
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
const runtimeError = normalizeFormulaRuntimeError(error, {
|
|
254
|
+
formulaName: name,
|
|
255
|
+
field,
|
|
256
|
+
formula: analyzed.formula,
|
|
257
|
+
rowId: contextMeta.rowId,
|
|
258
|
+
sourceIndex: contextMeta.sourceIndex,
|
|
259
|
+
});
|
|
260
|
+
(_a = bindOptions.onRuntimeError) === null || _a === void 0 ? void 0 : _a.call(bindOptions, runtimeError);
|
|
261
|
+
if (runtimeErrorPolicy === "throw") {
|
|
262
|
+
throw new Error(`[DataGridFormula] ${runtimeError.message}`);
|
|
263
|
+
}
|
|
264
|
+
if (runtimeErrorPolicy === "error-value") {
|
|
265
|
+
return createFormulaErrorValue(runtimeError);
|
|
266
|
+
}
|
|
267
|
+
return 0;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const evaluateRowWithTokenIndexReader = (contexts, contextIndex, readTokenAt) => {
|
|
271
|
+
const context = contexts[contextIndex];
|
|
272
|
+
if (!context) {
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
return evaluateWithRuntimePolicy(() => tokenIndexEvaluator((tokenIndex) => readTokenAt(contextIndex, tokenIndex)), {
|
|
276
|
+
rowId: context.rowId,
|
|
277
|
+
sourceIndex: context.sourceIndex,
|
|
278
|
+
});
|
|
279
|
+
};
|
|
280
|
+
const buildRowWiseResults = (contexts, readTokenAt, startIndex = 0, endIndex = contexts.length, output) => {
|
|
281
|
+
const target = output !== null && output !== void 0 ? output : new Array(contexts.length);
|
|
282
|
+
for (let contextIndex = startIndex; contextIndex < endIndex; contextIndex += 1) {
|
|
283
|
+
target[contextIndex] = evaluateRowWithTokenIndexReader(contexts, contextIndex, readTokenAt);
|
|
284
|
+
}
|
|
285
|
+
return target;
|
|
286
|
+
};
|
|
287
|
+
const computeBatch = analyzed.hasRowAwareIdentifiers
|
|
288
|
+
? undefined
|
|
289
|
+
: ((contexts, readTokenByIndex) => {
|
|
290
|
+
var _a;
|
|
291
|
+
if (contexts.length === 0) {
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
if (batchEvaluator) {
|
|
295
|
+
try {
|
|
296
|
+
return batchEvaluator(contexts.length, readTokenByIndex);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
if (contexts.length > rowFallbackChunkSize) {
|
|
300
|
+
const results = new Array(contexts.length);
|
|
301
|
+
for (let start = 0; start < contexts.length; start += rowFallbackChunkSize) {
|
|
302
|
+
const end = Math.min(start + rowFallbackChunkSize, contexts.length);
|
|
303
|
+
const chunkLength = end - start;
|
|
304
|
+
try {
|
|
305
|
+
const chunkResult = batchEvaluator(chunkLength, (contextIndex, tokenIndex) => readTokenByIndex(start + contextIndex, tokenIndex));
|
|
306
|
+
for (let offset = 0; offset < chunkLength; offset += 1) {
|
|
307
|
+
results[start + offset] = (_a = chunkResult[offset]) !== null && _a !== void 0 ? _a : 0;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
buildRowWiseResults(contexts, readTokenByIndex, start, end, results);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return results;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return buildRowWiseResults(contexts, readTokenByIndex);
|
|
319
|
+
});
|
|
320
|
+
const computeBatchColumnar = analyzed.hasRowAwareIdentifiers
|
|
321
|
+
? undefined
|
|
322
|
+
: ((contexts, tokenColumns) => {
|
|
323
|
+
var _a, _b, _c;
|
|
324
|
+
if (contexts.length === 0) {
|
|
325
|
+
return [];
|
|
326
|
+
}
|
|
327
|
+
if (fusedColumnarBatchEvaluator) {
|
|
328
|
+
try {
|
|
329
|
+
return fusedColumnarBatchEvaluator(contexts.length, tokenColumns);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
if (contexts.length > rowFallbackChunkSize) {
|
|
333
|
+
const results = new Array(contexts.length);
|
|
334
|
+
for (let start = 0; start < contexts.length; start += rowFallbackChunkSize) {
|
|
335
|
+
const end = Math.min(start + rowFallbackChunkSize, contexts.length);
|
|
336
|
+
const chunkLength = end - start;
|
|
337
|
+
const chunkColumns = tokenColumns.map(column => (column ? column.slice(start, end) : []));
|
|
338
|
+
try {
|
|
339
|
+
const chunkResult = fusedColumnarBatchEvaluator(chunkLength, chunkColumns);
|
|
340
|
+
for (let offset = 0; offset < chunkLength; offset += 1) {
|
|
341
|
+
results[start + offset] = (_a = chunkResult[offset]) !== null && _a !== void 0 ? _a : 0;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
buildRowWiseResults(contexts, (contextIndex, tokenIndex) => {
|
|
346
|
+
const column = tokenColumns[tokenIndex];
|
|
347
|
+
return column ? column[contextIndex] : undefined;
|
|
348
|
+
}, start, end, results);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return results;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (columnarBatchEvaluator) {
|
|
356
|
+
try {
|
|
357
|
+
return columnarBatchEvaluator(contexts.length, tokenColumns);
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
if (contexts.length > rowFallbackChunkSize) {
|
|
361
|
+
const results = new Array(contexts.length);
|
|
362
|
+
for (let start = 0; start < contexts.length; start += rowFallbackChunkSize) {
|
|
363
|
+
const end = Math.min(start + rowFallbackChunkSize, contexts.length);
|
|
364
|
+
const chunkLength = end - start;
|
|
365
|
+
const chunkColumns = tokenColumns.map(column => (column ? column.slice(start, end) : []));
|
|
366
|
+
try {
|
|
367
|
+
const chunkResult = columnarBatchEvaluator(chunkLength, chunkColumns);
|
|
368
|
+
for (let offset = 0; offset < chunkLength; offset += 1) {
|
|
369
|
+
results[start + offset] = (_b = chunkResult[offset]) !== null && _b !== void 0 ? _b : 0;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
buildRowWiseResults(contexts, (contextIndex, tokenIndex) => {
|
|
374
|
+
const column = tokenColumns[tokenIndex];
|
|
375
|
+
return column ? column[contextIndex] : undefined;
|
|
376
|
+
}, start, end, results);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return results;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (vectorColumnarBatchEvaluator) {
|
|
384
|
+
try {
|
|
385
|
+
return vectorColumnarBatchEvaluator(contexts.length, tokenColumns);
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
if (contexts.length > rowFallbackChunkSize) {
|
|
389
|
+
const results = new Array(contexts.length);
|
|
390
|
+
for (let start = 0; start < contexts.length; start += rowFallbackChunkSize) {
|
|
391
|
+
const end = Math.min(start + rowFallbackChunkSize, contexts.length);
|
|
392
|
+
const chunkLength = end - start;
|
|
393
|
+
const chunkColumns = tokenColumns.map(column => (column ? column.slice(start, end) : []));
|
|
394
|
+
try {
|
|
395
|
+
const chunkResult = vectorColumnarBatchEvaluator(chunkLength, chunkColumns);
|
|
396
|
+
for (let offset = 0; offset < chunkLength; offset += 1) {
|
|
397
|
+
results[start + offset] = (_c = chunkResult[offset]) !== null && _c !== void 0 ? _c : 0;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
buildRowWiseResults(contexts, (contextIndex, tokenIndex) => {
|
|
402
|
+
const column = tokenColumns[tokenIndex];
|
|
403
|
+
return column ? column[contextIndex] : undefined;
|
|
404
|
+
}, start, end, results);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return results;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return buildRowWiseResults(contexts, (contextIndex, tokenIndex) => {
|
|
412
|
+
const column = tokenColumns[tokenIndex];
|
|
413
|
+
return column ? column[contextIndex] : undefined;
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
return {
|
|
417
|
+
name,
|
|
418
|
+
field,
|
|
419
|
+
formula: analyzed.formula,
|
|
420
|
+
expressionHash: analyzed.expressionHash,
|
|
421
|
+
identifiers: analyzed.identifiers,
|
|
422
|
+
deps: analyzed.deps,
|
|
423
|
+
contextKeys: analyzed.contextKeys,
|
|
424
|
+
batchExecutionMode,
|
|
425
|
+
computeBatch,
|
|
426
|
+
computeBatchColumnar,
|
|
427
|
+
compute: (context) => evaluateWithRuntimePolicy(() => {
|
|
428
|
+
activeFunctionContext = context;
|
|
429
|
+
try {
|
|
430
|
+
return evaluator(token => context.get(token));
|
|
431
|
+
}
|
|
432
|
+
finally {
|
|
433
|
+
activeFunctionContext = undefined;
|
|
434
|
+
}
|
|
435
|
+
}, {
|
|
436
|
+
rowId: context.rowId,
|
|
437
|
+
sourceIndex: context.sourceIndex,
|
|
438
|
+
}),
|
|
439
|
+
};
|
|
440
|
+
};
|
|
441
|
+
return {
|
|
442
|
+
formula: analyzed.formula,
|
|
443
|
+
expressionHash: analyzed.expressionHash,
|
|
444
|
+
identifiers: analyzed.identifiers,
|
|
445
|
+
deps: analyzed.deps,
|
|
446
|
+
contextKeys: analyzed.contextKeys,
|
|
447
|
+
bind,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
export function compileDataGridFormulaFieldDefinition(definition, options = {}) {
|
|
451
|
+
const artifact = compileDataGridFormulaFieldArtifact(definition, options);
|
|
452
|
+
return bindCompiledFormulaArtifactToFieldDefinition(artifact, definition, options);
|
|
453
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { compileFormulaAstEvaluator, compileFormulaAstTokenIndexEvaluator, } from "../evaluators/interpreter.js";
|
|
2
|
+
export { compileFormulaAstEvaluatorJit, compileFormulaAstBatchEvaluatorJit, compileFormulaAstColumnarBatchEvaluatorJit, } from "../evaluators/jit.js";
|
|
3
|
+
export { compileFormulaAstColumnarBatchEvaluatorFused, } from "../evaluators/columnar.js";
|
|
4
|
+
export { compileFormulaAstColumnarBatchEvaluatorVector, } from "../evaluators/vector.js";
|
|
5
|
+
//# sourceMappingURL=evaluators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluators.d.ts","sourceRoot":"","sources":["../../src/runtime/evaluators.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,0BAA0B,EAC1B,oCAAoC,GACrC,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,0CAA0C,GAC3C,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,4CAA4C,GAC7C,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,6CAA6C,GAC9C,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Runtime evaluator entrypoints. Backend-specific implementation lives in
|
|
2
|
+
// ../evaluators/* while this file stays a stable runtime-facing barrel.
|
|
3
|
+
export { compileFormulaAstEvaluator, compileFormulaAstTokenIndexEvaluator, } from "../evaluators/interpreter.js";
|
|
4
|
+
export { compileFormulaAstEvaluatorJit, compileFormulaAstBatchEvaluatorJit, compileFormulaAstColumnarBatchEvaluatorJit, } from "../evaluators/jit.js";
|
|
5
|
+
export { compileFormulaAstColumnarBatchEvaluatorFused, } from "../evaluators/columnar.js";
|
|
6
|
+
export { compileFormulaAstColumnarBatchEvaluatorVector, } from "../evaluators/vector.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { DataGridComputedDependencyToken, DataGridComputedFieldComputeContext, DataGridFormulaFieldDefinition, DataGridFormulaRuntimeError, DataGridFormulaValue } from "../coreTypes.js";
|
|
2
|
+
import type { DataGridFormulaAstNode, DataGridFormulaFunctionArity, DataGridFormulaFunctionRegistry, DataGridFormulaReferenceParserOptions, DataGridFormulaToken } from "../syntax/types.js";
|
|
3
|
+
export interface DataGridFormulaFunctionRuntime {
|
|
4
|
+
name: string;
|
|
5
|
+
arity?: DataGridFormulaFunctionArity;
|
|
6
|
+
contextKeys: readonly string[];
|
|
7
|
+
resolveContextKeys?: (args: readonly DataGridFormulaAstNode[]) => readonly string[];
|
|
8
|
+
requiresRuntimeContext: boolean;
|
|
9
|
+
compute: (args: readonly DataGridFormulaValue[], context?: DataGridComputedFieldComputeContext<unknown>) => unknown;
|
|
10
|
+
}
|
|
11
|
+
export type DataGridFormulaRuntimeErrorPolicy = "coerce-zero" | "throw" | "error-value";
|
|
12
|
+
export type DataGridFormulaCompileStrategy = "auto" | "ast" | "jit";
|
|
13
|
+
export interface DataGridFormulaCompileOptions {
|
|
14
|
+
resolveDependencyToken?: (identifier: string) => DataGridComputedDependencyToken;
|
|
15
|
+
functionRegistry?: DataGridFormulaFunctionRegistry;
|
|
16
|
+
referenceParserOptions?: DataGridFormulaReferenceParserOptions;
|
|
17
|
+
onFunctionOverride?: (functionName: string) => void;
|
|
18
|
+
runtimeErrorPolicy?: DataGridFormulaRuntimeErrorPolicy;
|
|
19
|
+
onRuntimeError?: (error: DataGridFormulaRuntimeError) => void;
|
|
20
|
+
compileStrategy?: DataGridFormulaCompileStrategy;
|
|
21
|
+
allowDynamicCodegen?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface DataGridCompiledFormulaField<TRow = unknown> {
|
|
24
|
+
name: string;
|
|
25
|
+
field: string;
|
|
26
|
+
formula: string;
|
|
27
|
+
expressionHash: string;
|
|
28
|
+
identifiers: readonly string[];
|
|
29
|
+
deps: readonly DataGridComputedDependencyToken[];
|
|
30
|
+
contextKeys: readonly string[];
|
|
31
|
+
batchExecutionMode?: DataGridCompiledFormulaBatchExecutionMode;
|
|
32
|
+
compute: (context: DataGridComputedFieldComputeContext<TRow>) => DataGridFormulaValue;
|
|
33
|
+
computeBatch?: (contexts: readonly DataGridCompiledFormulaBatchContext<TRow>[], readTokenByIndex: (contextIndex: number, tokenIndex: number) => unknown) => readonly DataGridFormulaValue[];
|
|
34
|
+
computeBatchColumnar?: (contexts: readonly DataGridCompiledFormulaBatchContext<TRow>[], tokenColumns: readonly (readonly unknown[])[]) => readonly DataGridFormulaValue[];
|
|
35
|
+
}
|
|
36
|
+
export interface DataGridFormulaExpressionAnalysis {
|
|
37
|
+
formula: string;
|
|
38
|
+
expressionHash: string;
|
|
39
|
+
identifiers: readonly string[];
|
|
40
|
+
deps: readonly DataGridComputedDependencyToken[];
|
|
41
|
+
contextKeys: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
export interface DataGridCompiledFormulaArtifact<TRow = unknown> extends DataGridFormulaExpressionAnalysis {
|
|
44
|
+
bind: (definition: DataGridFormulaFieldDefinition, options?: Pick<DataGridFormulaCompileOptions, "runtimeErrorPolicy" | "onRuntimeError">) => DataGridCompiledFormulaField<TRow>;
|
|
45
|
+
}
|
|
46
|
+
export interface DataGridCompiledFormulaBatchContext<TRow = unknown> {
|
|
47
|
+
row: TRow;
|
|
48
|
+
rowId: string | number;
|
|
49
|
+
sourceIndex: number;
|
|
50
|
+
}
|
|
51
|
+
export type DataGridCompiledFormulaBatchExecutionMode = "row" | "batch" | "columnar-ast" | "columnar-jit" | "columnar-fused" | "columnar-vector";
|
|
52
|
+
export type DataGridFormulaTokenValueReader<TKey> = (token: TKey) => unknown;
|
|
53
|
+
export type DataGridFormulaEvaluatorForToken<TKey> = (readTokenValue: DataGridFormulaTokenValueReader<TKey>) => DataGridFormulaValue;
|
|
54
|
+
export type DataGridFormulaEvaluator = DataGridFormulaEvaluatorForToken<DataGridComputedDependencyToken>;
|
|
55
|
+
export type DataGridFormulaTokenIndexEvaluator = DataGridFormulaEvaluatorForToken<number>;
|
|
56
|
+
export type DataGridFormulaBatchEvaluator = (contextsCount: number, readTokenByIndex: (contextIndex: number, tokenIndex: number) => unknown) => readonly DataGridFormulaValue[];
|
|
57
|
+
export type DataGridFormulaColumnarBatchEvaluator = (contextsCount: number, tokenColumns: readonly (readonly unknown[])[]) => readonly DataGridFormulaValue[];
|
|
58
|
+
export interface DataGridFormulaParseResult {
|
|
59
|
+
formula: string;
|
|
60
|
+
tokens: readonly DataGridFormulaToken[];
|
|
61
|
+
ast: DataGridFormulaAstNode;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DataGridFormulaDiagnosticsResult, DataGridFormulaExplainResult, DataGridFormulaFieldExplainResult } from "../analysis/types.js";
|
|
2
|
+
export type { DataGridFormulaDiagnosticsResult, DataGridFormulaExplainDependency, DataGridFormulaExplainDependencyDomain, DataGridFormulaExplainNode, DataGridFormulaExplainResult, DataGridFormulaFieldExplainResult, } from "../analysis/types.js";
|
|
3
|
+
import type { DataGridFormulaCompileOptions, DataGridFormulaParseResult } from "../runtime/types.js";
|
|
4
|
+
export type { DataGridCompiledFormulaArtifact, DataGridCompiledFormulaBatchContext, DataGridCompiledFormulaBatchExecutionMode, DataGridCompiledFormulaField, DataGridFormulaBatchEvaluator, DataGridFormulaColumnarBatchEvaluator, DataGridFormulaCompileOptions, DataGridFormulaCompileStrategy, DataGridFormulaEvaluator, DataGridFormulaEvaluatorForToken, DataGridFormulaExpressionAnalysis, DataGridFormulaFunctionRuntime, DataGridFormulaParseResult, DataGridFormulaRuntimeErrorPolicy, DataGridFormulaTokenIndexEvaluator, DataGridFormulaTokenValueReader, } from "../runtime/types.js";
|
|
5
|
+
export type { DataGridFormulaAstNode, DataGridFormulaDiagnostic, DataGridFormulaFunctionArity, DataGridFormulaFunctionDefinition, DataGridFormulaFunctionRegistry, DataGridFormulaOperator, DataGridFormulaReferenceSegment, DataGridFormulaSourceSpan, DataGridFormulaToken, } from "./types.js";
|
|
6
|
+
export declare function parseDataGridFormulaExpression(formula: string, options?: Pick<DataGridFormulaCompileOptions, "referenceParserOptions">): DataGridFormulaParseResult;
|
|
7
|
+
export declare function diagnoseDataGridFormulaExpression(formula: string, options?: Pick<DataGridFormulaCompileOptions, "functionRegistry" | "onFunctionOverride" | "referenceParserOptions">): DataGridFormulaDiagnosticsResult;
|
|
8
|
+
export declare function explainDataGridFormulaExpression(formula: string, options?: Pick<DataGridFormulaCompileOptions, "resolveDependencyToken" | "functionRegistry" | "onFunctionOverride" | "referenceParserOptions">): DataGridFormulaExplainResult;
|
|
9
|
+
export declare function explainDataGridFormulaFieldDefinition(definition: {
|
|
10
|
+
name: string;
|
|
11
|
+
field?: string;
|
|
12
|
+
formula: string;
|
|
13
|
+
}, options?: Pick<DataGridFormulaCompileOptions, "resolveDependencyToken" | "functionRegistry" | "onFunctionOverride">): DataGridFormulaFieldExplainResult;
|
|
14
|
+
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/syntax/analysis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gCAAgC,EAGhC,4BAA4B,EAC5B,iCAAiC,EAClC,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EACV,gCAAgC,EAChC,gCAAgC,EAChC,sCAAsC,EACtC,0BAA0B,EAC1B,4BAA4B,EAC5B,iCAAiC,GAClC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACV,6BAA6B,EAE7B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,+BAA+B,EAC/B,mCAAmC,EACnC,yCAAyC,EACzC,4BAA4B,EAC5B,6BAA6B,EAC7B,qCAAqC,EACrC,6BAA6B,EAC7B,8BAA8B,EAC9B,wBAAwB,EACxB,gCAAgC,EAChC,iCAAiC,EACjC,8BAA8B,EAC9B,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,GAChC,MAAM,qBAAqB,CAAA;AAU5B,YAAY,EACV,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,iCAAiC,EACjC,+BAA+B,EAC/B,uBAAuB,EACvB,+BAA+B,EAC/B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAwHnB,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,IAAI,CAAC,6BAA6B,EAAE,wBAAwB,CAAM,GAC1E,0BAA0B,CAK5B;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,IAAI,CAAC,6BAA6B,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,wBAAwB,CAAM,GACtH,gCAAgC,CAalC;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,IAAI,CAAC,6BAA6B,EAAE,wBAAwB,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,wBAAwB,CAAM,GACjJ,4BAA4B,CAyB9B;AAED,wBAAgB,qCAAqC,CACnD,UAAU,EAAE;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,EACD,OAAO,GAAE,IAAI,CAAC,6BAA6B,EAAE,wBAAwB,GAAG,kBAAkB,GAAG,oBAAoB,CAAM,GACtH,iCAAiC,CASnC"}
|