@oasys/oecs 0.3.0 → 0.4.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/README.md +196 -267
- package/dist/array-CxbPyiHO.cjs +1 -0
- package/dist/array-uFR7Q8fU.js +132 -0
- package/dist/core/ecs/access_check.d.ts +77 -0
- package/dist/core/ecs/access_check.d.ts.map +1 -0
- package/dist/core/ecs/archetype.d.ts +474 -0
- package/dist/core/ecs/archetype.d.ts.map +1 -0
- package/dist/core/ecs/builtin_relations.d.ts +43 -0
- package/dist/core/ecs/builtin_relations.d.ts.map +1 -0
- package/dist/core/ecs/command_log.d.ts +113 -0
- package/dist/core/ecs/command_log.d.ts.map +1 -0
- package/dist/core/ecs/component.d.ts +106 -0
- package/dist/core/ecs/component.d.ts.map +1 -0
- package/dist/core/ecs/compute_backend.d.ts +37 -0
- package/dist/core/ecs/compute_backend.d.ts.map +1 -0
- package/dist/core/ecs/dispatch_trace.d.ts +93 -0
- package/dist/core/ecs/dispatch_trace.d.ts.map +1 -0
- package/dist/core/ecs/ecs.d.ts +533 -0
- package/dist/core/ecs/ecs.d.ts.map +1 -0
- package/dist/core/ecs/ecs_memory.d.ts +179 -0
- package/dist/core/ecs/ecs_memory.d.ts.map +1 -0
- package/dist/core/ecs/entity.d.ts +28 -0
- package/dist/core/ecs/entity.d.ts.map +1 -0
- package/dist/core/ecs/event.d.ts +54 -0
- package/dist/core/ecs/event.d.ts.map +1 -0
- package/dist/core/ecs/frame_trace.d.ts +133 -0
- package/dist/core/ecs/frame_trace.d.ts.map +1 -0
- package/dist/core/ecs/host_commands.d.ts +252 -0
- package/dist/core/ecs/host_commands.d.ts.map +1 -0
- package/dist/core/ecs/index.d.ts +41 -0
- package/dist/core/ecs/index.d.ts.map +1 -0
- package/dist/core/ecs/observer.d.ts +142 -0
- package/dist/core/ecs/observer.d.ts.map +1 -0
- package/dist/core/ecs/query.d.ts +557 -0
- package/dist/core/ecs/query.d.ts.map +1 -0
- package/dist/core/ecs/ref.d.ts +31 -0
- package/dist/core/ecs/ref.d.ts.map +1 -0
- package/dist/core/ecs/relation.d.ts +231 -0
- package/dist/core/ecs/relation.d.ts.map +1 -0
- package/dist/core/ecs/resource.d.ts +33 -0
- package/dist/core/ecs/resource.d.ts.map +1 -0
- package/dist/core/ecs/resume.d.ts +85 -0
- package/dist/core/ecs/resume.d.ts.map +1 -0
- package/dist/core/ecs/run_condition.d.ts +75 -0
- package/dist/core/ecs/run_condition.d.ts.map +1 -0
- package/dist/core/ecs/schedule.d.ts +133 -0
- package/dist/core/ecs/schedule.d.ts.map +1 -0
- package/dist/core/ecs/sparse_store.d.ts +107 -0
- package/dist/core/ecs/sparse_store.d.ts.map +1 -0
- package/dist/core/ecs/store.d.ts +1149 -0
- package/dist/core/ecs/store.d.ts.map +1 -0
- package/dist/core/ecs/store_layout_listener.d.ts +23 -0
- package/dist/core/ecs/store_layout_listener.d.ts.map +1 -0
- package/dist/core/ecs/system.d.ts +134 -0
- package/dist/core/ecs/system.d.ts.map +1 -0
- package/dist/core/ecs/utils/arrays.d.ts +7 -0
- package/dist/core/ecs/utils/arrays.d.ts.map +1 -0
- package/dist/core/ecs/utils/constants.d.ts +12 -0
- package/dist/core/ecs/utils/constants.d.ts.map +1 -0
- package/dist/core/ecs/utils/error.d.ts +51 -0
- package/dist/core/ecs/utils/error.d.ts.map +1 -0
- package/dist/core/reactive/array.d.ts +24 -0
- package/dist/core/reactive/array.d.ts.map +1 -0
- package/dist/core/reactive/index.cjs +1 -0
- package/dist/core/reactive/index.d.ts +10 -0
- package/dist/core/reactive/index.d.ts.map +1 -0
- package/dist/core/reactive/index.js +17 -0
- package/dist/core/reactive/interop.d.ts +19 -0
- package/dist/core/reactive/interop.d.ts.map +1 -0
- package/dist/core/reactive/kernel.d.ts +71 -0
- package/dist/core/reactive/kernel.d.ts.map +1 -0
- package/dist/core/reactive/map.d.ts +16 -0
- package/dist/core/reactive/map.d.ts.map +1 -0
- package/dist/core/reactive/struct.d.ts +10 -0
- package/dist/core/reactive/struct.d.ts.map +1 -0
- package/dist/core/store/__generated__/abi.d.ts +43 -0
- package/dist/core/store/__generated__/abi.d.ts.map +1 -0
- package/dist/core/store/action_ring.d.ts +136 -0
- package/dist/core/store/action_ring.d.ts.map +1 -0
- package/dist/core/store/allocator.d.ts +238 -0
- package/dist/core/store/allocator.d.ts.map +1 -0
- package/dist/core/store/buffer_backed_column.d.ts +69 -0
- package/dist/core/store/buffer_backed_column.d.ts.map +1 -0
- package/dist/core/store/column_store.d.ts +265 -0
- package/dist/core/store/column_store.d.ts.map +1 -0
- package/dist/core/store/command_dispatch.d.ts +52 -0
- package/dist/core/store/command_dispatch.d.ts.map +1 -0
- package/dist/core/store/command_ring.d.ts +107 -0
- package/dist/core/store/command_ring.d.ts.map +1 -0
- package/dist/core/store/descriptor.d.ts +80 -0
- package/dist/core/store/descriptor.d.ts.map +1 -0
- package/dist/core/store/entity_index.d.ts +108 -0
- package/dist/core/store/entity_index.d.ts.map +1 -0
- package/dist/core/store/event_ring.d.ts +95 -0
- package/dist/core/store/event_ring.d.ts.map +1 -0
- package/dist/core/store/extend.d.ts +109 -0
- package/dist/core/store/extend.d.ts.map +1 -0
- package/dist/core/store/grow.d.ts +39 -0
- package/dist/core/store/grow.d.ts.map +1 -0
- package/dist/core/store/header.d.ts +64 -0
- package/dist/core/store/header.d.ts.map +1 -0
- package/dist/core/store/index.d.ts +16 -0
- package/dist/core/store/index.d.ts.map +1 -0
- package/dist/core/store/region_table.d.ts +74 -0
- package/dist/core/store/region_table.d.ts.map +1 -0
- package/dist/core/store/snapshot.d.ts +43 -0
- package/dist/core/store/snapshot.d.ts.map +1 -0
- package/dist/core/store/state_hash.d.ts +38 -0
- package/dist/core/store/state_hash.d.ts.map +1 -0
- package/dist/core/store/store_regions.d.ts +38 -0
- package/dist/core/store/store_regions.d.ts.map +1 -0
- package/dist/extensions/editor/editor.d.ts +149 -0
- package/dist/extensions/editor/editor.d.ts.map +1 -0
- package/dist/extensions/editor/field_handle.d.ts +35 -0
- package/dist/extensions/editor/field_handle.d.ts.map +1 -0
- package/dist/extensions/editor/index.cjs +1 -0
- package/dist/extensions/editor/index.d.ts +21 -0
- package/dist/extensions/editor/index.d.ts.map +1 -0
- package/dist/extensions/editor/index.js +209 -0
- package/dist/extensions/reactive/ecs_sync.d.ts +210 -0
- package/dist/extensions/reactive/ecs_sync.d.ts.map +1 -0
- package/dist/extensions/reactive/index.cjs +1 -0
- package/dist/extensions/reactive/index.d.ts +23 -0
- package/dist/extensions/reactive/index.d.ts.map +1 -0
- package/dist/extensions/reactive/index.js +225 -0
- package/dist/extensions/solid/index.cjs +1 -0
- package/dist/extensions/solid/index.d.ts +6 -0
- package/dist/extensions/solid/index.d.ts.map +1 -0
- package/dist/extensions/solid/index.js +32 -0
- package/dist/extensions/solid/kernel_solid.d.ts +42 -0
- package/dist/extensions/solid/kernel_solid.d.ts.map +1 -0
- package/dist/index.cjs +2 -1
- package/dist/index.d.ts +16 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8563 -1233
- package/dist/interop-CT-REx0W.cjs +1 -0
- package/dist/interop-CcY6ASQc.js +18 -0
- package/dist/kernel-DgyrLFjW.js +227 -0
- package/dist/kernel-yWV3XnAb.cjs +1 -0
- package/dist/log/console_sink.d.ts +4 -0
- package/dist/log/console_sink.d.ts.map +1 -0
- package/dist/log/index.d.ts +3 -0
- package/dist/log/index.d.ts.map +1 -0
- package/dist/log/logger.d.ts +27 -0
- package/dist/log/logger.d.ts.map +1 -0
- package/dist/primitives.cjs +1 -0
- package/dist/primitives.d.ts +18 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +44 -0
- package/dist/shared-BXSZnxx4.cjs +1 -0
- package/dist/shared-C678TAPY.js +99 -0
- package/dist/shared.cjs +1 -0
- package/dist/shared.d.ts +22 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +7 -0
- package/dist/topological_sort-DlRpSrxu.js +391 -0
- package/dist/topological_sort-WAT-VHb-.cjs +1 -0
- package/dist/type_primitives/assertions.d.ts +12 -8
- package/dist/type_primitives/assertions.d.ts.map +1 -1
- package/dist/type_primitives/binary_heap/binary_heap.d.ts +6 -2
- package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
- package/dist/type_primitives/bitset/bitset.d.ts +16 -4
- package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
- package/dist/type_primitives/brand.d.ts +6 -1
- package/dist/type_primitives/brand.d.ts.map +1 -1
- package/dist/type_primitives/error.d.ts +4 -0
- package/dist/type_primitives/error.d.ts.map +1 -1
- package/dist/type_primitives/index.d.ts +3 -0
- package/dist/type_primitives/index.d.ts.map +1 -1
- package/dist/type_primitives/sparse_map/sparse_map.d.ts +7 -3
- package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
- package/dist/type_primitives/sparse_set/sparse_set.d.ts +4 -0
- package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
- package/dist/type_primitives/topological_sort/topological_sort.d.ts +7 -3
- package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
- package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +53 -16
- package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
- package/dist/utils/arrays.d.ts +1 -1
- package/dist/utils/arrays.d.ts.map +1 -1
- package/dist/utils/error.d.ts +2 -20
- package/dist/utils/error.d.ts.map +1 -1
- package/package.json +36 -9
- package/dist/archetype.d.ts +0 -101
- package/dist/archetype.d.ts.map +0 -1
- package/dist/component.d.ts +0 -45
- package/dist/component.d.ts.map +0 -1
- package/dist/ecs.d.ts +0 -104
- package/dist/ecs.d.ts.map +0 -1
- package/dist/entity.d.ts +0 -11
- package/dist/entity.d.ts.map +0 -1
- package/dist/event.d.ts +0 -30
- package/dist/event.d.ts.map +0 -1
- package/dist/query.d.ts +0 -90
- package/dist/query.d.ts.map +0 -1
- package/dist/ref.d.ts +0 -23
- package/dist/ref.d.ts.map +0 -1
- package/dist/resource.d.ts +0 -23
- package/dist/resource.d.ts.map +0 -1
- package/dist/schedule.d.ts +0 -45
- package/dist/schedule.d.ts.map +0 -1
- package/dist/store.d.ts +0 -118
- package/dist/store.d.ts.map +0 -1
- package/dist/system.d.ts +0 -16
- package/dist/system.d.ts.map +0 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Brand, TypedArrayTag } from '../../type_primitives';
|
|
2
|
+
import { ComponentSchema } from './component';
|
|
3
|
+
/** Sparse-component handle id. A separate id space from `ComponentID` — it
|
|
4
|
+
* indexes `Store`'s `sparseStores`, never the archetype mask, which is the
|
|
5
|
+
* mechanism by which sparse components escape the 128-bit identity cap. */
|
|
6
|
+
export type SparseComponentID = Brand<number, "sparse_component_id">;
|
|
7
|
+
declare const __sparseSchema: unique symbol;
|
|
8
|
+
export type SparseComponentDef<S extends ComponentSchema = ComponentSchema> = SparseComponentID & {
|
|
9
|
+
readonly [__sparseSchema]: S;
|
|
10
|
+
};
|
|
11
|
+
/** One sparse component's membership + data. Pure data structure — the `Store`
|
|
12
|
+
* owns liveness checks and dev-mode error throwing; this class only knows
|
|
13
|
+
* entity indices and field rows. */
|
|
14
|
+
export declare class SparseComponentStore {
|
|
15
|
+
/** entity index → field-value row (length = field count; `[]` for a tag). */
|
|
16
|
+
private readonly _data;
|
|
17
|
+
readonly fieldNames: string[];
|
|
18
|
+
readonly fieldTypes: TypedArrayTag[];
|
|
19
|
+
readonly fieldIndex: Record<string, number>;
|
|
20
|
+
constructor(fieldNames: string[], fieldTypes: TypedArrayTag[]);
|
|
21
|
+
/** Number of entities holding this sparse component. */
|
|
22
|
+
get size(): number;
|
|
23
|
+
/** Live entity indices that hold this component (dense, iteration order is
|
|
24
|
+
* SparseMap insertion/swap order — NOT canonical). Used by the hot query
|
|
25
|
+
* integration path (#469); for the determinism surface use
|
|
26
|
+
* `canonicalIndices` instead. */
|
|
27
|
+
get indices(): readonly number[];
|
|
28
|
+
/** Live entity indices in **canonical** (ascending) order — the determinism
|
|
29
|
+
* ordering for `stateHash` + snapshot/restore (ADR-0011, #470). The native
|
|
30
|
+
* `indices` getter is insertion/swap order and would make two worlds with
|
|
31
|
+
* identical contents reached by different add/remove histories diverge, so
|
|
32
|
+
* the cold determinism paths sort here. Allocates a sorted copy each call;
|
|
33
|
+
* never call it on the hot query path. Indices are 20-bit entity indices,
|
|
34
|
+
* so the subtraction comparator can't overflow. */
|
|
35
|
+
canonicalIndices(): number[];
|
|
36
|
+
/** The field-value row for `index` (length = field count; `[]` for a tag),
|
|
37
|
+
* or `undefined` if `index` isn't a member. Read-only view for the
|
|
38
|
+
* determinism paths (`stateHash`, snapshot); mutate via `setField`. */
|
|
39
|
+
getRow(index: number): readonly number[] | undefined;
|
|
40
|
+
/** Drop all membership + data. Restore path only — `restoreSparseStores`
|
|
41
|
+
* repopulates a cleared store from snapshot bytes. */
|
|
42
|
+
clear(): void;
|
|
43
|
+
/** Insert the positional field-value `row` for `index`, taking ownership of
|
|
44
|
+
* the array. Restore path only; bypasses the name→index mapping `setRow`
|
|
45
|
+
* does, because snapshot bytes are already positional. */
|
|
46
|
+
setRawRow(index: number, row: number[]): void;
|
|
47
|
+
has(index: number): boolean;
|
|
48
|
+
/** Insert or overwrite the row for `index`, building it from `values`.
|
|
49
|
+
* Fields absent from `values` default to 0; a tag stores `[]`. */
|
|
50
|
+
setRow(index: number, values: Record<string, number>): void;
|
|
51
|
+
/** Drop `index`'s membership + data. Returns whether it was present. */
|
|
52
|
+
remove(index: number): boolean;
|
|
53
|
+
/** Read one field, or `undefined` if `index` doesn't hold this component. */
|
|
54
|
+
getField(index: number, fieldIdx: number): number | undefined;
|
|
55
|
+
/** Write one field. Returns `false` (no-op) if `index` isn't a member. */
|
|
56
|
+
setField(index: number, fieldIdx: number, value: number): boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare class SparseRestoreError extends Error {
|
|
59
|
+
constructor(message: string);
|
|
60
|
+
}
|
|
61
|
+
/** Serialize a registry of sparse stores into a self-contained byte buffer —
|
|
62
|
+
* the **sparse half** of a world snapshot (the dense half is the SAB snapshot,
|
|
63
|
+
* `snapshotColumnStore`). Members are emitted in canonical (ascending
|
|
64
|
+
* entity-index) order so the bytes are independent of insertion / removal
|
|
65
|
+
* history: two worlds with identical sparse contents reached by different
|
|
66
|
+
* mutation orders serialize byte-for-byte the same (#470).
|
|
67
|
+
*
|
|
68
|
+
* Layout (all integers little-endian, to match the dense SAB snapshot and stay
|
|
69
|
+
* architecture-independent):
|
|
70
|
+
*
|
|
71
|
+
* u32 storeCount
|
|
72
|
+
* repeat storeCount times:
|
|
73
|
+
* u32 fieldCount
|
|
74
|
+
* u32 schemaHash
|
|
75
|
+
* u32 memberCount
|
|
76
|
+
* repeat memberCount times (canonical entity-index order):
|
|
77
|
+
* u32 entityIndex
|
|
78
|
+
* f64 × fieldCount (the positional field row; none for a tag)
|
|
79
|
+
*
|
|
80
|
+
* `fieldCount` is redundant with the registered schema but is written so
|
|
81
|
+
* `restoreSparseStores` can reject a snapshot whose shape doesn't match the
|
|
82
|
+
* stores it's restoring into; `schemaHash` (a `schemaFingerprint` over the
|
|
83
|
+
* field names + types) goes further and rejects a buffer whose shape matches
|
|
84
|
+
* field-for-field but whose field **identity** doesn't (#494). */
|
|
85
|
+
export declare function snapshotSparseStores(stores: readonly SparseComponentStore[]): Uint8Array;
|
|
86
|
+
/** Repopulate already-registered sparse stores from `snapshotSparseStores`
|
|
87
|
+
* bytes, giving full-equality round-trip (membership + data). The `stores`
|
|
88
|
+
* registry must already exist with the same shape the snapshot was taken from
|
|
89
|
+
* — restore replays data into a world whose sparse components are registered
|
|
90
|
+
* in the same order (the registration is code, not snapshot state). Each store
|
|
91
|
+
* is cleared first, so restoring is idempotent and drops any pre-existing rows.
|
|
92
|
+
*
|
|
93
|
+
* Throws `SparseRestoreError` on any shape or identity mismatch (store count,
|
|
94
|
+
* field count, schema-hash field identity, an entity index past `MAX_INDEX`,
|
|
95
|
+
* or a truncated / over-long buffer) rather than silently corrupting state.
|
|
96
|
+
* The index bound matters because the index keys a `SparseMap` whose backing
|
|
97
|
+
* array grows to `index` length — an unvalidated crafted u32 (up to ~4.29e9)
|
|
98
|
+
* would allocate multi-GB (#494). */
|
|
99
|
+
export declare function restoreSparseStores(stores: readonly SparseComponentStore[], bytes: Uint8Array): void;
|
|
100
|
+
/** Read-only validation of a `snapshotSparseStores` buffer against the live
|
|
101
|
+
* registry, WITHOUT mutating any store (#789). Mirrors `restoreSparseStores`'s
|
|
102
|
+
* shape/field-identity/index-bounds/frame checks so `Store.restoreInto` can fail
|
|
103
|
+
* closed on a sparse-registration mismatch BEFORE the dense mount overwrites live
|
|
104
|
+
* column data. Throws `SparseRestoreError` on any mismatch / malformed buffer. */
|
|
105
|
+
export declare function validateSparseStores(stores: readonly SparseComponentStore[], bytes: Uint8Array): void;
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=sparse_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparse_store.d.ts","sourceRoot":"","sources":["../../../src/core/ecs/sparse_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;KA0BK;AAEL,OAAO,EAAE,KAAK,EAAa,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;2EAE2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAOrE,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAE5C,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI,iBAAiB,GAAG;IACjG,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;CAC7B,CAAC;AAEF;;oCAEoC;AACpC,qBAAa,oBAAoB;IAChC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,SAAgB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrC,SAAgB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5C,SAAgB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEvC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE;IAQ7D,wDAAwD;IACxD,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;qCAGiC;IACjC,IAAW,OAAO,IAAI,SAAS,MAAM,EAAE,CAEtC;IAED;;;;;;uDAMmD;IAC5C,gBAAgB,IAAI,MAAM,EAAE;IAInC;;2EAEuE;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS;IAI3D;0DACsD;IAC/C,KAAK,IAAI,IAAI;IAIpB;;8DAE0D;IACnD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAI7C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIlC;sEACkE;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAUlE,wEAAwE;IACjE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIrC,6EAA6E;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKpE,0EAA0E;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;CAMxE;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI3B;AAuCD;;;;;;;;;;;;;;;;;;;;;;;kEAuBkE;AAClE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,GAAG,UAAU,CAuCxF;AAED;;;;;;;;;;;;qCAYqC;AACrC,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,SAAS,oBAAoB,EAAE,EACvC,KAAK,EAAE,UAAU,GACf,IAAI,CAkEN;AAED;;;;kFAIkF;AAClF,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,SAAS,oBAAoB,EAAE,EACvC,KAAK,EAAE,UAAU,GACf,IAAI,CA4DN"}
|