@mocanvas/store 4.0.2 → 4.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.
- package/ARCHITECTURE.md +8 -2
- package/MIGRATION.md +46 -22
- package/UI.md +24 -2
- package/dist/index.d.ts +13 -3
- package/dist/index.js +48 -13
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/ARCHITECTURE.md
CHANGED
|
@@ -18,9 +18,15 @@ document model, tools, and UI live in TypeScript.
|
|
|
18
18
|
|
|
19
19
|
## Non-goals (v1)
|
|
20
20
|
|
|
21
|
-
- Wire compatibility with tldraw's sync protocol.
|
|
22
|
-
|
|
21
|
+
- Wire compatibility with tldraw's sync protocol. `@mocanvas/sync` is a
|
|
22
|
+
transport of its own; it does not speak tldraw's wire format.
|
|
23
23
|
- Pixel-identical rendering of every built-in shape.
|
|
24
|
+
- Shipping message catalogues. The translation seam exists
|
|
25
|
+
(`TLUiOverrides.translations`); the strings are the host's.
|
|
26
|
+
|
|
27
|
+
Slot-compatible UI components were a non-goal here and are no longer: the
|
|
28
|
+
`TLComponents` and `TLUiOverrides` surfaces are implemented. See
|
|
29
|
+
[MIGRATION.md §7](MIGRATION.md).
|
|
24
30
|
|
|
25
31
|
## Clean-room rule
|
|
26
32
|
|
package/MIGRATION.md
CHANGED
|
@@ -10,7 +10,8 @@ The short version: your **documents, records, ids and `.tldr` files carry over
|
|
|
10
10
|
untouched**, most of your **`Editor` calls carry over untouched**, your
|
|
11
11
|
**`ShapeUtil` / `StateNode` / `BindingUtil` subclasses keep their shape**, and
|
|
12
12
|
the real work is (a) imports, (b) teaching custom shapes about the GPU
|
|
13
|
-
renderer, and (c)
|
|
13
|
+
renderer, and (c) UI, where the slots are compatible but the message
|
|
14
|
+
catalogues are yours to supply (§7).
|
|
14
15
|
|
|
15
16
|
---
|
|
16
17
|
|
|
@@ -237,6 +238,21 @@ the `export * from "@mocanvas/mocanvas"` at the top of the package.
|
|
|
237
238
|
Everything `@mocanvas/editor` exports is re-exported by `@mocanvas/mocanvas`, so in app
|
|
238
239
|
code you can import from `@mocanvas/mocanvas` alone.
|
|
239
240
|
|
|
241
|
+
### Step 1b — the stylesheet
|
|
242
|
+
|
|
243
|
+
| Old import | New import |
|
|
244
|
+
| ------------------------ | --------------------------------- |
|
|
245
|
+
| `"tldraw/tldraw.css"` | `"@mocanvas/mocanvas/mocanvas.css"` |
|
|
246
|
+
|
|
247
|
+
Same arrangement, same one line, wherever you had it. The default UI is
|
|
248
|
+
unstyled without it.
|
|
249
|
+
|
|
250
|
+
`@mocanvas/compat` does not re-export the stylesheet — a package can only
|
|
251
|
+
export files it contains — so this import names `@mocanvas/mocanvas` even
|
|
252
|
+
during the zero-rename step. Under pnpm's strict `node_modules` that means
|
|
253
|
+
adding `@mocanvas/mocanvas` to your own dependencies alongside
|
|
254
|
+
`@mocanvas/compat`.
|
|
255
|
+
|
|
240
256
|
### Step 2 — drop the prefixes
|
|
241
257
|
|
|
242
258
|
Once the app builds and runs against `@mocanvas/compat`, rename `TLFoo` →
|
|
@@ -499,26 +515,35 @@ returns both and `putContentOntoCurrentPage` accepts both.
|
|
|
499
515
|
|
|
500
516
|
## 7. UI
|
|
501
517
|
|
|
502
|
-
**
|
|
503
|
-
|
|
518
|
+
**Slot compatibility exists.** This section used to say it did not and that it
|
|
519
|
+
was a v1 non-goal; both stopped being true before 4.0. Your existing overrides
|
|
520
|
+
of tldraw's UI components are the shape mocanvas expects.
|
|
504
521
|
|
|
505
522
|
What you have:
|
|
506
523
|
|
|
507
|
-
- `
|
|
508
|
-
|
|
509
|
-
- `
|
|
510
|
-
|
|
524
|
+
- `components` — the `TLComponents` map, at both the canvas level and the
|
|
525
|
+
chrome level. Pass a component to replace a slot, `null` to remove it.
|
|
526
|
+
- `overrides` — `TLUiOverrides`, with `tools`, `actions` and `translations`.
|
|
527
|
+
The tool and action lists are what the toolbar, the menus and the keyboard
|
|
528
|
+
bindings are all built from, so rewriting an entry changes all three
|
|
529
|
+
together rather than only what is drawn.
|
|
530
|
+
- The default chrome as named exports — `TldrawUi`, `DefaultUi`,
|
|
531
|
+
`DefaultToolbar`, `DefaultMainMenu` and the rest — so you can render one
|
|
532
|
+
piece of it inside chrome of your own.
|
|
533
|
+
- `useTools()` and `useActions()` return those lists after overrides, which is
|
|
534
|
+
what a toolbar of your own should render from.
|
|
535
|
+
- `hideUi` on `<Mocanvas />` still turns the chrome off entirely, leaving you
|
|
536
|
+
the canvas and your `children`.
|
|
511
537
|
- `useEditor()` inside any descendant of `<Canvas>` / `<EditorProvider>`
|
|
512
538
|
returns the `Editor` (`useMaybeEditor()` returns `Editor | null`).
|
|
513
539
|
- `track(Component)` and `useValue` from `@mocanvas/state/react` — re-exported
|
|
514
|
-
from `@mocanvas/editor` and `@mocanvas/mocanvas` — make a component re-render
|
|
515
|
-
signals it reads change.
|
|
540
|
+
from `@mocanvas/editor` and `@mocanvas/mocanvas` — make a component re-render
|
|
541
|
+
when the signals it reads change.
|
|
516
542
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
components.
|
|
543
|
+
One real difference remains: mocanvas ships **no message catalogues**, so
|
|
544
|
+
`overrides.translations` is where UI strings come from. The language menu lists
|
|
545
|
+
only the locales you supply a non-empty dictionary for, and renders nothing at
|
|
546
|
+
all if you supply none — see the note in `UI.md`.
|
|
522
547
|
|
|
523
548
|
---
|
|
524
549
|
|
|
@@ -626,19 +651,18 @@ before.
|
|
|
626
651
|
|
|
627
652
|
## 10. Known gaps
|
|
628
653
|
|
|
629
|
-
|
|
630
|
-
the
|
|
654
|
+
Every row below was re-checked against the built package rather than carried
|
|
655
|
+
forward from the roadmap. Rows that used to sit here and no longer belong —
|
|
656
|
+
`editor.resizeShape` and `stretchShapes`, `editor.getSvgString` and `toImage`,
|
|
657
|
+
`editor.textMeasure`/`user`/`menus`, presence records, and slot-compatible UI —
|
|
658
|
+
are all present, and the entries claiming otherwise were stale rather than
|
|
659
|
+
aspirational.
|
|
631
660
|
|
|
632
661
|
| Gap | Status |
|
|
633
662
|
| --- | ------ |
|
|
634
|
-
| `editor.resizeShape`, `editor.stretchShapes` | phase 3. Interactive resize lives in the select tool; `ShapeUtil.onResize` and `BaseBoxShapeUtil` work, but there is no imperative resize entry point on `Editor`. |
|
|
635
|
-
| `editor.getSvgString`, `editor.toImage` | Not `Editor` methods. Export is a set of free functions in `@mocanvas/mocanvas`: `getSvgString(editor, ids?, opts?)`, `exportToBlob(editor, opts)`, `downloadBlob(blob, filename)`, `copyBlobToClipboard(blob)`. |
|
|
636
663
|
| `ShapeUtil.toSvg`, `ShapeUtil.toBackgroundSvg` | Not `ShapeUtil` members. Custom shapes contribute to SVG export through `registerShapeSvgRenderer(type, renderer)`; without one they fall back to `geometryFallbackSvg`. |
|
|
637
|
-
|
|
|
638
|
-
| Sync protocol | Explicit v1 non-goal. Wire compatibility with tldraw's sync protocol is not planned for v1. |
|
|
639
|
-
| Slot-compatible UI | Explicit v1 non-goal. See §7. |
|
|
664
|
+
| Sync protocol | Wire compatibility with tldraw's own sync protocol is not planned. `@mocanvas/sync` is a working transport of its own — presence records, `store.mergeRemoteChanges`, and a relay — but it does not speak tldraw's wire format. |
|
|
640
665
|
| `image` shape on the GPU | The texture path exists in the engine (`StyleWords.texture` + `uploadTexture`) but the `image` shape still draws an `<img>` in the DOM overlay. |
|
|
641
|
-
| `editor.textMeasure`, `editor.user`, `editor.menus` | Not implemented. Text measurement is DOM-backed inside the text layer; `editor.inputs` and `editor.sideEffects` do exist. |
|
|
642
666
|
| Text rendering | DOM overlay. Glyph-atlas text in WASM is phase 3. |
|
|
643
667
|
| GPU frame clipping | The `CLIP` flag and `isClipShape` hook are wired end to end, but no built-in shape enables it yet (phase 3). |
|
|
644
668
|
| WebGPU backend | Phase 3. WebGL2 is the only backend today, behind `RenderBackend`. |
|
package/UI.md
CHANGED
|
@@ -4,6 +4,27 @@
|
|
|
4
4
|
style panel, an optional statistics chip, and the chrome the editor draws on the
|
|
5
5
|
canvas itself. All of it is optional and all of it is themeable from CSS.
|
|
6
6
|
|
|
7
|
+
## Loading the stylesheet
|
|
8
|
+
|
|
9
|
+
The theme is published as `@mocanvas/mocanvas/mocanvas.css` and your app
|
|
10
|
+
imports it:
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import "@mocanvas/mocanvas/mocanvas.css"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The package's JavaScript entry does not import it. That is deliberate: Node has
|
|
17
|
+
no loader for `.css`, so a CSS import inside `dist/index.js` makes
|
|
18
|
+
`import "@mocanvas/mocanvas"` throw `ERR_UNKNOWN_FILE_EXTENSION` anywhere there
|
|
19
|
+
is no bundler — vitest, SSR, a plain script. Up to and including 4.0.2 it did,
|
|
20
|
+
and the emitted file was content-hashed (`dist/ui-4C5V5GYT.css`) so there was no
|
|
21
|
+
stable name to import instead. Both are fixed; the cost is this one line in your
|
|
22
|
+
app.
|
|
23
|
+
|
|
24
|
+
`<Canvas />` from `@mocanvas/editor` carries fallback values for the canvas
|
|
25
|
+
chrome tokens, so an editor mounted without the stylesheet still renders
|
|
26
|
+
legibly — but the toolbar, panels, menus and dialogs need it.
|
|
27
|
+
|
|
7
28
|
Source lives in `packages/mocanvas/src/ui/`:
|
|
8
29
|
|
|
9
30
|
| File | What it holds |
|
|
@@ -122,8 +143,9 @@ so inline marks like the "mixed" badge keep the size they ask for.
|
|
|
122
143
|
<Mocanvas hideUi />
|
|
123
144
|
```
|
|
124
145
|
|
|
125
|
-
This drops the toolbar, zoom bar, style panel and stats chip.
|
|
126
|
-
|
|
146
|
+
This drops the toolbar, zoom bar, style panel and stats chip. The stylesheet is
|
|
147
|
+
imported by your app, not by the component, so the canvas chrome tokens above
|
|
148
|
+
keep working. Default keyboard
|
|
127
149
|
shortcuts are wired by `<Mocanvas />` itself and are unaffected; call
|
|
128
150
|
`useKeyboardShortcuts(editor)` yourself if you build on `<Canvas />` directly.
|
|
129
151
|
|
package/dist/index.d.ts
CHANGED
|
@@ -816,11 +816,21 @@ declare class StoreSchema<R extends UnknownRecord, Props = unknown> {
|
|
|
816
816
|
/** Scope of a record type; unknown types are treated as `document`. */
|
|
817
817
|
getScope(typeName: string): RecordScope;
|
|
818
818
|
/**
|
|
819
|
-
* Validate a record, delegating to its record type's validator.
|
|
820
|
-
*
|
|
821
|
-
*
|
|
819
|
+
* Validate a record, delegating to its record type's validator.
|
|
820
|
+
*
|
|
821
|
+
* Two things are checked before the delegation. First, the value has to be a
|
|
822
|
+
* record at all: an object with a string `id` and a string `typeName`.
|
|
823
|
+
* Without that check a value carrying no `typeName` looks up `undefined` in
|
|
824
|
+
* the type map, misses, and takes the unknown-type path below — which is how
|
|
825
|
+
* `store.put([{ id: "shape:bogus", x: 0, y: 0 }])` used to be accepted.
|
|
826
|
+
*
|
|
827
|
+
* Second, a record whose `typeName` this schema does not know is passed
|
|
828
|
+
* through untouched, so foreign data survives a load/save round-trip. That
|
|
829
|
+
* is the escape hatch; it is not meant to cover malformed input, hence the
|
|
830
|
+
* first check.
|
|
822
831
|
*/
|
|
823
832
|
validateRecord(store: Store<R, any>, record: R, phase: StoreValidationPhase, recordBefore: R | undefined): R;
|
|
833
|
+
private onFailure;
|
|
824
834
|
/** The current version of every sequence. Always the v2 shape — mocanvas never writes v1. */
|
|
825
835
|
serialize(): SerializedSchemaV2;
|
|
826
836
|
/** A schema at version 0 of every sequence (all migrations still pending). */
|
package/dist/index.js
CHANGED
|
@@ -435,28 +435,51 @@ var StoreSchema = class _StoreSchema {
|
|
|
435
435
|
return this.typeByName.get(typeName)?.scope ?? "document";
|
|
436
436
|
}
|
|
437
437
|
/**
|
|
438
|
-
* Validate a record, delegating to its record type's validator.
|
|
439
|
-
*
|
|
440
|
-
*
|
|
438
|
+
* Validate a record, delegating to its record type's validator.
|
|
439
|
+
*
|
|
440
|
+
* Two things are checked before the delegation. First, the value has to be a
|
|
441
|
+
* record at all: an object with a string `id` and a string `typeName`.
|
|
442
|
+
* Without that check a value carrying no `typeName` looks up `undefined` in
|
|
443
|
+
* the type map, misses, and takes the unknown-type path below — which is how
|
|
444
|
+
* `store.put([{ id: "shape:bogus", x: 0, y: 0 }])` used to be accepted.
|
|
445
|
+
*
|
|
446
|
+
* Second, a record whose `typeName` this schema does not know is passed
|
|
447
|
+
* through untouched, so foreign data survives a load/save round-trip. That
|
|
448
|
+
* is the escape hatch; it is not meant to cover malformed input, hence the
|
|
449
|
+
* first check.
|
|
441
450
|
*/
|
|
442
451
|
validateRecord(store, record, phase, recordBefore) {
|
|
452
|
+
if (!isRecordLike(record)) {
|
|
453
|
+
return this.onFailure(
|
|
454
|
+
new Error(
|
|
455
|
+
`Expected a record with a string \`id\` and \`typeName\`, got ${describeRecord(record)}`
|
|
456
|
+
),
|
|
457
|
+
store,
|
|
458
|
+
record,
|
|
459
|
+
phase,
|
|
460
|
+
recordBefore
|
|
461
|
+
);
|
|
462
|
+
}
|
|
443
463
|
const type = this.typeByName.get(record.typeName);
|
|
444
464
|
if (!type) return record;
|
|
445
465
|
try {
|
|
446
466
|
return type.validate(record, recordBefore);
|
|
447
467
|
} catch (error) {
|
|
448
|
-
|
|
449
|
-
return this.options.onValidationFailure({
|
|
450
|
-
error,
|
|
451
|
-
store,
|
|
452
|
-
record,
|
|
453
|
-
phase,
|
|
454
|
-
recordBefore: recordBefore ?? null
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
throw error;
|
|
468
|
+
return this.onFailure(error, store, record, phase, recordBefore);
|
|
458
469
|
}
|
|
459
470
|
}
|
|
471
|
+
onFailure(error, store, record, phase, recordBefore) {
|
|
472
|
+
if (this.options.onValidationFailure) {
|
|
473
|
+
return this.options.onValidationFailure({
|
|
474
|
+
error,
|
|
475
|
+
store,
|
|
476
|
+
record,
|
|
477
|
+
phase,
|
|
478
|
+
recordBefore: recordBefore ?? null
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
throw error;
|
|
482
|
+
}
|
|
460
483
|
/** The current version of every sequence. Always the v2 shape — mocanvas never writes v1. */
|
|
461
484
|
serialize() {
|
|
462
485
|
const sequences = {};
|
|
@@ -570,6 +593,18 @@ var StoreSchema = class _StoreSchema {
|
|
|
570
593
|
return { type: "success", value: store };
|
|
571
594
|
}
|
|
572
595
|
};
|
|
596
|
+
function describeRecord(value) {
|
|
597
|
+
if (value === null) return "null";
|
|
598
|
+
if (typeof value !== "object") return typeof value;
|
|
599
|
+
if (Array.isArray(value)) return "an array";
|
|
600
|
+
const { id, typeName } = value;
|
|
601
|
+
const parts = [];
|
|
602
|
+
parts.push(typeof id === "string" ? `id ${JSON.stringify(id)}` : `id ${id === void 0 ? "missing" : typeof id}`);
|
|
603
|
+
parts.push(
|
|
604
|
+
typeof typeName === "string" ? `typeName ${JSON.stringify(typeName)}` : `typeName ${typeName === void 0 ? "missing" : typeof typeName}`
|
|
605
|
+
);
|
|
606
|
+
return `an object with ${parts.join(" and ")}`;
|
|
607
|
+
}
|
|
573
608
|
|
|
574
609
|
// src/query.ts
|
|
575
610
|
function matchesQueryValue(matcher, value) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ids.ts","../src/indexKey.ts","../src/zkey.ts","../src/RecordsDiff.ts","../src/migrate.ts","../src/legacy.ts","../src/StoreSchema.ts","../src/query.ts","../src/Store.ts","../src/tldr.ts","../src/computedCache.ts","../src/devFreeze.ts","../src/storage.ts","../src/graphemes.ts"],"names":["BASE_62","isPlainObject"],"mappings":";;;;;;AAGO,IAAM,gBAAA,GAAmB;AAGzB,SAAS,QAAA,CAAS,OAAe,gBAAA,EAA0B;AAChE,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;AAyEO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAuF;AAAA,EAOlG,WAAA,CACE,UACiB,MAAA,EAGjB;AAHiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAIjB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,EAAG;AAC/D,QAAA,IAAI,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AAAA,EACzB;AAAA,EAfmB,MAAA;AAAA,EARV,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA;AAAA,EAsBT,OAAO,UAAA,EAAoD;AACzD,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,GAAG,IAAA,CAAK,MAAA,CAAO,uBAAA,EAAwB;AAAA,MACvC,GAAI;AAAA,KACN;AACA,IAAA,IAAI,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,SAAkB,IAAI,CAAA,GAAI,KAAK,QAAA,EAAS;AAC7D,IAAA,MAAA,CAAO,UAAU,IAAI,IAAA,CAAK,QAAA;AAC1B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,MAAA,EAAc;AAClB,IAAA,OAAO,EAAE,GAAG,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA,EAGA,SAAS,gBAAA,EAAoC;AAC3C,IAAA,OAAO,GAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,gBAAA,IAAoB,UAAU,CAAA,CAAA;AAAA,EAC3D;AAAA;AAAA,EAGA,QAAQ,EAAA,EAAqB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,GAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IACzE;AACA,IAAA,OAAQ,EAAA,CAAc,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,KAAK,EAAA,EAA4B;AAC/B,IAAA,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,OAAO,KAAA;AACnC,IAAA,IAAI,GAAG,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,GAAG,OAAO,KAAA;AAClD,IAAA,IAAI,GAAG,UAAA,CAAW,IAAA,CAAK,SAAS,MAAM,CAAA,KAAM,IAAc,OAAO,KAAA;AACjE,IAAA,OAAO,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAAA,EACpC;AAAA,EAEA,WAAW,MAAA,EAA+B;AACxC,IAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACV,MAAA,CAAkC,aAAa,IAAA,CAAK,QAAA;AAAA,EAEzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBACE,uBAAA,EACqD;AACrD,IAAA,OAAO,IAAI,WAAA,CAAoD,IAAA,CAAK,QAAA,EAAU;AAAA,MAC5E,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,QAAA,CAAS,QAAiB,YAAA,EAAqB;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,MAAA;AAC5B,IAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,IAAA,CAAK,SAAA,CAAU,6BAAA,EAA+B;AAC9E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,6BAAA,CAA8B,YAAA,EAAc,MAAM,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AAAA,EACvC;AACF;AAWO,SAAS,gBAAA,CACd,UACA,MAAA,EACkC;AAClC,EAAA,OAAO,IAAI,WAAiC,QAAA,EAAU;AAAA,IACpD,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,uBAAA,EAAyB,OAAO,EAAC;AAAA,GAClC,CAAA;AACH;AAGO,SAAS,cAAc,EAAA,EAAsD;AAClF,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,KAAU,EAAA,CAAG,SAAS,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG,UAAA,EAAY,EAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAE;AACzE;AAGO,SAAS,aAAa,KAAA,EAAwC;AACnE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,OAAQ,KAAA,CAA2B,EAAA,KAAO,QAAA,IAC1C,OAAQ,KAAA,CAAiC,QAAA,KAAa,QAAA;AAE1D;AC7MO,IAAM,cAAA,GAAiB;AAE9B,SAAS,aAAA,CAAc,OAA6B,KAAA,EAA6B;AAC/E,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,MAAA,IAAa,EAAE,QAAQ,KAAA,CAAA,EAAQ;AAClE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5G;AACF;AAGO,SAAS,eAAA,CAAgB,OAA8B,KAAA,EAAwC;AACpG,EAAA,aAAA,CAAc,OAAO,KAAK,CAAA;AAC1B,EAAA,OAAO,kBAAA,CAAmB,KAAA,IAAS,IAAA,EAAM,KAAA,IAAS,IAAI,CAAA;AACxD;AAGO,SAAS,cAAc,KAAA,EAAwC;AACpE,EAAA,OAAO,kBAAA,CAAmB,KAAA,IAAS,IAAA,EAAM,IAAI,CAAA;AAC/C;AAGO,SAAS,cAAc,KAAA,EAAwC;AACpE,EAAA,OAAO,kBAAA,CAAmB,IAAA,EAAM,KAAA,IAAS,IAAI,CAAA;AAC/C;AAGO,SAAS,iBAAA,CACd,KAAA,EACA,KAAA,EACA,CAAA,EACY;AACZ,EAAA,aAAA,CAAc,OAAO,KAAK,CAAA;AAC1B,EAAA,OAAO,oBAAA,CAAqB,KAAA,IAAS,IAAA,EAAM,KAAA,IAAS,MAAM,CAAC,CAAA;AAC7D;AAGO,SAAS,eAAA,CAAgB,OAA6B,CAAA,EAAuB;AAClF,EAAA,OAAO,oBAAA,CAAqB,KAAA,IAAS,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AACpD;AAGO,SAAS,eAAA,CAAgB,OAA6B,CAAA,EAAuB;AAClF,EAAA,OAAO,oBAAA,CAAqB,IAAA,EAAM,KAAA,IAAS,IAAA,EAAM,CAAC,CAAA;AACpD;AAMO,SAAS,UAAA,CAAW,CAAA,EAAW,KAAA,GAAkB,cAAA,EAA4B;AAClF,EAAA,IAAI,CAAA,IAAK,CAAA,EAAG,OAAO,EAAC;AACpB,EAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,EAAA,OAAO,CAAC,KAAA,EAAO,GAAG,gBAAgB,KAAA,EAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AACjD;AAGO,SAAS,YAA2C,KAAA,EAA0B;AACnF,EAAA,OAAO,MACJ,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM,CAAC,MAAM,CAAC,CAAU,EACnC,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,EAAE,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,KAAM;AAC1B,IAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,OAAO,EAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAC9B,IAAA,OAAO,EAAA,GAAK,EAAA;AAAA,EACd,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,CAAC,IAAI,MAAM,IAAI,CAAA;AACzB;AAGO,SAAS,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACjE,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClC;AAEA,IAAM,OAAA,GAAU,gEAAA;AAChB,IAAM,QAAA,GAAW,IAAI,UAAA,CAAW,GAAG,CAAA;AACnC,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,CAAA;AAO3E,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,IAAQ,GAAA,EAAK,OAAO,OAAO,EAAA,GAAK,CAAA;AAClD,EAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,IAAQ,EAAA,EAAI,OAAO,KAAK,IAAA,GAAO,CAAA;AACjD,EAAA,OAAO,EAAA;AACT;AAQO,SAAS,iBAAiB,GAAA,EAAsC;AACrE,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAuB;AACnC,IAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,UAAU,GAAG,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EACpE,CAAA;AACA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,MAAA,KAAW,CAAA,OAAQ,OAAO,CAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,UAAA,CAAW,CAAC,CAAC,CAAA;AAClD,EAAA,IAAI,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,iBAAiB,CAAA;AACtC,EAAA,IAAI,IAAI,MAAA,GAAS,MAAA,OAAa,CAAA,mBAAA,EAAsB,MAAA,GAAS,CAAC,CAAA,OAAA,CAAS,CAAA;AACvE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,GAAI,OAAO,QAAA,CAAS,CAAC,MAAM,CAAA,EAAG,IAAA,CAAK,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,IAAU,GAAA,CAAI,SAAS,GAAG,CAAA,OAAQ,oBAAoB,CAAA;AACzE;AAGO,SAAS,WAAW,GAAA,EAA+B;AACxD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,KAAA;AACpC,EAAA,IAAI;AACF,IAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACrGA,IAAMA,QAAAA,GAAU,gEAAA;AAChB,IAAM,KAAA,GAAQ,sDAAA;AAGP,IAAM,uBAAA,GAA0B;AAEvC,IAAM,cAAc,IAAI,SAAA,CAAU,GAAG,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9C,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,QAAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EAAK,WAAA,CAAYA,QAAAA,CAAQ,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,CAAA;AAE9E,IAAM,YAAY,IAAI,SAAA,CAAU,GAAG,CAAA,CAAE,KAAK,EAAE,CAAA;AAC5C,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK,SAAA,CAAU,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,CAAA;AAExE,IAAM,CAAA,GAAI,GAAA;AACV,IAAM,GAAA,GAAM,CAAA,IAAK,MAAA,CAAO,uBAAuB,CAAA;AAC/C,IAAM,OAAA,GAAU,WAAA;AAIT,SAAS,eAAe,GAAA,EAAyC;AACtE,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,mCAAmC,CAAA;AACzE,EAAA,MAAM,WAAW,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,CAAC,CAAC,CAAA,IAAK,EAAA;AACjD,EAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,6BAA6B,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,CAAA;AAEpF,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,GAAG,uBAAuB,CAAA;AAC1D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAI,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,GAAI,CAAC,CAAC,CAAA,IAAK,EAAA;AAChD,IAAA,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,8BAA8B,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,QAAA,GAAW,QAAA,GAAW,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAA,EACpC;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,uBAAA,EAAyB,KAAK,QAAA,IAAY,CAAA;AAE9D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA,GAAM,QAAA;AACvC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,KAAA,IAAS,GAAA,GAAO,OAAO,CAAA;AAC1C,EAAA,OAAO,CAAC,IAAI,EAAE,CAAA;AAChB;AAGO,SAAS,YAAA,CAAa,CAAC,EAAA,EAAI,EAAE,CAAA,EAAiB;AACnD,EAAA,OAAQ,MAAA,CAAO,EAAE,CAAA,IAAK,GAAA,GAAO,OAAO,EAAE,CAAA;AACxC;AAGO,SAAS,YAAA,CAAa,GAAS,CAAA,EAAiB;AACrD,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,EAAA,GAAK,CAAA;AAC7C,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,EAAA,GAAK,CAAA;AAC7C,EAAA,OAAO,CAAA;AACT;;;AChEO,SAAS,sBAAA,GAAkE;AAChF,EAAA,OAAO,EAAE,OAAO,EAAC,EAAG,SAAS,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAC/C;AAEO,SAAS,mBAA4C,IAAA,EAA+B;AACzF,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,EAAO,OAAO,KAAA;AACnC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AACrC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AACrC,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,mBAA4C,IAAA,EAAsC;AAChG,EAAA,MAAM,SAAS,sBAAA,EAA0B;AACzC,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,IAAA,MAAA,CAAO,OAAA,CAAQ,EAAa,CAAA,GAAI,IAAA,CAAK,MAAM,EAAa,CAAA;AAAA,EAC1D;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,IAAA,MAAA,CAAO,KAAA,CAAM,EAAa,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAa,CAAA;AAAA,EAC1D;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,IAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAa,CAAA;AAC7C,IAAA,MAAA,CAAO,OAAA,CAAQ,EAAa,CAAA,GAAI,CAAC,IAAI,IAAI,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,MAAA;AACT;AAYO,SAAS,iBAAA,CACd,MAAA,EACA,EAAA,EACA,MAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW;AAEjD,EAAA,IAAI,EAAA,IAAM,OAAO,KAAA,EAAO;AACtB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAAA,IACrB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,EAAA,IAAM,OAAO,OAAA,EAAS;AACxB,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAChC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,MAAA,CAAO,QAAQ,EAAE,CAAA;AACxB,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,GAAI,IAAA;AAAA,IACvB,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,OAAO,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,GAAI,CAAC,MAAM,KAAK,CAAA;AAAA,IACnC;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,EAAA,IAAM,OAAO,OAAA,EAAS;AACxB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAClC,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,OAAO,MAAA,CAAO,QAAQ,EAAE,CAAA;AACxB,IAAA,IAAI,QAAA,KAAa,OAAO,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,GAAI,CAAC,UAAU,KAAK,CAAA;AAC7D,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAAA,EAC9C,CAAA,MAAA,IAAW,UAAU,MAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,EACvB,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,GAAI,CAAC,QAAQ,KAAK,CAAA;AAAA,EACrC;AACF;AAGO,SAAS,wBAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,IAAA,iBAAA,CAAkB,QAAQ,EAAA,EAAe,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,EAAa,CAAE,CAAA;AAAA,EAChF;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,IAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAa,CAAA;AAC7C,IAAA,iBAAA,CAAkB,MAAA,EAAQ,EAAA,EAAe,IAAA,EAAM,EAAE,CAAA;AAAA,EACnD;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,IAAA,iBAAA,CAAkB,QAAQ,EAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,EAAa,GAAI,MAAS,CAAA;AAAA,EAClF;AACF;AAGO,SAAS,kBAA2C,KAAA,EAAkD;AAC3G,EAAA,MAAM,SAAS,sBAAA,EAA0B;AACzC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,wBAAA,CAAyB,MAAA,EAAQ,IAAI,CAAA;AAC/D,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,iBAA0C,IAAA,EAAsC;AAC9F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,IACvB,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,IAC3B,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,OAAA;AAAQ,GAC7B;AACF;;;ACtDO,SAAS,kBAAA,CACd,YACA,QAAA,EAC4D;AAC5D,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACtD,IAAA,MAAA,CAAO,IAAI,CAAA,GAAI,CAAA,EAAG,UAAU,IAAI,OAAO,CAAA,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAiB,EAAA,EAAqD;AACpF,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,GAAG,CAAA;AAChC,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,0BAA0B,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,CAAA;AAC9E,EAAA,MAAM,UAAU,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,IAAK,UAAU,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,SAAA,CAAU,EAAE,CAAC,CAAA,oCAAA,CAAsC,CAAA;AAAA,EACpG;AACA,EAAA,OAAO,EAAE,UAAA,EAAY,EAAA,CAAG,MAAM,CAAA,EAAG,KAAK,GAAG,OAAA,EAAQ;AACnD;AAMO,SAAS,wBAAwB,OAAA,EAIlB;AACpB,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,GAAc,IAAA,EAAM,UAAS,GAAI,OAAA;AACrD,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAK,SAAA,CAAU,UAAU,CAAC,CAAA,uCAAA,CAAyC,CAAA;AAAA,EAC3G;AACA,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,SAAA,EAAW,CAAA,KAAM;AACjC,IAAA,MAAM,KAAK,SAAA,CAAU,EAAA;AACrB,IAAA,MAAM,MAAA,GAAS,iBAAiB,EAAE,CAAA;AAClC,IAAA,IAAI,MAAA,CAAO,eAAe,UAAA,EAAY;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,EAAE,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,CAAA,GAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,EAAE,CAAA,mCAAA,EAAsC,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9E;AACA,IAAA,MAAM,QAAgB,SAAA,CAAU,KAAA;AAChC,IAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,OAAA,EAAS;AAC3C,MAAA,MAAM,IAAI,MAAM,CAAA,UAAA,EAAa,EAAE,sBAAsB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9E;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,UAAA,EAAY,WAAA,EAAa,UAAU,CAAC,GAAG,QAAQ,CAAA,EAAE;AAC5D;AAMO,SAAS,8BAA8B,OAAA,EAMxB;AACpB,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,OAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KACtB,MAAA,CAAO,aAAa,UAAA,KAAe,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA,CAAA;AAC/D,EAAA,OAAO,uBAAA,CAAwB;AAAA,IAC7B,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,QAAA,EAAU,QAAQ,QAAA,CAAS,GAAA;AAAA,MACzB,CAAC,CAAA,MAAwB,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,gBAAgB,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA;AACvG,GACD,CAAA;AACH;AAGO,SAAS,oBAAA,CACd,SAAA,EACA,MAAA,EACA,SAAA,EACe;AACf,EAAA,IAAI,UAAU,MAAA,IAAU,CAAC,UAAU,MAAA,CAAO,MAAM,GAAG,OAAO,MAAA;AAC1D,EAAA,MAAM,EAAA,GAAK,SAAA,KAAc,IAAA,GAAO,SAAA,CAAU,KAAK,SAAA,CAAU,IAAA;AACzD,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,aAAa,SAAA,CAAU,EAAE,CAAA,QAAA,EAAW,SAAS,CAAA,SAAA,CAAW,CAAA;AACjF,EAAA,MAAM,MAAA,GAAS,GAAG,MAAM,CAAA;AACxB,EAAA,OAAO,MAAA,KAAW,SAAY,MAAA,GAAS,MAAA;AACzC;AAGO,SAAS,qBAAA,CACd,SAAA,EACA,KAAA,EACA,SAAA,EACgC;AAChC,EAAA,IAAI,SAAA,CAAU,UAAU,OAAA,EAAS;AAC/B,IAAA,MAAM,EAAA,GAAK,SAAA,KAAc,IAAA,GAAO,SAAA,CAAU,KAAK,SAAA,CAAU,IAAA;AACzD,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,aAAa,SAAA,CAAU,EAAE,CAAA,QAAA,EAAW,SAAS,CAAA,SAAA,CAAW,CAAA;AACjF,IAAA,MAAM,MAAA,GAAS,GAAG,KAAK,CAAA;AACvB,IAAA,OAAO,MAAA,KAAW,SAAY,KAAA,GAAQ,MAAA;AAAA,EACxC;AACA,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,MAAM,MAAA,GAAS,MAAM,EAAyB,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAA;AAC9D,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,KAAA,CAAM,EAAyB,CAAA,GAAI,IAAA;AAAA,EAC1D;AACA,EAAA,OAAO,KAAA;AACT;;;AC7IO,SAAS,qBAAqB,MAAA,EAAiE;AACpG,EAAA,OAAO,OAAO,aAAA,KAAkB,CAAA;AAClC;AA6CO,IAAM,sBAAA,GAAyB;AAAA;AAAA,EAEpC,mBAAA,EAAqB,wBAAA;AAAA;AAAA,EAErB,mBAAA,EAAqB,wBAAA;AAAA;AAAA,EAErB,gBAAA,EAAkB,mBAAA;AAAA;AAAA,EAElB,cAAA,EAAgB,iBAAA;AAAA;AAAA,EAEhB,mBAAA,EAAqB,sBAAA;AAAA;AAAA,EAErB,oBAAA,EAAsB;AACxB;;;AC/CO,IAAM,WAAA,GAAN,MAAM,YAAA,CAAsD;AAAA,EAazD,WAAA,CACG,OACQ,OAAA,EACjB;AAFS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAgC;AACnD,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAqC;AAClF,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,gBAAA,EAAmB,IAAA,CAAK,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1F;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAElB,IAAA,MAAM,aAAgD,EAAC;AACvD,IAAA,MAAM,SAAsB,EAAC;AAC7B,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG;AAC/C,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA,EAAG;AACnC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAA,CAAS,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,MACzE;AACA,MAAA,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA;AAClC,MAAA,KAAA,MAAW,SAAA,IAAa,SAAS,QAAA,EAAU;AACzC,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAA,CAAU,EAAE,CAAA,CAAA,CAAG,CAAA;AACzF,QAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,EAAE,CAAA;AACxB,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,EAC1B;AAAA,EA5BW,KAAA;AAAA,EACQ,OAAA;AAAA,EAdnB,OAAO,MAAA,CACL,KAAA,EACA,OAAA,EACuB;AACvB,IAAA,OAAO,IAAI,YAAA,CAAsB,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA;AAAA,EACvD;AAAA,EAES,UAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EACQ,UAAA;AAAA,EAiCjB,QAAQ,QAAA,EAAkD;AACxD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,SAAS,QAAA,EAA+B;AACtC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,GAAG,KAAA,IAAS,UAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAA,CACE,KAAA,EACA,MAAA,EACA,KAAA,EACA,YAAA,EACG;AACH,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,QAAQ,CAAA;AAChD,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,IAAA,CAAK,QAAQ,mBAAA,EAAqB;AACpC,QAAA,OAAO,IAAA,CAAK,QAAQ,mBAAA,CAAoB;AAAA,UACtC,KAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA,KAAA;AAAA,UACA,cAAc,YAAA,IAAgB;AAAA,SAC/B,CAAA;AAAA,MACH;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,GAAgC;AAC9B,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACrD,MAAA,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,MAAA;AAAA,IACrD;AACA,IAAA,OAAO,EAAE,aAAA,EAAe,CAAA,EAAG,SAAA,EAAU;AAAA,EACvC;AAAA;AAAA,EAGA,wBAAA,GAA+C;AAC7C,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,GAAI,CAAA;AACxF,IAAA,OAAO,EAAE,aAAA,EAAe,CAAA,EAAG,SAAA,EAAU;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,eAAA,EAAiE;AAOlF,IAAA,IAAI,oBAAA,CAAqB,eAAe,CAAA,EAAG;AACzC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EACE;AAAA,OACJ;AAAA,IACF;AACA,IAAA,IAAI,eAAA,CAAgB,kBAAkB,CAAA,EAAG;AACvC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,CAAA,2BAAA,EAA8B,MAAA,CAAQ,eAAA,CAA+C,aAAa,CAAC,CAAA;AAAA,OAC7G;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,SAAA,IAAa,EAAE,CAAA;AAAA,EAC7D;AAAA,EAEQ,gBAAgB,SAAA,EAA2E;AACjG,IAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/C,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAChC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6CAAA,EAAgD,UAAU,CAAA,qBAAA,CAAuB,CAAA;AAAA,MAChG;AAAA,IACF;AAEA,IAAA,MAAM,SAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACrD,MAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA;AACtD,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,QAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AAC3B,QAAA,OAAA,GAAU,CAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,gBAAgB,CAAA,IAAK,mBAAmB,CAAA,EAAG;AAC/D,UAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA,gBAAA,EAAmB,MAAA,CAAO,gBAAgB,CAAC,CAAA,eAAA,EAAkB,QAAA,CAAS,UAAU,CAAA,CAAA,CAAA,EAAI;AAAA,QACtH;AACA,QAAA,IAAI,gBAAA,GAAmB,QAAA,CAAS,QAAA,CAAS,MAAA,EAAQ;AAC/C,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ,aAAa,QAAA,CAAS,UAAU,mBAAmB,gBAAgB,CAAA,4BAAA,EAA+B,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,iCAAA;AAAA,WACpI;AAAA,QACF;AACA,QAAA,OAAA,GAAU,gBAAA;AAAA,MACZ;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,OAAA,EAAS,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,MAAA,EAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,CAAC,CAAE,CAAA;AAAA,IAC5F;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,MAAA,EAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAA,CACE,MAAA,EACA,eAAA,EACA,SAAA,GAA2B,IAAA,EACK;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,eAAe,CAAA;AAC1D,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,OAAA,EAAS,OAAO,UAAA;AACxC,IAAA,MAAM,OAAA,GAAU,SAAA,KAAc,IAAA,GAAO,UAAA,CAAW,KAAA,GAAQ,CAAC,GAAG,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA,EAAQ;AACtF,IAAA,IAAI,OAAA,GAAyB,gBAAgB,MAAM,CAAA;AACnD,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,QAAA,IAAI,SAAA,CAAU,UAAU,QAAA,EAAU;AAChC,UAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA,UAAA,EAAa,SAAA,CAAU,EAAE,CAAA,yDAAA,CAAA,EAA4D;AAAA,QACvH;AACA,QAAA,IAAI,SAAA,KAAc,MAAA,IAAU,CAAC,SAAA,CAAU,IAAA,EAAM;AAC3C,UAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA,UAAA,EAAa,SAAA,CAAU,EAAE,CAAA,sBAAA,CAAA,EAAyB;AAAA,QACpF;AACA,QAAA,OAAA,GAAU,oBAAA,CAAqB,SAAA,EAAW,OAAA,EAAS,SAAS,CAAA;AAAA,MAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA,kBAAA,EAAqB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAG;AAAA,IAChH;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,QAAA,EAAiE;AACpF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAA,CAAS,MAAM,CAAA;AAC1D,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,OAAA,EAAS,OAAO,UAAA;AAExC,IAAA,IAAI,KAAA,GAAwC,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA;AAC1E,IAAA,IAAI,UAAA,CAAW,MAAM,MAAA,KAAW,CAAA,SAAU,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,KAAA,EAA4B;AAEhG,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,SAAA,IAAa,WAAW,KAAA,EAAO;AACxC,QAAA,KAAA,GAAQ,qBAAA,CAAsB,SAAA,EAAW,KAAA,EAAO,IAAI,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA,kBAAA,EAAqB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAG;AAAA,IAChH;AAGA,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,MAAM,MAAA,GAAS,MAAM,EAAyB,CAAA;AAC9C,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,KAAO,EAAA,EAAI;AAC/B,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA,6DAAA,EAAgE,EAAE,CAAA,CAAA,CAAA,EAAI;AAAA,MACxG;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,KAAA,EAA4B;AAAA,EAC/D;AACF;;;AC1LO,SAAS,iBAAA,CAAqB,SAA+B,KAAA,EAAmB;AACrF,EAAA,IAAI,QAAQ,OAAA,EAAS,OAAO,OAAO,EAAA,CAAG,OAAA,CAAQ,IAAI,KAAK,CAAA;AACvD,EAAA,IAAI,KAAA,IAAS,SAAS,OAAO,CAAC,OAAO,EAAA,CAAG,OAAA,CAAQ,KAAK,KAAK,CAAA;AAC1D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,OAAA,CAAQ,EAAA;AACtD;AAGO,SAAS,YAAA,CAA+B,OAA2B,MAAA,EAAoB;AAC5F,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAkB;AACnD,IAAA,MAAM,OAAA,GAAU,MAAM,GAAG,CAAA;AACzB,IAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,IAAA,IAAI,CAAC,iBAAA,CAAkB,OAAA,EAAS,OAAO,GAAG,CAAC,GAAG,OAAO,KAAA;AAAA,EACvD;AACA,EAAA,OAAO,IAAA;AACT;AAUO,SAAS,uBAAyC,KAAA,EAA2D;AAClH,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAA2B;AAC5D,IAAA,MAAM,OAAA,GAAU,MAAM,GAAG,CAAA;AACzB,IAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAA,EAAS,OAAO,GAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,mBAAA,CAAuB,KAAa,IAAA,EAAiC;AACnF,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS,GAAA,CAAI,OAAO,KAAK,CAAA;AACpE,EAAA,IAAI,IAAA,CAAK,OAAO,KAAA,MAAW,KAAA,IAAS,KAAK,KAAA,EAAO,GAAA,CAAI,IAAI,KAAK,CAAA;AAC7D,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,sBAAyB,IAAA,EAAkC;AACzE,EAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAA,IAAQ,CAAA,MAAO,MAAM,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA,MAAO,CAAA;AACxE;;;ACSO,IAAM,mBAAN,MAAgD;AAAA,EACpC,MAAA,uBAAa,GAAA,EAA4B;AAAA,EACzC,iBAAA,uBAAwB,GAAA,EAAmC;AAAA,EACpE,OAAA,GAAU,IAAA;AAAA,EAElB,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,aAAa,OAAA,EAAwB;AACnC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEQ,KAAK,QAAA,EAAkC;AAC7C,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO;AAAA,QACL,YAAA,sBAAkB,GAAA,EAAI;AAAA,QACtB,WAAA,sBAAiB,GAAA,EAAI;AAAA,QACrB,YAAA,sBAAkB,GAAA,EAAI;AAAA,QACtB,WAAA,sBAAiB,GAAA,EAAI;AAAA,QACrB,YAAA,sBAAkB,GAAA,EAAI;AAAA,QACtB,WAAA,sBAAiB,GAAA;AAAI,OACvB;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,GAAA,CACN,QAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,EAAE,IAAI,CAAA;AACpC,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,IACpB,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,QAAA,EAEM;AACb,IAAA,MAAM,YAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAA2D;AAC5G,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAI,CAAA,CAAE,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,cAAA,EAAgB,CAAA,CAAE,YAAY,CAAC,CAAA;AACrF,MAAA,IAAI,CAAA,CAAE,WAAA,EAAa,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,aAAA,EAAe,CAAA,CAAE,WAAW,CAAC,CAAA;AAClF,MAAA,IAAI,CAAA,CAAE,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,cAAA,EAAgB,CAAA,CAAE,YAAY,CAAC,CAAA;AACrF,MAAA,IAAI,CAAA,CAAE,WAAA,EAAa,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,aAAA,EAAe,CAAA,CAAE,WAAW,CAAC,CAAA;AAClF,MAAA,IAAI,CAAA,CAAE,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,cAAA,EAAgB,CAAA,CAAE,YAAY,CAAC,CAAA;AACrF,MAAA,IAAI,CAAA,CAAE,WAAA,EAAa,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,aAAA,EAAe,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,MAAM,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAG,CAAA;AAAA,EAC3C;AAAA,EAEA,2BAAA,CACE,UACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,EAAgB,OAAiD,CAAA;AAAA,EAC7F;AAAA,EAEA,0BAAA,CACE,UACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,aAAA,EAAe,OAAgD,CAAA;AAAA,EAC3F;AAAA,EAEA,2BAAA,CACE,UACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,EAAgB,OAAiD,CAAA;AAAA,EAC7F;AAAA,EAEA,0BAAA,CACE,UACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,aAAA,EAAe,OAAgD,CAAA;AAAA,EAC3F;AAAA,EAEA,2BAAA,CACE,UACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,EAAgB,OAAiD,CAAA;AAAA,EAC7F;AAAA,EAEA,0BAAA,CACE,UACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,aAAA,EAAe,OAAgD,CAAA;AAAA,EAC3F;AAAA,EAEA,iCAAiC,OAAA,EAAoD;AACnF,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,kBAAA,CAAmB,QAAW,MAAA,EAAyB;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAI,MAAA,GAAS,MAAA;AACb,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,YAAA,EAAc,MAAA,GAAS,OAAA,CAAQ,QAAQ,MAAM,CAAA;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAA,CAAkB,QAAW,MAAA,EAA4B;AACvD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,WAAA,EAAa,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,EAChE;AAAA;AAAA,EAGA,kBAAA,CAAmB,IAAA,EAAS,IAAA,EAAS,MAAA,EAAyB;AAC5D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,QAAQ,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,YAAA,WAAuB,OAAA,CAAQ,IAAA,EAAM,QAAQ,MAAM,CAAA;AAC9E,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAA,CAAkB,IAAA,EAAS,IAAA,EAAS,MAAA,EAA4B;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,QAAQ,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,WAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,MAAM,MAAM,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,kBAAA,CAAmB,QAAW,MAAA,EAA+B;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,YAAA,EAAc;AACvC,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA,KAAM,OAAO,OAAO,KAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAA,CAAkB,QAAW,MAAA,EAA4B;AACvD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,WAAA,EAAa,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,EAChE;AAAA;AAAA,EAGA,wBAAwB,MAAA,EAA4B;AAClD,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,iBAAA,EAAmB,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC9D;AACF;AAMA,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AACzC,EAAA,OAAO,KAAA,KAAU,MAAA,CAAO,SAAA,IAAa,KAAA,KAAU,IAAA;AACjD;AAEA,SAAS,mBAAA,CAAoB,GAA4B,CAAA,EAAqC;AAC5F,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,EAAE,OAAO,CAAA,CAAA,IAAM,CAAA,CAAE,GAAG,CAAA,KAAM,CAAA,CAAE,GAAG,CAAA,EAAG,OAAO,KAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,oBAAA,CAAqB,GAAkB,CAAA,EAA2B;AAChF,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,MAAM,EAAA,GAAK,CAAA;AACX,EAAA,MAAM,EAAA,GAAK,CAAA;AACX,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,EAAE,GAAA,IAAO,EAAA,CAAA,EAAK,OAAO,KAAA;AACzB,IAAA,MAAM,EAAA,GAAK,GAAG,GAAG,CAAA;AACjB,IAAA,MAAM,EAAA,GAAK,GAAG,GAAG,CAAA;AACjB,IAAA,IAAI,OAAO,EAAA,EAAI;AACf,IAAA,IAAA,CAAK,GAAA,KAAQ,WAAW,GAAA,KAAQ,MAAA,KAAW,cAAc,EAAE,CAAA,IAAK,aAAA,CAAc,EAAE,CAAA,EAAG;AACjF,MAAA,IAAI,CAAC,mBAAA,CAAoB,EAAA,EAAI,EAAE,GAAG,OAAO,KAAA;AACzC,MAAA;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAsC,MAAA,EAAc;AAClE,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,IAAI,cAAc,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,OAAO,CAAC,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,OAAO,CAAC,CAAA;AACvF,EAAA,IAAI,cAAc,CAAA,CAAE,MAAM,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AACpF,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AA8BA,SAAS,YAAuC,MAAA,EAAyD;AACvG,EAAA,OAAO,OAAO,WAAW,UAAA,GAAa,MAAA,GAAS,CAAC,MAAA,KAAW,YAAA,CAAa,QAAQ,MAAM,CAAA;AACxF;AAEO,IAAM,eAAN,MAA4C;AAAA,EAMjD,YAA6B,KAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAuB;AAAA,EAAvB,KAAA;AAAA,EALZ,QAAA,uBAAe,GAAA,EAA4C;AAAA,EAC3D,YAAA,uBAAmB,GAAA,EAA2B;AAAA,EAC9C,UAAA,uBAAiB,GAAA,EAA+B;AAAA,EAChD,YAAA,uBAAmB,GAAA,EAA8C;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlF,GAAA,CACE,UACA,MAAA,EACuD;AACvD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AAC7C,MAAA,OAAO,QAAA,CAAS,SAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,KAAA,EAAQ,QAAQ,aAAa,MAAM;AACvE,QAAA,MAAM,GAAA,uBAAU,GAAA,EAAoC;AACpD,QAAA,KAAA,MAAW,UAAU,OAAA,CAAQ,GAAA,IAAO,GAAA,CAAI,GAAA,CAAI,OAAO,EAAoC,CAAA;AACvF,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA;AAC9C,MAAA,CAAA,GAAI,QAAA,CAAS,SAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,KAAA,EAAQ,QAAQ,IAAI,MAAM;AAC3D,QAAA,KAAA,CAAM,MAAM,GAAA,EAAI;AAChB,QAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,MAC3B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,CACE,UACA,MAAA,EACsC;AACtC,IAAA,IAAI,MAAA,EAAQ,OAAO,IAAA,CAAK,eAAA,CAAgB,UAAU,MAAM,CAAA;AACxD,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAC7B,MAAA,CAAA,GAAI,QAAA,CAAS,SAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,SAAA,EAAY,QAAQ,IAAI,MAAM;AAC/D,QAAA,MAAM,SAAc,EAAC;AACrB,QAAA,KAAA,MAAW,EAAA,IAAM,GAAA,CAAI,GAAA,EAAI,EAAG;AAC1B,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAa,CAAA;AAC3C,UAAA,IAAI,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,QAC9C;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CACN,UACA,MAAA,EACsC;AAEtC,IAAA,MAAM,SAAA,GAAY,YAAiB,MAAM,CAAA;AACzC,IAAA,MAAM,kBAAkB,OAAO,MAAA,KAAW,UAAA,GAAa,MAAA,GAAY,uBAAuB,MAAM,CAAA;AAEhG,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,MAAM,MAAA,GAAU,OAAgC,eAA4B,CAAA;AAC5E,MAAA,MAAM,MAAA,GAAS,MAAA,IAAU,IAAA,IAAQ,MAAA,GAAS,OAAO,EAAA,GAAK,MAAA;AACtD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,eAAqC,CAAA;AACxE,MAAA,OAAO,QAAA,CAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,eAAe,CAAC,CAAA,CAAA,EAAI,MAAM;AAC7F,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,EAAI,CAAE,IAAI,MAAiC,CAAA;AAChE,QAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,QAAA,MAAM,SAAgB,EAAC;AACvB,QAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAa,CAAA;AAC3C,UAAA,IAAI,WAAW,MAAA,IAAa,SAAA,CAAU,MAAM,CAAA,EAAG,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,QACnE;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,IAAA,OAAO,QAAA,CAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,SAAA,EAAY,QAAQ,CAAA,SAAA,CAAA,EAAa,MAAM,GAAA,CAAI,GAAA,EAAI,CAAE,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EAC1G;AAAA;AAAA,EAGA,MAAA,CACE,UACA,MAAA,EACgD;AAChD,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,CAAK,eAAA,CAAgB,UAAU,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACvF,IAAA,OAAO,QAAA,CAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA,EAAI,MAAM,OAAA,CAAQ,GAAA,EAAI,CAAE,CAAC,CAAC,CAAA;AAAA,EACrF;AAAA;AAAA,EAGA,IAAA,CACE,UACA,MAAA,EAC4B;AAC5B,IAAA,OAAO,sBAAA,CAAuB,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,MAAM,CAAA,CAAE,KAAK,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAA,CACE,UACA,QAAA,EAC6C;AAE7C,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ,QAAA;AAAA,MACZ,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,UAAU,GAAG,CAAA,CAAA;AAAA,MACnC,CAAC,UAAU,iBAAA,KAAsB;AAC/B,QAAA,IAAI,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC7B,UAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,UAAA,OAAO,IAAA,CAAK,UAAA,CAAwB,QAAA,EAAU,QAAQ,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA;AACpD,QAAA,IAAI,UAAU,WAAA,EAAa,OAAO,IAAA,CAAK,UAAA,CAAwB,UAAU,QAAQ,CAAA;AAEjF,QAAA,MAAM,OAAA,GAAqC,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC3D,QAAA,MAAM,SAAA,uBAA4C,GAAA,EAAI;AACtD,QAAA,IAAI,OAAA,GAAU,KAAA;AAEd,QAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAsB,EAAA,KAAkB;AACtD,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAChC,UAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAM,CAAA;AAC3B,UAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,UAAA,IAAI,IAAA,CAAK,IAAA,KAAS,CAAA,EAAG,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,eACpC,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAC5B,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,KAAK,EAAC;AACtC,UAAA,CAAC,MAAM,OAAA,qBAAY,IAAI,GAAA,EAAI,EAAG,IAAI,EAAE,CAAA;AACrC,UAAA,SAAA,CAAU,GAAA,CAAI,OAAO,KAAK,CAAA;AAC1B,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA;AACA,QAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAsB,EAAA,KAAkB;AACnD,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAChC,UAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,UAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,IAAI,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA,CAAI,EAAE,CAAC,CAAA;AAC1C,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,KAAK,EAAC;AACtC,UAAA,CAAC,MAAM,KAAA,qBAAU,IAAI,GAAA,EAAI,EAAG,IAAI,EAAE,CAAA;AACnC,UAAA,SAAA,CAAU,GAAA,CAAI,OAAO,KAAK,CAAA;AAC1B,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA;AAEA,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAa,CAAA;AACvC,YAAA,IAAI,MAAA,EAAQ,aAAa,QAAA,EAAU,GAAA,CAAI,OAAO,QAAQ,CAAA,EAAG,OAAO,EAAe,CAAA;AAAA,UACjF;AACA,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,YAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAa,CAAA;AAClD,YAAA,IAAI,KAAA,CAAM,aAAa,QAAA,EAAU;AACjC,YAAA,IAAI,MAAA,CAAO,GAAG,MAAA,CAAO,QAAQ,GAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG;AAClD,YAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,CAAO,EAAe,CAAA;AAC/C,YAAA,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,CAAM,EAAe,CAAA;AAAA,UAC5C;AACA,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,EAAa,CAAA;AACzC,YAAA,IAAI,MAAA,EAAQ,aAAa,QAAA,EAAU,MAAA,CAAO,OAAO,QAAQ,CAAA,EAAG,OAAO,EAAe,CAAA;AAAA,UACpF;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,SAAS,OAAO,QAAA;AACrB,QAAA,OAAO,QAAA,CAAS,SAAS,SAAS,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,EAAE,eAAe,GAAA;AAAI,KACvB;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,KAA0B,CAAA;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,UAAA,CACN,UACA,QAAA,EACgD;AAEhD,IAAA,MAAM,GAAA,uBAAqC,GAAA,EAAI;AAC/C,IAAA,KAAA,MAAW,UAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,KAAI,EAAG;AACjD,MAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,EAAe,CAAA;AAAA,WACxC,GAAA,CAAI,IAAI,KAAA,kBAAO,IAAI,IAAI,CAAC,MAAA,CAAO,EAAe,CAAC,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAuC,QAAA,EAAsE;AAC3G,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AAC7C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,QAAA,GAAW,QAAA;AAAA,MACf,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,YAAY,QAAQ,CAAA,CAAA;AAAA,MAC1C,CAAC,UAAU,iBAAA,KAAsB;AAC/B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAI;AACrC,QAAA,IAAI,eAAA,CAAgB,QAAQ,CAAA,EAAG,OAAO,KAAA;AAEtC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,aAAa,iBAAiB,CAAA;AAC/D,QAAA,IAAI,KAAA,KAAU,aAAa,OAAO,KAAA;AAElC,QAAA,MAAM,SAAS,sBAAA,EAA0B;AACzC,QAAA,IAAI,GAAA,GAAM,KAAA;AACV,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAa,CAAA;AACvC,YAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAClC,YAAA,MAAA,CAAO,KAAA,CAAM,EAAa,CAAA,GAAI,MAAA;AAC9B,YAAA,GAAA,GAAM,IAAA;AAAA,UACR;AACA,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,EAAa,CAAA;AACvC,YAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU;AACnC,YAAA,MAAA,CAAO,OAAA,CAAQ,EAAa,CAAA,GAAI,IAAA;AAChC,YAAA,GAAA,GAAM,IAAA;AAAA,UACR;AACA,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,EAAa,CAAA;AACzC,YAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAClC,YAAA,MAAA,CAAO,OAAA,CAAQ,EAAa,CAAA,GAAI,MAAA;AAChC,YAAA,GAAA,GAAM,IAAA;AAAA,UACR;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,QAAA,OAAO,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,MAC/B,CAAA;AAAA,MACA,EAAE,eAAe,GAAA;AAAI,KACvB;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAcO,IAAM,QAAN,MAAsE;AAAA,EAClE,EAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA,GAAc,IAAI,gBAAA,EAAoB;AAAA,EACtC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA;AAAA,EAEQ,OAAA,uBAAc,GAAA,EAAkC;AAAA,EAChD,WAAA,uBAAkB,GAAA,EAA0B;AAAA,EAC5C,SAAA,uBAAgB,GAAA,EAAiB;AAAA,EAC1C,iBAAoC,EAAC;AAAA,EAC5B,eAAiC,EAAC;AAAA,EAC3C,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAuB,MAAA;AAAA,EACvB,YAAA,GAAe,IAAA;AAAA,EACf,mBAAA,GAAsB,KAAA;AAAA,EACtB,QAAA,GAAW,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,kBAAA,GAA4C,IAAA;AAAA,EAEpD,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,QAAA,EAAS;AACjC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,UAAU,IAAA,CAA6B,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,YAAY,CAAA,EAAG;AAAA;AAAA;AAAA,MAGzE,aAAA,EAAe,GAAA;AAAA,MACf,WAAA,EAAa,MAAM,IAAA,CAAK,kBAAA,IAAsB;AAAA,KAC/C,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,CAAa,IAAI,CAAA;AAElC,IAAA,MAAM,MAAA,GAAS,EAAE,QAAA,kBAAU,IAAI,GAAA,EAAY,EAAG,OAAA,kBAAS,IAAI,GAAA,EAAY,EAAG,QAAA,kBAAU,IAAI,KAAY,EAAE;AACtG,IAAA,KAAA,MAAW,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAA2B;AAC3E,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAEnB,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AACjD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,YAAY,CAAA,EAAG,EAAE,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAAgC;AAC3C,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,EAAE,IAAA,kBAAM,IAAI,GAAA,IAAO,KAAA,EAAO,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,CAAC,CAAA,EAAE;AAChF,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAuB,EAAA,EAAoC;AACzD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,GAAA,EAAI;AAEpB,IAAA,IAAA,CAAK,aAAa,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,MAAM,GAAA,EAAI;AAC9C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,wBAA2C,EAAA,EAAoC;AAC7E,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,OAAO,IAAK,sBAAA,CAAuB,MAAM,CAAA,CAAE,GAAA,EAAK,CAAA,GAAoC,MAAA;AAAA,EACtF;AAAA,EAEA,IAAuB,EAAA,EAAgB;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,KAAM,MAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,UAAA,GAAkB;AAChB,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,WAAA,CAAY,QAAO,EAAG,KAAA,CAAM,MAAM,GAAA,EAAI;AAC/D,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACrC,MAAA,MAAM,MAAA,GAAS,EAAE,GAAA,EAAI;AACrB,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,QAAA,EAA+B;AACtC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GAAA,CAAI,SAAuB,aAAA,EAA4C;AACrE,IAAA,IAAA,CAAK,OAAO,MAAM;AAChB,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAY,SAAA,EAAU;AAClE,MAAA,MAAM,UAAe,EAAC;AACtB,MAAA,MAAM,UAAoB,EAAC;AAE3B,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,MAAM,KAAK,MAAA,CAAO,EAAA;AAClB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACpC,QAAA,MAAM,MAAA,GAAS,UAAU,GAAA,EAAI;AAE7B,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,IAAI,WAAW,MAAA,EAAQ;AACvB,UAAA,IAAI,IAAA,GAAO,KAAK,MAAA,CAAO,cAAA,CAAe,MAAM,MAAA,EAAQ,aAAA,IAAiB,gBAAgB,MAAM,CAAA;AAC3F,UAAA,IAAI,WAAW,IAAA,GAAO,IAAA,CAAK,YAAY,kBAAA,CAAmB,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC9E,UAAA,IAAI,IAAA,KAAS,MAAA,IAAU,oBAAA,CAAqB,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC3D,UAAA,IAAI,IAAA,CAAK,OAAO,EAAA,EAAI;AAClB,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,EAAE,CAAA,IAAA,EAAO,IAAA,CAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,UAC1E;AACA,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,IAAI,MAAA,CAAO,QAAA,KAAa,IAAA,CAAK,QAAA,EAAU;AACrC,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,QAAA,EAAU,EAAE,CAAA;AACxC,YAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAAA,UACnC;AACA,UAAA,QAAA,CAAU,IAAI,IAAI,CAAA;AAClB,UAAA,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAClC,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,QAC7B,CAAA,MAAO;AACL,UAAA,IAAI,IAAA,GAAO,KAAK,MAAA,CAAO,cAAA,CAAe,MAAM,MAAA,EAAQ,aAAA,IAAiB,gBAAgB,MAAS,CAAA;AAC9F,UAAA,IAAI,WAAW,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,kBAAA,CAAmB,MAAM,MAAM,CAAA;AACtE,UAAA,IAAI,IAAA,CAAK,OAAO,EAAA,EAAI;AAClB,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,EAAE,CAAA,IAAA,EAAO,IAAA,CAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,UAC1E;AACA,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,MAAM,CAAA,GAAI,YAAY,IAAA,CAAoB,CAAA,MAAA,EAAS,KAAK,EAAE,CAAA,QAAA,EAAW,EAAE,CAAA,CAAA,EAAI,MAAS,CAAA;AACpF,UAAA,CAAA,CAAE,IAAI,IAAI,CAAA;AACV,UAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA;AACtB,UAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AACjC,UAAA,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,MAAA,EAAW,IAAI,CAAA;AACrC,UAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,QACnB;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS,IAAA,CAAK,WAAA,CAAY,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AAC/E,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,OAAA,OAAc,WAAA,CAAY,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,MAC3F;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,GAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,OAAO,MAAM;AAChB,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAY,SAAA,EAAU;AAClE,MAAA,MAAM,WAAgB,EAAC;AAEvB,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,MAAM,MAAA,GAAS,EAAE,GAAA,EAAI;AACrB,QAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,QAAA,IAAI,aAAa,CAAC,IAAA,CAAK,YAAY,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAA,EAAG;AACvE,QAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,UAAe,EAAC;AACtB,MAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,EAAE,CAAA;AACpC,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,MAAM,OAAA,GAAU,EAAE,GAAA,EAAI;AACtB,QAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,QAAA,CAAA,CAAE,IAAI,MAAS,CAAA;AACf,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAC7B,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA;AAChD,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,OAAA,EAAS,MAAS,CAAA;AAC/C,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,MACtB;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS,IAAA,CAAK,WAAA,CAAY,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AAAA,MACjF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAA0B,IAAO,OAAA,EAA6D;AAC5F,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,uBAAA,CAAwB,EAAE,CAAA;AAC/C,IAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,OAAA,CAAQ,OAAO,CAAiB,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAU,IAAa,OAAA,EAAwF;AAC7G,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AACxB,IAAA,MAAM,mBAAmB,IAAA,CAAK,YAAA;AAC9B,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACzD,IAAA,IAAI,OAAA,EAAS,YAAA,KAAiB,MAAA,EAAW,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AACrE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,EAAA;AACL,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,CAAS,MAAM,sBAAA,CAAuB,EAAE,CAAC,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,KAAA,EAAA;AACL,MAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,iBAAA,CAAkB,QAAQ,YAAY,CAAA;AAAA,QAC7C,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,UAAA,IAAA,CAAK,YAAA,GAAe,gBAAA;AAAA,QACtB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,QAAA,IAAA,CAAK,YAAA,GAAe,gBAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB,EAAA,EAAsB;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,kBAAkB,EAAA,EAAgC;AAChD,IAAA,MAAM,OAAO,sBAAA,EAA0B;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA;AAC3B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAa,GAAA,EAAI;AAAA,IACxB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,CACE,MACA,OAAA,EACM;AACN,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,IAAA;AAC9C,IAAA,MAAM,mBAAA,GAAsB,SAAS,mBAAA,IAAuB,KAAA;AAC5D,IAAA,IAAA,CAAK,MAAA;AAAA,MACH,MAAM;AACJ,QAAA,MAAM,QAAa,EAAC;AACpB,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,IAAA,CAAK,KAAA,CAAM,EAAa,CAAE,CAAA;AAClE,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,UAAA,IAAI,GAAG,EAAE,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAa,CAAA;AACvC,UAAA,IAAI,mBAAA,EAAqB;AACvB,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,uBAAA,CAAwB,EAAa,CAAA;AAC1D,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,QAAQ,CAAA;AAC5C,YAAA,IAAI,YAAY,MAAA,IAAa,IAAA,IAAQ,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AAClE,cAAA,MAAM,MAAA,GAAkC,EAAE,GAAI,EAAA,EAA0C;AACxF,cAAA,MAAM,GAAA,GAAM,OAAA;AACZ,cAAA,KAAA,MAAW,GAAA,IAAO,KAAK,eAAA,EAAiB;AACtC,gBAAA,IAAI,OAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,qBAChC,OAAO,OAAO,GAAG,CAAA;AAAA,cACxB;AACA,cAAA,EAAA,GAAK,MAAA;AAAA,YACP;AAAA,UACF;AACA,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AACA,QAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AACzC,QAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,MAC/C,CAAA;AAAA,MACA,EAAE,YAAA;AAAa,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,WAA6B,OAAA,EAAqD;AACvF,IAAA,MAAM,QAAA,GAAwB;AAAA,MAC5B,SAAA;AAAA,MACA,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAU,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,KAAA,IAAS,KAAA;AAAM,KAC9E;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,QAA6B,UAAA,EAAgC;AACrE,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,sBAAA,CAAuB,MAAM;AAC3B,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,KAAK,OAAA,EAAS;AAClC,QAAA,MAAM,MAAA,GAAS,EAAE,GAAA,EAAI;AACrB,QAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,QAAA,IAAI,KAAA,KAAU,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,KAAM,KAAA,EAAO,MAAA,CAAO,EAAE,CAAA,GAAI,MAAA;AAAA,MAChF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,gBAAA,CAAiB,QAA6B,UAAA,EAA8B;AAC1E,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,gBAAgB,QAAA,EAA8C;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,QAAQ,CAAA;AAC1D,IAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,EAAE,OAAO,QAAA,CAAS,KAAA,EAAO,QAAQ,IAAA,CAAK,MAAA,CAAO,WAAU,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,QAAA,EAAkC;AAClD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,QAAQ,CAAA;AAC1D,IAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,WAAW,QAAA,CAAS,KAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA;AAAA,MACH,MAAM;AACJ,QAAA,MAAM,MAAA,mBAAS,IAAI,GAAA,CAAiB,CAAC,UAAU,CAAC,CAAA;AAChD,QAAA,KAAA,MAAW,MAAA,IAAU,SAAS,MAAA,CAAO,GAAA,CAAI,KAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AACvE,QAAA,MAAM,WAAsB,EAAC;AAC7B,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,KAAK,OAAA,EAAS;AAClC,UAAA,MAAM,MAAA,GAAS,EAAE,GAAA,EAAI;AACrB,UAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,UAAA,IAAI,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA,IAAK,EAAE,EAAA,IAAM,QAAA,CAAA,EAAW,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,QACvF;AACA,QAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AACpB,QAAA,IAAA,CAAK,GAAA,CAAI,SAAS,YAAY,CAAA;AAAA,MAChC,CAAA;AAAA,MACA,EAAE,cAAc,KAAA;AAAM,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAA,CACE,IAAA,EACA,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,KAAA,uBAAY,OAAA,EAAsD;AACxE,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAC,EAAA,KAAU;AACd,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,QAAA,IAAI,CAAC,CAAA,EAAG;AACN,UAAA,IAAA,CAAK,aAAa,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,MAAM,GAAA,EAAI;AAC9C,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACnB,QAAA,IAAI,CAAC,CAAA,EAAG;AACN,UAAA,CAAA,GAAI,QAAA;AAAA,YACF,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,YACb,MAAM;AACJ,cAAA,MAAM,MAAA,GAAS,EAAE,GAAA,EAAI;AACrB,cAAA,OAAO,MAAA,KAAW,MAAA,GAAY,MAAA,GAAY,MAAA,CAAO,MAAoC,CAAA;AAAA,YACvF,CAAA;AAAA,YACA,SAAS,OAAA,GACL,EAAE,SAAS,CAAC,CAAA,EAAG,MAAO,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,GAAY,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAS,CAAA,EAAG,CAAC,GAAG,GAC7F;AAAA,WACN;AACA,UAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,OAAO,EAAE,GAAA,EAAI;AAAA,MACf;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA,EAIQ,UAAA,CAAW,UAAkB,EAAA,EAAa;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACxC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,CAAA;AACjB,IAAA,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EACjC;AAAA,EAEQ,eAAA,CAAgB,UAAkB,EAAA,EAAa;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAM,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,EAAG;AACtC,IAAA,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EACjC;AAAA,EAEQ,YAAA,CAAa,EAAA,EAAa,MAAA,EAAuB,KAAA,EAAsB;AAC7E,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,cAAA,CAAe,SAAS,CAAC,CAAA;AAC/D,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AACvC,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,EAAE,OAAA,EAAS,sBAAA,EAA0B,EAAG,MAAA,EAAQ,KAAK,MAAA,EAAO;AACpE,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,IAChC;AACA,IAAA,iBAAA,CAAkB,KAAA,CAAM,OAAA,EAAS,EAAA,EAAI,MAAA,EAAQ,KAAK,CAAA;AAClD,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,YAAA,oBAAgC,IAAA,EAAM,EAAA,EAAI,QAAQ,KAAK,CAAA;AAAA,EACjF;AAAA,EAEQ,iBAAA,CAAkB,QAAsB,YAAA,EAAuB;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,kBAAA,CAAmB,CAAA,CAAE,OAAO,CAAC,CAAA,EAAG;AACpE,MAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,gBAAgB,IAAA,CAAK,WAAA,CAAY,WAAU,IAAK,CAAC,KAAK,mBAAA,EAAqB;AAC7E,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AACxB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,IAAA,CAAK,KAAA,EAAA;AACL,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,MAAM,uBAAuB,MAAM,IAAA,CAAK,YAAY,uBAAA,CAAwB,MAAM,CAAC,CAAC,CAAA;AAAA,MAC/F,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,KAAA,EAAA;AACL,QAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,QAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,oBAAA,EAAqB;AACpD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGQ,oBAAA,GAAuC;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,CAAC,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAC1G,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,IAAA,OAAO,kBAAkB,KAAK,CAAA;AAAA,EAChC;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AAC/B,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAO,CAAA,EAAG;AACvC,MAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACjD,QAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,KAAW,KAAA,IAAS,SAAS,OAAA,CAAQ,MAAA,KAAW,MAAM,MAAA,EAAQ;AACnF,QAAA,MAAM,OAAA,GACJ,QAAA,CAAS,OAAA,CAAQ,KAAA,KAAU,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,QAAQ,KAAK,CAAA;AACjH,QAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AACjC,QAAA,QAAA,CAAS,UAAU,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAA,CAAkB,MAAsB,KAAA,EAAoC;AAClF,IAAA,MAAM,SAAS,sBAAA,EAA0B;AACzC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAa,CAAA;AACvC,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,CAAO,QAAQ,MAAM,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,EAAa,CAAA,GAAI,MAAA;AAAA,IAC9E;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,EAAa,CAAA;AACvC,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,QAAQ,CAAA,KAAM,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,EAAa,CAAA,GAAI,IAAA;AAAA,IACjF;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,OAAA,EAAS;AAC7B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,EAAa,CAAA;AACzC,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,CAAO,QAAQ,MAAM,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,EAAa,CAAA,GAAI,MAAA;AAAA,IAChF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC5B,EAAA,OAAO,KAAA,GAAQ,IAAI,EAAA,CAAG,KAAA,CAAM,GAAG,KAAK,CAAA,GAAI,aAAA,CAAc,EAAE,CAAA,CAAE,QAAA;AAC5D;;;ACpqCO,IAAM,wBAAA,GAA2B;AAcxC,SAASC,eAAc,KAAA,EAAkD;AACvE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,mBAAmB,KAAA,EAA2C;AACrE,EAAA,OAAOA,eAAc,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,eAAe,CAAA,KAAM,QAAA;AACnE;AAMO,SAAS,cAAc,IAAA,EAAoC;AAChE,EAAA,IAAI,IAAA,GAAgB,IAAA;AACpB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAgB,KAAA,EAAM;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,IAAI,CAACA,eAAc,IAAI,CAAA,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAEpE,EAAA,IAAI,EAAE,6BAA6B,IAAA,CAAA,EAAO;AAExC,IAAA,MAAM,cAAA,GAAiB,KAAK,UAAU,CAAA;AACtC,IAAA,IAAIA,eAAc,cAAc,CAAA,KAAM,OAAA,IAAW,cAAA,IAAkB,aAAa,cAAA,CAAA,EAAiB;AAC/F,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,QAAA,EAAS;AAAA,IACtC;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,EAC5C;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,yBAAyB,CAAA;AAC9C,EAAA,IAAI,OAAO,YAAY,QAAA,IAAY,CAAC,OAAO,SAAA,CAAU,OAAO,CAAA,IAAK,OAAA,GAAU,CAAA,EAAG;AAC5E,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,EAC5C;AACA,EAAA,IAAI,UAAU,wBAAA,EAA0B,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,eAAA,EAAgB;AAEnF,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAEnF,EAAA,MAAM,OAAA,GAAU,KAAK,SAAS,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AACzE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,aAAa,MAAM,CAAA,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AACvE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AACrE,IAAA,IAAA,CAAK,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA,CAAK,QAAQ,GAAG,OAAA,EAAoC;AACjF;AAMA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,YAAY,CAAA;AACvD,EAAA,IAAIA,cAAAA,CAAc,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAK,EAAG;AAC3C,MAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,MAAA,IAAI,MAAM,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,aAAa,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,iBAAA,CAAkB,QAA0B,OAAA,EAA2C;AACrG,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,uBAAA,EAAyB,wBAAA;AAAA,IACzB,MAAA,EAAQ,aAAa,MAAM,CAAA;AAAA,IAC3B,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,YAAY;AAAA,GACnC;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AACzC;AAGO,SAAS,wBAAwB,IAAA,EAGtC;AACA,EAAA,MAAM,QAAQ,EAAC;AACf,EAAA,KAAA,MAAW,UAAU,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,EAAyB,CAAA,GAAI,MAAA;AAC7E,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AACtC;AAGO,SAAS,wBAAwB,QAAA,EAG7B;AACT,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,EAAE,EAAA,GAAK,CAAA,CAAE,KAAK,EAAA,GAAK,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,GAAK,IAAI,CAAE,CAAA;AACrG,EAAA,OAAO,iBAAA,CAAkB,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACnD;;;ACrFA,SAAS,QAAQ,OAAA,EAAmC;AAClD,EAAA,IAAI,OAAA,YAAmB,OAAO,OAAO,OAAA;AACrC,EAAA,MAAM,QAAS,OAAA,EAAoD,KAAA;AACnE,EAAA,IAAI,KAAA,YAAiB,OAAO,OAAO,KAAA;AACnC,EAAA,MAAM,IAAI,MAAM,2EAA2E,CAAA;AAC7F;AAqBO,SAAS,mBAAA,CACd,IAAA,EACA,MAAA,EACA,OAAA,EACmC;AAGnC,EAAA,MAAM,UAAA,uBAAiB,OAAA,EAA0E;AAEjG,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,SAAkB,EAAA,EAAiC;AACrD,MAAA,MAAM,GAAA,GAAM,OAAA;AACZ,MAAA,IAAI,QAAQ,IAAA,IAAS,OAAO,QAAQ,QAAA,IAAY,OAAO,QAAQ,UAAA,EAAa;AAC1E,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC9B,MAAA,IAAI,CAAC,KAAA,EAAO;AAIV,QAAA,MAAM,kBAAkB,OAAA,EAAS,eAAA;AAGjC,QAAA,MAAM,QAAA,uBAAe,GAAA,EAA2C;AAChE,QAAA,MAAM,UAAA,GAAa,eAAA,GACf,CAAC,MAAA,KAAkC;AACjC,UAAA,MAAM,IAAA,GAAO,MAAA;AACb,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AACnC,UAAA,IAAI,QAAQ,eAAA,CAAgB,IAAA,CAAK,QAAQ,IAAI,CAAA,SAAU,IAAA,CAAK,MAAA;AAC5D,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,EAAS,IAAI,CAAA;AACnC,UAAA,QAAA,CAAS,IAAI,MAAA,CAAO,EAAA,EAAI,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAChD,UAAA,OAAO,MAAA;AAAA,QACT,CAAA,GACA,CAAC,MAAA,KAAkC,MAAA,CAAO,SAAS,MAAW,CAAA;AAElE,QAAA,KAAA,GAAQ,OAAA,CAAQ,OAAO,CAAA,CAAE,mBAAA;AAAA,UACvB,IAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAS,OAAA,GAAU,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAQ,GAAI;AAAA,SACpD;AACA,QAAA,UAAA,CAAW,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,KAAA,CAAM,IAAI,EAAwC,CAAA;AAAA,IAC3D;AAAA,GACF;AACF;;;ACnGA,IAAM,MAAA,GACJ,OAAO,OAAA,KAAY,WAAA,IAAe,OAAO,OAAA,CAAQ,GAAA,KAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,KAAM,YAAA;AAgB5F,SAAS,UAAa,MAAA,EAAc;AACzC,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,WAAW,MAAM,CAAA;AAC1B;AAEA,SAAS,WAAc,MAAA,EAAc;AACnC,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,MAAA;AAC1D,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AACpC,EAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAGpB,EAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,CAAO,MAAiC,CAAA,aAAc,KAAK,CAAA;AACtF,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAM,CAAA,aAAc,KAAA,IAAS,MAAA,aAAmB,KAAK,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAgBO,SAAS,YAAA,CACd,IACA,IAAA,EACuB;AACvB,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,YAAY,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AACF;;;ACRO,SAAS,qBAAA,GAAwF;AACtG,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAgB;AACpC,EAAA,IAAI,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,EAAA,KAAO,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAC3B,QAAQ,MAAM,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClC,GAAA,EAAK,CAAC,MAAA,KAAW;AACf,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAA,EAAe,MAAM,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,EAAA,KAAO;AACd,MAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,EAAM;AAAA,IAC3B,WAAW,MAAM,MAAA;AAAA,IACjB,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,GACF;AACF;;;AC9DA,IAAI,SAAA;AACJ,IAAI,gBAAA,GAAmB,KAAA;AAEvB,SAAS,YAAA,GAA2C;AAClD,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,gBAAA,GAAmB,IAAA;AACnB,IAAA,IAAI;AAEF,MAAA,IAAI,OAAO,IAAA,KAAS,WAAA,IAAe,OAAO,IAAA,CAAK,cAAc,UAAA,EAAY;AACvE,QAAA,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA,CAAU,QAAW,EAAE,WAAA,EAAa,YAAY,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AAaO,UAAU,iBAAiB,GAAA,EAAiD;AACjF,EAAA,MAAM,MAAM,YAAA,EAAa;AACzB,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,IAAI,OAAA,CAAQ,GAAG,GAAG,MAAM,OAAA;AAClD,IAAA;AAAA,EACF;AAIA,EAAA,KAAA,MAAW,SAAA,IAAa,KAAK,MAAM,SAAA;AACrC;AAGO,SAAS,aAAa,GAAA,EAAuB;AAClD,EAAA,OAAO,CAAC,GAAG,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAClC;AAGO,SAAS,kBAAkB,GAAA,EAAqB;AACrD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAA,IAAK,gBAAA,CAAiB,GAAG,CAAA,EAAG,CAAA,EAAA;AACvC,EAAA,OAAO,CAAA;AACT","file":"index.js","sourcesContent":["import { nanoid } from \"nanoid\"\n\n/** Length of the unique part of a generated record id. */\nexport const UNIQUE_ID_LENGTH = 21\n\n/** Generate a URL-safe unique id (21 chars by default). */\nexport function uniqueId(size: number = UNIQUE_ID_LENGTH): string {\n return nanoid(size)\n}\n\n/**\n * A branded string id. The brand carries the record type so that ids of\n * different record types cannot be mixed up at compile time.\n */\nexport type RecordId<R extends UnknownRecord> = string & { __type__: R }\n\n/** Every record has an id and a type name. */\nexport interface BaseRecord<TypeName extends string, Id extends RecordId<UnknownRecord>> {\n readonly id: Id\n readonly typeName: TypeName\n}\n\nexport type UnknownRecord = BaseRecord<string, RecordId<UnknownRecord>>\n\nexport type IdOf<R extends UnknownRecord> = R[\"id\"]\n\n/** Extract the record type an id refers to. */\nexport type RecordFromId<K extends RecordId<UnknownRecord>> = K extends RecordId<infer R> ? R : never\n\n/**\n * Where a record lives:\n * - `document`: persisted, shared between collaborators (shapes, pages, ...)\n * - `session`: persisted locally only (camera, current page, ...)\n * - `presence`: shared but never persisted (cursors, ...)\n */\nexport type RecordScope = \"document\" | \"session\" | \"presence\"\n\nexport interface StoreValidator<R extends UnknownRecord> {\n validate(record: unknown): R\n /**\n * Optional fast path: validate `newRecord` knowing that `knownGoodVersion`\n * is a valid record of the same type. Implementations may skip the parts\n * that did not change.\n *\n * Declared as a property that may be `undefined` rather than as an optional\n * method, so that a validator carrying an explicit `undefined` — which is\n * what a class with an optional constructor argument produces — still\n * satisfies this under `exactOptionalPropertyTypes`.\n */\n validateUsingKnownGoodVersion?: ((knownGoodVersion: R, newRecord: unknown) => R) | undefined\n}\n\n/** Keys of `R` that hold data (everything except `id` and `typeName`). */\nexport type RecordDataKeys<R extends UnknownRecord> = Exclude<keyof R, \"id\" | \"typeName\">\n\nexport type EphemeralKeys<R extends UnknownRecord> = { readonly [K in RecordDataKeys<R>]: boolean }\n\nexport interface RecordTypeConfig<R extends UnknownRecord> {\n readonly scope: RecordScope\n readonly validator?: StoreValidator<R> | undefined\n /**\n * Keys whose changes should not be considered \"real\" document changes,\n * e.g. transient UI flags. Used by `Store.applyDiff({ ignoreEphemeralKeys })`.\n */\n readonly ephemeralKeys?: EphemeralKeys<R> | undefined\n}\n\n/**\n * Properties the caller must pass to `create()`: the record's data keys minus\n * whatever `withDefaultProperties` provides. `id` is always optional.\n */\nexport type RecordCreateProps<R extends UnknownRecord, RequiredProps extends keyof R> = Pick<\n R,\n RequiredProps\n> &\n Partial<Omit<R, RequiredProps | \"typeName\">>\n\n/**\n * Describes one kind of record in the store: how to make ids, defaults,\n * validation, and where the record lives (its scope).\n */\nexport class RecordType<R extends UnknownRecord, RequiredProps extends keyof R = RecordDataKeys<R>> {\n readonly typeName: R[\"typeName\"]\n readonly scope: RecordScope\n readonly validator: StoreValidator<R> | undefined\n readonly ephemeralKeys: EphemeralKeys<R> | undefined\n readonly ephemeralKeySet: ReadonlySet<string>\n\n constructor(\n typeName: R[\"typeName\"],\n private readonly config: RecordTypeConfig<R> & {\n readonly createDefaultProperties: () => Partial<Omit<R, \"id\" | \"typeName\">>\n },\n ) {\n this.typeName = typeName\n this.scope = config.scope\n this.validator = config.validator\n this.ephemeralKeys = config.ephemeralKeys\n const ephemeral = new Set<string>()\n if (config.ephemeralKeys) {\n for (const [key, value] of Object.entries(config.ephemeralKeys)) {\n if (value) ephemeral.add(key)\n }\n }\n this.ephemeralKeySet = ephemeral\n }\n\n /** Create a new record with defaults applied. A fresh id is generated when none is given. */\n create(properties: RecordCreateProps<R, RequiredProps>): R {\n const result: Record<string, unknown> = {\n ...this.config.createDefaultProperties(),\n ...(properties as Record<string, unknown>),\n }\n if (result[\"id\"] === undefined) result[\"id\"] = this.createId()\n result[\"typeName\"] = this.typeName\n return result as R\n }\n\n /** Shallow-clone a record (props/meta are shared). */\n clone(record: R): R {\n return { ...record }\n }\n\n /** Make an id of this type: `${typeName}:${uniquePart}`. */\n createId(customUniquePart?: string): IdOf<R> {\n return `${this.typeName}:${customUniquePart ?? uniqueId()}` as IdOf<R>\n }\n\n /** Recover the unique part of an id of this type. */\n parseId(id: IdOf<R>): string {\n if (!this.isId(id)) {\n throw new Error(`Id ${JSON.stringify(id)} is not a ${this.typeName} id`)\n }\n return (id as string).slice(this.typeName.length + 1)\n }\n\n isId(id?: string): id is IdOf<R> {\n if (typeof id !== \"string\") return false\n if (id.length <= this.typeName.length + 1) return false\n if (id.charCodeAt(this.typeName.length) !== 58 /* ':' */) return false\n return id.startsWith(this.typeName)\n }\n\n isInstance(record?: unknown): record is R {\n return (\n typeof record === \"object\" &&\n record !== null &&\n (record as { typeName?: unknown }).typeName === this.typeName\n )\n }\n\n /**\n * Return a new RecordType whose `create()` fills in the given defaults, so\n * those properties become optional for callers.\n */\n withDefaultProperties<DefaultProps extends RecordDataKeys<R>>(\n createDefaultProperties: () => Pick<R, DefaultProps>,\n ): RecordType<R, Exclude<RequiredProps, DefaultProps>> {\n return new RecordType<R, Exclude<RequiredProps, DefaultProps>>(this.typeName, {\n scope: this.scope,\n validator: this.validator,\n ephemeralKeys: this.ephemeralKeys,\n createDefaultProperties: createDefaultProperties as () => Partial<Omit<R, \"id\" | \"typeName\">>,\n })\n }\n\n /** Run the validator (if any). Throws on invalid input. */\n validate(record: unknown, recordBefore?: R): R {\n if (!this.validator) return record as R\n if (recordBefore !== undefined && this.validator.validateUsingKnownGoodVersion) {\n return this.validator.validateUsingKnownGoodVersion(recordBefore, record)\n }\n return this.validator.validate(record)\n }\n}\n\n/**\n * Define a record type.\n *\n * ```ts\n * const Book = createRecordType<Book>('book', { scope: 'document' })\n * .withDefaultProperties(() => ({ inStock: true }))\n * const b = Book.create({ title: 'Dune' }) // -> { id: 'book:...', typeName: 'book', title, inStock }\n * ```\n */\nexport function createRecordType<R extends UnknownRecord>(\n typeName: R[\"typeName\"],\n config: RecordTypeConfig<R>,\n): RecordType<R, RecordDataKeys<R>> {\n return new RecordType<R, RecordDataKeys<R>>(typeName, {\n scope: config.scope,\n validator: config.validator,\n ephemeralKeys: config.ephemeralKeys,\n createDefaultProperties: () => ({}),\n })\n}\n\n/** Split any `${typeName}:${unique}` id into its parts. */\nexport function parseRecordId(id: string): { typeName: string; uniquePart: string } {\n const colon = id.indexOf(\":\")\n if (colon <= 0 || colon === id.length - 1) {\n throw new Error(`Malformed record id ${JSON.stringify(id)}`)\n }\n return { typeName: id.slice(0, colon), uniquePart: id.slice(colon + 1) }\n}\n\n/** Assert that `value` looks like a record: an object with string `id` and `typeName`. */\nexport function isRecordLike(value: unknown): value is UnknownRecord {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { id?: unknown }).id === \"string\" &&\n typeof (value as { typeName?: unknown }).typeName === \"string\"\n )\n}\n","import { generateKeyBetween, generateNKeysBetween } from \"fractional-indexing\"\n\n/**\n * A fractional index: an order key that sorts lexicographically (plain string\n * comparison) and between which new keys can always be generated.\n */\nexport type IndexKey = string & { __brand: \"indexKey\" }\n\n/** The conventional first key. */\nexport const ZERO_INDEX_KEY = \"a0\" as IndexKey\n\nfunction assertOrdered(below: IndexKey | undefined, above: IndexKey | undefined) {\n if (below !== undefined && above !== undefined && !(below < above)) {\n throw new Error(`Index keys out of order: ${JSON.stringify(below)} must be below ${JSON.stringify(above)}`)\n }\n}\n\n/** Generate a key strictly between `below` and `above`; either may be omitted. Throws when `below >= above`. */\nexport function getIndexBetween(below?: IndexKey | undefined, above?: IndexKey | undefined): IndexKey {\n assertOrdered(below, above)\n return generateKeyBetween(below ?? null, above ?? null) as IndexKey\n}\n\n/** Generate a key strictly above `below` (or a first key when omitted). */\nexport function getIndexAbove(below?: IndexKey | undefined): IndexKey {\n return generateKeyBetween(below ?? null, null) as IndexKey\n}\n\n/** Generate a key strictly below `above` (or a first key when omitted). */\nexport function getIndexBelow(above?: IndexKey | undefined): IndexKey {\n return generateKeyBetween(null, above ?? null) as IndexKey\n}\n\n/** Generate `n` sorted keys strictly between `below` and `above`. */\nexport function getIndicesBetween(\n below: IndexKey | undefined,\n above: IndexKey | undefined,\n n: number,\n): IndexKey[] {\n assertOrdered(below, above)\n return generateNKeysBetween(below ?? null, above ?? null, n) as IndexKey[]\n}\n\n/** Generate `n` sorted keys strictly above `below`. */\nexport function getIndicesAbove(below: IndexKey | undefined, n: number): IndexKey[] {\n return generateNKeysBetween(below ?? null, null, n) as IndexKey[]\n}\n\n/** Generate `n` sorted keys strictly below `above`. */\nexport function getIndicesBelow(above: IndexKey | undefined, n: number): IndexKey[] {\n return generateNKeysBetween(null, above ?? null, n) as IndexKey[]\n}\n\n/**\n * Generate `n` sorted keys, the first of which is `start` (default `a0`).\n * Useful when creating `n` items at once.\n */\nexport function getIndices(n: number, start: IndexKey = ZERO_INDEX_KEY): IndexKey[] {\n if (n <= 0) return []\n validateIndexKey(start)\n return [start, ...getIndicesAbove(start, n - 1)]\n}\n\n/** Return a sorted copy of `items` ordered by their `index` (stable). */\nexport function sortByIndex<T extends { index: IndexKey }>(items: readonly T[]): T[] {\n return items\n .map((item, i) => [item, i] as const)\n .sort(([a, ai], [b, bi]) => {\n if (a.index < b.index) return -1\n if (a.index > b.index) return 1\n return ai - bi\n })\n .map(([item]) => item)\n}\n\n/** Compare two keys: negative, zero, or positive. */\nexport function compareIndexKeys(a: IndexKey, b: IndexKey): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\nconst BASE_62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nconst IS_DIGIT = new Uint8Array(128)\nfor (let i = 0; i < BASE_62.length; i++) IS_DIGIT[BASE_62.charCodeAt(i)] = 1\n\n/**\n * Length of the integer part (head marker included) encoded by a head\n * character, or -1 when the character is not a head marker.\n * `a`..`z` mark positive integer parts of length 2..27, `Z`..`A` negative ones.\n */\nfunction integerPartLength(head: number): number {\n if (head >= 97 && head <= 122) return head - 97 + 2 // a..z\n if (head >= 65 && head <= 90) return 90 - head + 2 // A..Z\n return -1\n}\n\n/**\n * Throws if `key` is not a well-formed fractional index key: a head marker,\n * enough base-62 integer digits for that head, then an optional fraction of\n * base-62 digits that does not end in `0`.\n * Narrows the type on success.\n */\nexport function validateIndexKey(key: string): asserts key is IndexKey {\n const fail = (why: string): never => {\n throw new Error(`Invalid index key ${JSON.stringify(key)}: ${why}`)\n }\n if (typeof key !== \"string\" || key.length === 0) fail(\"empty\")\n const intLen = integerPartLength(key.charCodeAt(0))\n if (intLen < 0) fail(\"bad head marker\")\n if (key.length < intLen) fail(`integer part needs ${intLen - 1} digits`)\n for (let i = 1; i < key.length; i++) {\n const c = key.charCodeAt(i)\n if (c > 127 || IS_DIGIT[c] !== 1) fail(`bad digit at ${i}`)\n }\n if (key.length > intLen && key.endsWith(\"0\")) fail(\"fraction ends in 0\")\n}\n\n/** Non-throwing variant of `validateIndexKey`. */\nexport function isIndexKey(key: unknown): key is IndexKey {\n if (typeof key !== \"string\") return false\n try {\n validateIndexKey(key)\n return true\n } catch {\n return false\n }\n}\n","import type { IndexKey } from \"./indexKey\"\n\n/**\n * Convert a fractional index key into a 64-bit unsigned sortable integer,\n * returned as two uint32 words `[lo, hi]` for transport into WASM memory.\n *\n * Key anatomy (fractional-indexing spec): the first character is a *head*\n * marker drawn from `A..Z` (negative integer parts, `Z` shortest) and `a..z`\n * (positive integer parts, `a` shortest). It encodes the length of the\n * integer part; the remaining characters are base-62 digits (integer digits\n * followed by fractional digits, no trailing `0` in the fraction).\n *\n * Because the head already sorts integer parts by length and sign, the\n * lexicographic order of two keys is: head rank first, then the digit string\n * compared as a zero-padded fixed-point fraction. We encode exactly that:\n *\n * zkey = headRank * 62^10 + Σ digit[i] * 62^(9 - i) for i in 0..9\n *\n * with headRank in 0..51 (`A`=0 … `Z`=25, `a`=26 … `z`=51). The maximum value\n * is 52 * 62^10 - 1 ≈ 4.36e18 < 2^64, so it fits in 64 bits. Ten base-62\n * digits after the head are significant; keys that agree on those ten digits\n * tie, which only happens for keys sharing a long common prefix.\n */\n\nconst BASE_62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nconst HEADS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n\n/** Number of base-62 digits (after the head marker) that affect the zkey. */\nexport const ZKEY_SIGNIFICANT_DIGITS = 10\n\nconst DIGIT_VALUE = new Int8Array(128).fill(-1)\nfor (let i = 0; i < BASE_62.length; i++) DIGIT_VALUE[BASE_62.charCodeAt(i)] = i\n\nconst HEAD_RANK = new Int8Array(128).fill(-1)\nfor (let i = 0; i < HEADS.length; i++) HEAD_RANK[HEADS.charCodeAt(i)] = i\n\nconst B = 62n\nconst B10 = B ** BigInt(ZKEY_SIGNIFICANT_DIGITS)\nconst MASK_32 = 0xffff_ffffn\n\nexport type ZKey = readonly [lo: number, hi: number]\n\nexport function indexKeyToZKey(key: IndexKey): [lo: number, hi: number] {\n if (key.length === 0) throw new Error(\"Cannot convert an empty index key\")\n const headRank = HEAD_RANK[key.charCodeAt(0)] ?? -1\n if (headRank < 0) throw new Error(`Invalid index key head in ${JSON.stringify(key)}`)\n\n let fraction = 0n\n const n = Math.min(key.length - 1, ZKEY_SIGNIFICANT_DIGITS)\n for (let i = 0; i < n; i++) {\n const d = DIGIT_VALUE[key.charCodeAt(i + 1)] ?? -1\n if (d < 0) throw new Error(`Invalid index key digit in ${JSON.stringify(key)}`)\n fraction = fraction * B + BigInt(d)\n }\n // Pad remaining digit positions with zero so shorter keys sort first.\n for (let i = n; i < ZKEY_SIGNIFICANT_DIGITS; i++) fraction *= B\n\n const value = BigInt(headRank) * B10 + fraction\n const lo = Number(value & MASK_32)\n const hi = Number((value >> 32n) & MASK_32)\n return [lo, hi]\n}\n\n/** Recombine a zkey into a BigInt (mostly for tests and debugging). */\nexport function zKeyToBigInt([lo, hi]: ZKey): bigint {\n return (BigInt(hi) << 32n) | BigInt(lo)\n}\n\n/** Compare two zkeys as unsigned 64-bit integers. */\nexport function compareZKeys(a: ZKey, b: ZKey): number {\n if (a[1] !== b[1]) return a[1] < b[1] ? -1 : 1\n if (a[0] !== b[0]) return a[0] < b[0] ? -1 : 1\n return 0\n}\n","import type { IdOf, UnknownRecord } from \"./ids\"\n\n/** A set of changes to a store's records. */\nexport interface RecordsDiff<R extends UnknownRecord> {\n added: Record<IdOf<R>, R>\n updated: Record<IdOf<R>, [from: R, to: R]>\n removed: Record<IdOf<R>, R>\n}\n\nexport function createEmptyRecordsDiff<R extends UnknownRecord>(): RecordsDiff<R> {\n return { added: {}, updated: {}, removed: {} } as RecordsDiff<R>\n}\n\nexport function isRecordsDiffEmpty<R extends UnknownRecord>(diff: RecordsDiff<R>): boolean {\n for (const _ in diff.added) return false\n for (const _ in diff.updated) return false\n for (const _ in diff.removed) return false\n return true\n}\n\n/** Produce the diff that undoes `diff`. */\nexport function reverseRecordsDiff<R extends UnknownRecord>(diff: RecordsDiff<R>): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const id in diff.added) {\n result.removed[id as IdOf<R>] = diff.added[id as IdOf<R>]!\n }\n for (const id in diff.removed) {\n result.added[id as IdOf<R>] = diff.removed[id as IdOf<R>]!\n }\n for (const id in diff.updated) {\n const [from, to] = diff.updated[id as IdOf<R>]!\n result.updated[id as IdOf<R>] = [to, from]\n }\n return result\n}\n\n/**\n * Record that `id` went from `before` to `after` in `target`, collapsing with\n * any change already recorded for the same id:\n *\n * added + updated -> added (latest)\n * added + removed -> (nothing)\n * updated + updated -> updated [original from, latest to]\n * updated + removed -> removed (original from)\n * removed + added -> updated [removed, added] (or nothing if identical)\n */\nexport function applyChangeToDiff<R extends UnknownRecord>(\n target: RecordsDiff<R>,\n id: IdOf<R>,\n before: R | undefined,\n after: R | undefined,\n): void {\n if (before === undefined && after === undefined) return\n\n if (id in target.added) {\n if (after === undefined) {\n delete target.added[id]\n } else {\n target.added[id] = after\n }\n return\n }\n\n if (id in target.updated) {\n const [from] = target.updated[id]!\n if (after === undefined) {\n delete target.updated[id]\n target.removed[id] = from\n } else if (from === after) {\n delete target.updated[id]\n } else {\n target.updated[id] = [from, after]\n }\n return\n }\n\n if (id in target.removed) {\n const original = target.removed[id]!\n if (after === undefined) return // removed twice: keep original\n delete target.removed[id]\n if (original !== after) target.updated[id] = [original, after]\n return\n }\n\n // No prior entry for this id.\n if (before === undefined) {\n if (after !== undefined) target.added[id] = after\n } else if (after === undefined) {\n target.removed[id] = before\n } else if (before !== after) {\n target.updated[id] = [before, after]\n }\n}\n\n/** Merge `diff` into `target` in place (see `applyChangeToDiff` for the rules). */\nexport function squashRecordDiffsMutable<R extends UnknownRecord>(\n target: RecordsDiff<R>,\n diff: RecordsDiff<R>,\n): void {\n for (const id in diff.added) {\n applyChangeToDiff(target, id as IdOf<R>, undefined, diff.added[id as IdOf<R>]!)\n }\n for (const id in diff.updated) {\n const [from, to] = diff.updated[id as IdOf<R>]!\n applyChangeToDiff(target, id as IdOf<R>, from, to)\n }\n for (const id in diff.removed) {\n applyChangeToDiff(target, id as IdOf<R>, diff.removed[id as IdOf<R>]!, undefined)\n }\n}\n\n/** Squash a sequence of diffs into one equivalent diff (does not mutate inputs). */\nexport function squashRecordDiffs<R extends UnknownRecord>(diffs: readonly RecordsDiff<R>[]): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const diff of diffs) squashRecordDiffsMutable(result, diff)\n return result\n}\n\n/** Shallow-copy a diff (entries are shared). */\nexport function cloneRecordsDiff<R extends UnknownRecord>(diff: RecordsDiff<R>): RecordsDiff<R> {\n return {\n added: { ...diff.added },\n updated: { ...diff.updated },\n removed: { ...diff.removed },\n } as RecordsDiff<R>\n}\n","import type { IdOf, UnknownRecord } from \"./ids\"\nimport type { SerializedSchemaV1 } from \"./legacy\"\n\n/** Serialized records keyed by id. */\nexport type SerializedStore<R extends UnknownRecord> = Record<IdOf<R>, R>\n\n/**\n * Persisted description of a schema: for each migration sequence, how many\n * migrations had been applied when the data was saved.\n */\nexport interface SerializedSchemaV2 {\n schemaVersion: 2\n sequences: { [sequenceId: string]: number }\n}\n\n/**\n * A persisted schema, in either format mocanvas can read.\n *\n * Only {@link SerializedSchemaV2} is ever *written* — see\n * `StoreSchema.serialize`. The v1 arm is here so a document saved by an older,\n * pre-sequence writer is still loadable rather than being rejected as\n * \"unsupported schema version\".\n */\nexport type SerializedSchema = SerializedSchemaV1 | SerializedSchemaV2\n\nexport type MigrationId = `${string}/${number}`\n\nexport interface RecordMigration {\n readonly id: MigrationId\n readonly scope: \"record\"\n /** Only records for which this returns true are migrated. Defaults to all records. */\n readonly filter?: ((record: UnknownRecord) => boolean) | undefined\n /** Mutate the record in place, or return a replacement. */\n readonly up: (record: UnknownRecord) => void | UnknownRecord\n readonly down?: ((record: UnknownRecord) => void | UnknownRecord) | undefined\n}\n\nexport interface StoreMigration {\n readonly id: MigrationId\n readonly scope: \"store\"\n /** Mutate the store in place, or return a replacement. */\n readonly up: (store: SerializedStore<UnknownRecord>) => void | SerializedStore<UnknownRecord>\n readonly down?:\n | ((store: SerializedStore<UnknownRecord>) => void | SerializedStore<UnknownRecord>)\n | undefined\n}\n\nexport type Migration = RecordMigration | StoreMigration\n\nexport interface MigrationSequence {\n readonly sequenceId: string\n /**\n * When data is loaded that has never seen this sequence, should every\n * migration be applied (`true`, the default) or should the data be assumed\n * already up to date (`false`)? Use `false` for sequences added to a type\n * that already existed before the sequence did.\n */\n readonly retroactive: boolean\n readonly sequence: readonly Migration[]\n}\n\nexport type MigrationResult<T> = { type: \"success\"; value: T } | { type: \"error\"; reason: string }\n\n/**\n * Build the ids of a sequence's migrations from friendly names:\n *\n * ```ts\n * const Versions = createMigrationIds('com.example.shape.box', { AddColor: 1, AddSize: 2 })\n * // Versions.AddColor === 'com.example.shape.box/1'\n * ```\n */\nexport function createMigrationIds<const ID extends string, const Versions extends Record<string, number>>(\n sequenceId: ID,\n versions: Versions,\n): { readonly [K in keyof Versions]: `${ID}/${Versions[K]}` } {\n const result: Record<string, string> = {}\n for (const [name, version] of Object.entries(versions)) {\n result[name] = `${sequenceId}/${version}`\n }\n return result as { readonly [K in keyof Versions]: `${ID}/${Versions[K]}` }\n}\n\nexport function parseMigrationId(id: string): { sequenceId: string; version: number } {\n const slash = id.lastIndexOf(\"/\")\n if (slash <= 0) throw new Error(`Malformed migration id ${JSON.stringify(id)}`)\n const version = Number(id.slice(slash + 1))\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(`Malformed migration id ${JSON.stringify(id)}: version must be a positive integer`)\n }\n return { sequenceId: id.slice(0, slash), version }\n}\n\n/**\n * Create a validated migration sequence. Migration ids must be\n * `${sequenceId}/1`, `${sequenceId}/2`, ... in order.\n */\nexport function createMigrationSequence(options: {\n sequenceId: string\n retroactive?: boolean | undefined\n sequence: readonly Migration[]\n}): MigrationSequence {\n const { sequenceId, retroactive = true, sequence } = options\n if (!sequenceId || sequenceId.includes(\"/\")) {\n throw new Error(`Invalid sequenceId ${JSON.stringify(sequenceId)}: must be non-empty and not contain \"/\"`)\n }\n sequence.forEach((migration, i) => {\n const id = migration.id\n const parsed = parseMigrationId(id)\n if (parsed.sequenceId !== sequenceId) {\n throw new Error(`Migration ${id} does not belong to sequence ${sequenceId}`)\n }\n if (parsed.version !== i + 1) {\n throw new Error(`Migration ${id} is out of order: expected version ${i + 1}`)\n }\n const scope: string = migration.scope\n if (scope !== \"record\" && scope !== \"store\") {\n throw new Error(`Migration ${id} has invalid scope ${JSON.stringify(scope)}`)\n }\n })\n return { sequenceId, retroactive, sequence: [...sequence] }\n}\n\n/**\n * Convenience for the common case: a sequence of record-scoped migrations\n * that all apply to one record type (optionally narrowed further by `filter`).\n */\nexport function createRecordMigrationSequence(options: {\n sequenceId: string\n recordType: string\n retroactive?: boolean | undefined\n filter?: ((record: UnknownRecord) => boolean) | undefined\n sequence: readonly Omit<RecordMigration, \"scope\" | \"filter\">[]\n}): MigrationSequence {\n const { recordType, filter } = options\n const combinedFilter = (record: UnknownRecord) =>\n record.typeName === recordType && (filter ? filter(record) : true)\n return createMigrationSequence({\n sequenceId: options.sequenceId,\n retroactive: options.retroactive,\n sequence: options.sequence.map(\n (m): RecordMigration => ({ id: m.id, scope: \"record\", filter: combinedFilter, up: m.up, down: m.down }),\n ),\n })\n}\n\n/** Apply one record migration to a single record, honoring its filter. */\nexport function applyRecordMigration(\n migration: RecordMigration,\n record: UnknownRecord,\n direction: \"up\" | \"down\",\n): UnknownRecord {\n if (migration.filter && !migration.filter(record)) return record\n const fn = direction === \"up\" ? migration.up : migration.down\n if (!fn) throw new Error(`Migration ${migration.id} has no ${direction} function`)\n const result = fn(record)\n return result === undefined ? record : result\n}\n\n/** Apply one migration (record- or store-scoped) to a whole store in place. */\nexport function applyMigrationToStore(\n migration: Migration,\n store: SerializedStore<UnknownRecord>,\n direction: \"up\" | \"down\",\n): SerializedStore<UnknownRecord> {\n if (migration.scope === \"store\") {\n const fn = direction === \"up\" ? migration.up : migration.down\n if (!fn) throw new Error(`Migration ${migration.id} has no ${direction} function`)\n const result = fn(store)\n return result === undefined ? store : result\n }\n for (const id in store) {\n const record = store[id as IdOf<UnknownRecord>]!\n const next = applyRecordMigration(migration, record, direction)\n if (next !== record) store[id as IdOf<UnknownRecord>] = next\n }\n return store\n}\n","/**\n * The pre-sequence migration format, and the reasons a migration can fail.\n *\n * Before migrations were named sequences, a schema declared one integer version\n * per record type plus one for the store, and a table of numbered up/down\n * functions between them. mocanvas never *writes* that format — {@link\n * SerializedSchemaV1} exists so a document saved by something that did can\n * still be recognised and loaded, and so a schema written against the old shape\n * can still be described.\n *\n * Nothing here changes what mocanvas persists. See `StoreSchema.serialize`,\n * which always produces the v2 shape.\n */\n\nimport type { UnknownRecord } from \"./ids\"\n\n/**\n * The persisted schema shape used before migration sequences: a version number\n * per record type, and one for the store as a whole.\n *\n * Read-only as far as mocanvas is concerned. A snapshot carrying one is treated\n * as knowing none of today's sequences, so every retroactive sequence runs from\n * the beginning — which is right, because none of them existed when the file\n * was written.\n */\nexport interface SerializedSchemaV1 {\n schemaVersion: 1\n storeVersion: number\n recordVersions: Record<\n string,\n { version: number } | { version: number; subTypeVersions: Record<string, number>; subTypeKey: string }\n >\n}\n\n/** Whether a persisted schema is in the pre-sequence format. */\nexport function isSerializedSchemaV1(schema: { schemaVersion: number }): schema is SerializedSchemaV1 {\n return schema.schemaVersion === 1\n}\n\n/** One numbered step of a {@link LegacyMigrations} table. */\nexport interface LegacyMigration<Before = any, After = any> {\n up: (oldState: Before) => After\n down: (newState: After) => Before\n}\n\n/** The version bounds every legacy migration table declares. */\nexport interface LegacyBaseMigrationsInfo {\n firstVersion: number\n currentVersion: number\n migrators: { [version: number]: LegacyMigration }\n}\n\n/**\n * A legacy migration table: the version range it covers, the numbered steps,\n * and optionally the sub-type split a record type used (a shape's `type`, say,\n * each with its own version line).\n */\nexport interface LegacyMigrations extends LegacyBaseMigrationsInfo {\n subTypeKey?: string\n subTypeMigrations?: Record<string, LegacyBaseMigrationsInfo>\n}\n\n/**\n * A dependency declared by a standalone migration sequence: it must run after\n * (or before) another sequence's numbered migration, even though neither owns\n * the other.\n *\n * Ordering between sequences is otherwise registration order, which is fine\n * until one sequence's `up` reads a field another sequence is still about to\n * add.\n */\nexport interface StandaloneDependsOn {\n dependsOn: readonly string[]\n}\n\n/**\n * Why loading a persisted snapshot failed.\n *\n * These are the cases worth telling apart in a UI: \"this file is from a newer\n * version of the app\" is a message a user can act on, and\n * \"migrationError\" is not.\n */\nexport const MigrationFailureReason = {\n /** The persisted schema names a sequence version higher than this schema knows. */\n TargetVersionTooNew: \"target-version-too-new\",\n /** The persisted data is older than the oldest migration that survives. */\n TargetVersionTooOld: \"target-version-too-old\",\n /** A record's type is not registered in this schema and cannot be migrated. */\n UnrecognizedType: \"unrecognized-type\",\n /** A migration function threw. */\n MigrationError: \"migration-error\",\n /** The persisted schema itself is malformed. */\n IncompatibleSubtype: \"incompatible-subtype\",\n /** The persisted schema version is not one this store understands. */\n UnknownSchemaVersion: \"unknown-schema-version\",\n} as const\n\n/** One of the {@link MigrationFailureReason} values. */\nexport type MigrationFailureReason = (typeof MigrationFailureReason)[keyof typeof MigrationFailureReason]\n","import type { IdOf, RecordScope, RecordType, UnknownRecord } from \"./ids\"\nimport {\n applyMigrationToStore,\n applyRecordMigration,\n type Migration,\n type MigrationResult,\n type MigrationSequence,\n type SerializedSchema,\n type SerializedSchemaV2,\n type SerializedStore,\n} from \"./migrate\"\nimport { isSerializedSchemaV1 } from \"./legacy\"\nimport type { Store } from \"./Store\"\n\nexport type StoreValidationPhase = \"initialize\" | \"createRecord\" | \"updateRecord\" | \"tests\"\n\nexport type RecordTypeMap<R extends UnknownRecord> = {\n readonly [TypeName in R[\"typeName\"]]: RecordType<Extract<R, { typeName: TypeName }>, any>\n}\n\nexport interface StoreValidationFailure<R extends UnknownRecord> {\n error: unknown\n store: Store<R, any>\n record: R\n phase: StoreValidationPhase\n recordBefore: R | null\n}\n\nexport interface StoreSchemaOptions<R extends UnknownRecord, Props> {\n readonly migrations?: readonly MigrationSequence[] | undefined\n /**\n * Called when a record fails validation. Return a repaired record to keep\n * going, or throw to abort the operation. When omitted the error is thrown.\n */\n readonly onValidationFailure?: ((data: StoreValidationFailure<R>) => R) | undefined\n /** Reserved for store-level integrity checks; unused by the schema itself. */\n readonly createIntegrityChecker?: ((store: Store<R, Props>) => void) | undefined\n}\n\nexport interface StoreSnapshot<R extends UnknownRecord> {\n store: SerializedStore<R>\n schema: SerializedSchema\n}\n\n/**\n * The set of record types a store holds plus the migrations that bring\n * persisted data up to date.\n */\nexport class StoreSchema<R extends UnknownRecord, Props = unknown> {\n static create<R extends UnknownRecord, Props = unknown>(\n types: RecordTypeMap<R>,\n options?: StoreSchemaOptions<R, Props>,\n ): StoreSchema<R, Props> {\n return new StoreSchema<R, Props>(types, options ?? {})\n }\n\n readonly migrations: Readonly<Record<string, MigrationSequence>>\n /** All migrations in application order (sequence registration order, then version). */\n readonly sortedMigrations: readonly Migration[]\n private readonly typeByName: ReadonlyMap<string, RecordType<R, any>>\n\n private constructor(\n readonly types: RecordTypeMap<R>,\n private readonly options: StoreSchemaOptions<R, Props>,\n ) {\n const byName = new Map<string, RecordType<R, any>>()\n for (const [name, type] of Object.entries(types) as [string, RecordType<R, any>][]) {\n if (type.typeName !== name) {\n throw new Error(`Record type registered under \"${name}\" has typeName \"${type.typeName}\"`)\n }\n byName.set(name, type)\n }\n this.typeByName = byName\n\n const migrations: Record<string, MigrationSequence> = {}\n const sorted: Migration[] = []\n const seenIds = new Set<string>()\n for (const sequence of options.migrations ?? []) {\n if (migrations[sequence.sequenceId]) {\n throw new Error(`Duplicate migration sequence \"${sequence.sequenceId}\"`)\n }\n migrations[sequence.sequenceId] = sequence\n for (const migration of sequence.sequence) {\n if (seenIds.has(migration.id)) throw new Error(`Duplicate migration id \"${migration.id}\"`)\n seenIds.add(migration.id)\n sorted.push(migration)\n }\n }\n this.migrations = migrations\n this.sortedMigrations = sorted\n }\n\n getType(typeName: string): RecordType<R, any> | undefined {\n return this.typeByName.get(typeName)\n }\n\n /** Scope of a record type; unknown types are treated as `document`. */\n getScope(typeName: string): RecordScope {\n return this.typeByName.get(typeName)?.scope ?? \"document\"\n }\n\n /**\n * Validate a record, delegating to its record type's validator. Records of\n * unknown types are passed through untouched so that foreign data survives\n * a load/save round-trip.\n */\n validateRecord(\n store: Store<R, any>,\n record: R,\n phase: StoreValidationPhase,\n recordBefore: R | undefined,\n ): R {\n const type = this.typeByName.get(record.typeName)\n if (!type) return record\n try {\n return type.validate(record, recordBefore)\n } catch (error) {\n if (this.options.onValidationFailure) {\n return this.options.onValidationFailure({\n error,\n store,\n record,\n phase,\n recordBefore: recordBefore ?? null,\n })\n }\n throw error\n }\n }\n\n /** The current version of every sequence. Always the v2 shape — mocanvas never writes v1. */\n serialize(): SerializedSchemaV2 {\n const sequences: Record<string, number> = {}\n for (const sequence of Object.values(this.migrations)) {\n sequences[sequence.sequenceId] = sequence.sequence.length\n }\n return { schemaVersion: 2, sequences }\n }\n\n /** A schema at version 0 of every sequence (all migrations still pending). */\n serializeEarliestVersion(): SerializedSchemaV2 {\n const sequences: Record<string, number> = {}\n for (const sequence of Object.values(this.migrations)) sequences[sequence.sequenceId] = 0\n return { schemaVersion: 2, sequences }\n }\n\n /**\n * The migrations that must run to bring data saved under `persistedSchema`\n * up to this schema, in order. Sequences the persisted schema knows but we\n * do not are ignored with a warning.\n */\n getMigrationsSince(persistedSchema: SerializedSchema): MigrationResult<Migration[]> {\n // A pre-sequence schema records one version number per record type and\n // says nothing about which of today's sequences have run. There is no\n // sound mapping from that to sequence versions, and guessing would\n // re-apply migrations that had already been applied — so this is refused\n // rather than migrated. `SerializedSchemaV1` exists so such a file can be\n // *recognised* and reported, not silently corrupted.\n if (isSerializedSchemaV1(persistedSchema)) {\n return {\n type: \"error\",\n reason:\n \"Schema version 1 (per-record-type versions) predates migration sequences and cannot be migrated automatically\",\n }\n }\n if (persistedSchema.schemaVersion !== 2) {\n return {\n type: \"error\",\n reason: `Unsupported schema version ${String((persistedSchema as { schemaVersion: unknown }).schemaVersion)}`,\n }\n }\n return this.migrationsSince(persistedSchema.sequences ?? {})\n }\n\n private migrationsSince(persisted: { [sequenceId: string]: number }): MigrationResult<Migration[]> {\n for (const sequenceId of Object.keys(persisted)) {\n if (!this.migrations[sequenceId]) {\n console.warn(`[store] ignoring unknown migration sequence \"${sequenceId}\" in persisted schema`)\n }\n }\n\n const result: Migration[] = []\n for (const sequence of Object.values(this.migrations)) {\n const persistedVersion = persisted[sequence.sequenceId]\n let startAt: number\n if (persistedVersion === undefined) {\n if (!sequence.retroactive) continue\n startAt = 0\n } else {\n if (!Number.isInteger(persistedVersion) || persistedVersion < 0) {\n return { type: \"error\", reason: `Invalid version ${String(persistedVersion)} for sequence \"${sequence.sequenceId}\"` }\n }\n if (persistedVersion > sequence.sequence.length) {\n return {\n type: \"error\",\n reason: `Sequence \"${sequence.sequenceId}\" is at version ${persistedVersion} but this schema only knows ${sequence.sequence.length}: data comes from a newer version`,\n }\n }\n startAt = persistedVersion\n }\n for (let i = startAt; i < sequence.sequence.length; i++) result.push(sequence.sequence[i]!)\n }\n return { type: \"success\", value: result }\n }\n\n /**\n * Migrate a single record. Only record-scoped migrations can be applied;\n * encountering a store-scoped one is an error. `down` runs the migrations\n * in reverse (from this schema to `persistedSchema`).\n */\n migratePersistedRecord(\n record: UnknownRecord,\n persistedSchema: SerializedSchema,\n direction: \"up\" | \"down\" = \"up\",\n ): MigrationResult<UnknownRecord> {\n const migrations = this.getMigrationsSince(persistedSchema)\n if (migrations.type === \"error\") return migrations\n const ordered = direction === \"up\" ? migrations.value : [...migrations.value].reverse()\n let current: UnknownRecord = structuredClone(record)\n try {\n for (const migration of ordered) {\n if (migration.scope !== \"record\") {\n return { type: \"error\", reason: `Migration ${migration.id} is store-scoped and cannot be applied to a single record` }\n }\n if (direction === \"down\" && !migration.down) {\n return { type: \"error\", reason: `Migration ${migration.id} has no down migration` }\n }\n current = applyRecordMigration(migration, current, direction)\n }\n } catch (error) {\n return { type: \"error\", reason: `Migration failed: ${error instanceof Error ? error.message : String(error)}` }\n }\n return { type: \"success\", value: current }\n }\n\n /**\n * Bring a whole persisted store up to date. The input is not mutated.\n * Records of types this schema does not know are preserved as-is.\n */\n migrateStoreSnapshot(snapshot: StoreSnapshot<R>): MigrationResult<SerializedStore<R>> {\n const migrations = this.getMigrationsSince(snapshot.schema)\n if (migrations.type === \"error\") return migrations\n\n let store: SerializedStore<UnknownRecord> = structuredClone(snapshot.store)\n if (migrations.value.length === 0) return { type: \"success\", value: store as SerializedStore<R> }\n\n try {\n for (const migration of migrations.value) {\n store = applyMigrationToStore(migration, store, \"up\")\n }\n } catch (error) {\n return { type: \"error\", reason: `Migration failed: ${error instanceof Error ? error.message : String(error)}` }\n }\n\n // Migrations must not change a record's id or lose it.\n for (const id in store) {\n const record = store[id as IdOf<UnknownRecord>]\n if (!record || record.id !== id) {\n return { type: \"error\", reason: `Migration produced a record whose id does not match its key (${id})` }\n }\n }\n return { type: \"success\", value: store as SerializedStore<R> }\n }\n}\n","/**\n * Declarative queries over the store, and the incremental indexes they run on.\n *\n * A query is a plain object — `{ type: { eq: \"geo\" }, parentId: { eq: pageId } }`\n * — rather than a predicate function, and that is the point: an object can be\n * inspected. The store picks one of the query's properties, maintains an index\n * from that property's value to the ids that hold it, and answers the query by\n * intersecting index buckets instead of scanning every record. A predicate can\n * only be run over everything.\n *\n * The index is itself a signal, and it carries diffs: a dependent that already\n * built a result can patch it from {@link RSIndexDiff} rather than rebuilding.\n */\n\nimport type { IdOf, UnknownRecord } from \"./ids\"\n\n/**\n * What changed in a set: the members added and the members removed.\n *\n * Either side may be absent, which means \"nothing on that side\" — a diff with\n * neither is a diff that says nothing happened.\n */\nexport interface CollectionDiff<T> {\n added?: Set<T>\n removed?: Set<T>\n}\n\n/**\n * How one property of a record is matched.\n *\n * SEMANTICS-ASSUMED: three comparisons — equality, inequality and a numeric\n * greater-than — are what an index can answer without scanning, which is the\n * whole reason queries are data rather than functions. `gt` is deliberately\n * numeric: the only ordered property records carry is a number.\n */\nexport type QueryValueMatcher<T> = { eq: T } | { neq: T } | { gt: number }\n\n/**\n * A query over the records of one type: property name to matcher, every entry\n * of which must hold (they are ANDed).\n *\n * ```ts\n * store.query.records(\"shape\", () => ({ type: { eq: \"geo\" }, isLocked: { eq: false } }))\n * ```\n */\nexport type QueryExpression<R extends object> = {\n [K in keyof R]?: QueryValueMatcher<R[K]>\n}\n\n/**\n * An index over one property of one record type: for each value that property\n * takes, the ids of the records that hold it.\n */\nexport type RSIndexMap<R extends UnknownRecord, Property extends keyof R & string = keyof R & string> = Map<\n R[Property],\n Set<IdOf<R>>\n>\n\n/** How an {@link RSIndexMap} changed: per property value, which ids joined and left. */\nexport type RSIndexDiff<R extends UnknownRecord, Property extends keyof R & string = keyof R & string> = Map<\n R[Property],\n CollectionDiff<IdOf<R>>\n>\n\n/**\n * A live index over one property, as a diff-carrying signal.\n *\n * Reading it gives the current {@link RSIndexMap}; asking it for the diffs\n * since a past epoch gives {@link RSIndexDiff}s that describe how to get from\n * the old map to the new one.\n */\nexport type RSIndex<R extends UnknownRecord, Property extends keyof R & string = keyof R & string> = import(\"./_signals\").Computed<\n RSIndexMap<R, Property>,\n RSIndexDiff<R, Property>\n>\n\n/** Whether `value` satisfies `matcher`. */\nexport function matchesQueryValue<T>(matcher: QueryValueMatcher<T>, value: T): boolean {\n if (\"eq\" in matcher) return Object.is(matcher.eq, value)\n if (\"neq\" in matcher) return !Object.is(matcher.neq, value)\n return typeof value === \"number\" && value > matcher.gt\n}\n\n/** Whether `record` satisfies every entry of `query`. An empty query matches everything. */\nexport function matchesQuery<R extends object>(query: QueryExpression<R>, record: R): boolean {\n for (const key of Object.keys(query) as (keyof R)[]) {\n const matcher = query[key]\n if (matcher === undefined) continue\n if (!matchesQueryValue(matcher, record[key])) return false\n }\n return true\n}\n\n/**\n * The property this query can be answered from an index on, or `undefined`\n * when none of it is indexable.\n *\n * Only an `eq` clause narrows to a single index bucket; `neq` and `gt` still\n * need every bucket looked at, so they are no better than a scan. The first\n * `eq` wins — the remaining clauses are checked against the records it yields.\n */\nexport function getIndexablePropertyOf<R extends object>(query: QueryExpression<R>): (keyof R & string) | undefined {\n for (const key of Object.keys(query) as (keyof R & string)[]) {\n const matcher = query[key]\n if (matcher && \"eq\" in matcher) return key\n }\n return undefined\n}\n\n/** Apply a {@link CollectionDiff} to a set, in place. */\nexport function applyCollectionDiff<T>(set: Set<T>, diff: CollectionDiff<T>): Set<T> {\n if (diff.removed) for (const value of diff.removed) set.delete(value)\n if (diff.added) for (const value of diff.added) set.add(value)\n return set\n}\n\n/** Whether a {@link CollectionDiff} describes no change at all. */\nexport function isCollectionDiffEmpty<T>(diff: CollectionDiff<T>): boolean {\n return (diff.added?.size ?? 0) === 0 && (diff.removed?.size ?? 0) === 0\n}\n","import {\n atom,\n computed,\n isUninitialized,\n RESET_VALUE,\n transact,\n unsafe__withoutCapture,\n withDiff,\n type Atom,\n type Computed,\n} from \"./_signals\"\nimport type { IdOf, RecordFromId, RecordScope, RecordType, StoreValidator, UnknownRecord } from \"./ids\"\nimport { parseRecordId, uniqueId } from \"./ids\"\nimport {\n getIndexablePropertyOf,\n matchesQuery,\n type CollectionDiff,\n type QueryExpression,\n type RSIndex,\n type RSIndexDiff,\n type RSIndexMap,\n} from \"./query\"\nimport type { SerializedSchema, SerializedStore } from \"./migrate\"\nimport {\n applyChangeToDiff,\n createEmptyRecordsDiff,\n isRecordsDiffEmpty,\n squashRecordDiffs,\n type RecordsDiff,\n} from \"./RecordsDiff\"\nimport type { StoreSchema, StoreSnapshot, StoreValidationPhase } from \"./StoreSchema\"\n\nexport type ChangeSource = \"user\" | \"remote\"\n\nexport interface HistoryEntry<R extends UnknownRecord> {\n changes: RecordsDiff<R>\n source: ChangeSource\n}\n\nexport type StoreListener<R extends UnknownRecord> = (entry: HistoryEntry<R>) => void\n\nexport interface StoreListenerFilters {\n source: ChangeSource | \"all\"\n scope: RecordScope | \"all\"\n}\n\nexport type RecordFromTypeName<R extends UnknownRecord, T extends string> = Extract<R, { typeName: T }>\n\nexport type StoreRecord<S extends Store<any, any>> = S extends Store<infer R, any> ? R : never\n\n/**\n * Anything that owns a store: a `Store` itself, or an object holding one (an\n * `Editor`). Written for the helpers that want to accept either without their\n * callers having to reach for `.store`.\n */\nexport type StoreObject<R extends UnknownRecord = UnknownRecord> = Store<R, any> | { store: Store<R, any> }\n\n/** The record union of whatever store a {@link StoreObject} carries. */\nexport type StoreObjectRecordType<Context extends StoreObject<any>> = Context extends Store<infer R, any>\n ? R\n : Context extends { store: Store<infer R, any> }\n ? R\n : never\n\n/** A validator per record type, as `StoreSchema` collects them from the record types. */\nexport type StoreValidators<R extends UnknownRecord> = {\n [TypeName in R[\"typeName\"]]: StoreValidator<Extract<R, { typeName: TypeName }>>\n}\n\n/**\n * A record that failed validation, with enough context to say what was being\n * done to it at the time.\n *\n * Thrown rather than returned: a store that keeps going after writing an\n * invalid record is a store whose next save produces a file nothing can load.\n */\nexport interface StoreError {\n error: Error\n phase: \"initialize\" | \"createRecord\" | \"updateRecord\" | \"tests\"\n recordBefore?: unknown\n recordAfter: unknown\n isExistingValidationIssue: boolean\n}\n\nexport interface StoreOptions<R extends UnknownRecord, Props> {\n schema: StoreSchema<R, Props>\n initialData?: SerializedStore<R> | undefined\n props: Props\n id?: string | undefined\n}\n\n/* ------------------------------------------------------------------------ */\n/* side effects */\n/* ------------------------------------------------------------------------ */\n\nexport type StoreBeforeCreateHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => R\nexport type StoreAfterCreateHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void\nexport type StoreBeforeChangeHandler<R extends UnknownRecord> = (prev: R, next: R, source: ChangeSource) => R\nexport type StoreAfterChangeHandler<R extends UnknownRecord> = (prev: R, next: R, source: ChangeSource) => void\n/** Return `false` to veto the deletion. */\nexport type StoreBeforeDeleteHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void | false\nexport type StoreAfterDeleteHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void\nexport type StoreOperationCompleteHandler = (source: ChangeSource) => void\n\nexport interface StoreSideEffectHandlers<R extends UnknownRecord> {\n beforeCreate?: StoreBeforeCreateHandler<R> | undefined\n afterCreate?: StoreAfterCreateHandler<R> | undefined\n beforeChange?: StoreBeforeChangeHandler<R> | undefined\n afterChange?: StoreAfterChangeHandler<R> | undefined\n beforeDelete?: StoreBeforeDeleteHandler<R> | undefined\n afterDelete?: StoreAfterDeleteHandler<R> | undefined\n}\n\ninterface HandlerSets<R extends UnknownRecord> {\n beforeCreate: Set<StoreBeforeCreateHandler<R>>\n afterCreate: Set<StoreAfterCreateHandler<R>>\n beforeChange: Set<StoreBeforeChangeHandler<R>>\n afterChange: Set<StoreAfterChangeHandler<R>>\n beforeDelete: Set<StoreBeforeDeleteHandler<R>>\n afterDelete: Set<StoreAfterDeleteHandler<R>>\n}\n\n/**\n * Hooks that run around record writes. `before*` handlers may replace the\n * record being written (or veto a delete); `after*` handlers observe.\n * `operationComplete` handlers run once when the outermost operation ends,\n * before history listeners are notified.\n */\nexport class StoreSideEffects<R extends UnknownRecord> {\n private readonly byType = new Map<string, HandlerSets<R>>()\n private readonly operationComplete = new Set<StoreOperationCompleteHandler>()\n private enabled = true\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n setIsEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n private sets(typeName: string): HandlerSets<R> {\n let sets = this.byType.get(typeName)\n if (!sets) {\n sets = {\n beforeCreate: new Set(),\n afterCreate: new Set(),\n beforeChange: new Set(),\n afterChange: new Set(),\n beforeDelete: new Set(),\n afterDelete: new Set(),\n }\n this.byType.set(typeName, sets)\n }\n return sets\n }\n\n private add<K extends keyof HandlerSets<R>>(\n typeName: string,\n kind: K,\n handler: HandlerSets<R>[K] extends Set<infer H> ? H : never,\n ): () => void {\n const set = this.sets(typeName)[kind] as Set<unknown>\n set.add(handler)\n return () => {\n set.delete(handler)\n }\n }\n\n /** Register several handlers for several types at once. Returns a disposer for all of them. */\n register(handlers: {\n [T in R[\"typeName\"]]?: StoreSideEffectHandlers<RecordFromTypeName<R, T>>\n }): () => void {\n const disposers: (() => void)[] = []\n for (const [typeName, h] of Object.entries(handlers) as [string, StoreSideEffectHandlers<any> | undefined][]) {\n if (!h) continue\n if (h.beforeCreate) disposers.push(this.add(typeName, \"beforeCreate\", h.beforeCreate))\n if (h.afterCreate) disposers.push(this.add(typeName, \"afterCreate\", h.afterCreate))\n if (h.beforeChange) disposers.push(this.add(typeName, \"beforeChange\", h.beforeChange))\n if (h.afterChange) disposers.push(this.add(typeName, \"afterChange\", h.afterChange))\n if (h.beforeDelete) disposers.push(this.add(typeName, \"beforeDelete\", h.beforeDelete))\n if (h.afterDelete) disposers.push(this.add(typeName, \"afterDelete\", h.afterDelete))\n }\n return () => disposers.forEach((d) => d())\n }\n\n registerBeforeCreateHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeCreateHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeCreate\", handler as unknown as StoreBeforeCreateHandler<R>)\n }\n\n registerAfterCreateHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterCreateHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterCreate\", handler as unknown as StoreAfterCreateHandler<R>)\n }\n\n registerBeforeChangeHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeChangeHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeChange\", handler as unknown as StoreBeforeChangeHandler<R>)\n }\n\n registerAfterChangeHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterChangeHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterChange\", handler as unknown as StoreAfterChangeHandler<R>)\n }\n\n registerBeforeDeleteHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeDeleteHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeDelete\", handler as unknown as StoreBeforeDeleteHandler<R>)\n }\n\n registerAfterDeleteHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterDeleteHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterDelete\", handler as unknown as StoreAfterDeleteHandler<R>)\n }\n\n registerOperationCompleteHandler(handler: StoreOperationCompleteHandler): () => void {\n this.operationComplete.add(handler)\n return () => {\n this.operationComplete.delete(handler)\n }\n }\n\n /** @internal */\n handleBeforeCreate(record: R, source: ChangeSource): R {\n const sets = this.byType.get(record.typeName)\n if (!sets) return record\n let result = record\n for (const handler of sets.beforeCreate) result = handler(result, source)\n return result\n }\n\n /** @internal */\n handleAfterCreate(record: R, source: ChangeSource): void {\n const sets = this.byType.get(record.typeName)\n if (!sets) return\n for (const handler of sets.afterCreate) handler(record, source)\n }\n\n /** @internal */\n handleBeforeChange(prev: R, next: R, source: ChangeSource): R {\n const sets = this.byType.get(next.typeName)\n if (!sets) return next\n let result = next\n for (const handler of sets.beforeChange) result = handler(prev, result, source)\n return result\n }\n\n /** @internal */\n handleAfterChange(prev: R, next: R, source: ChangeSource): void {\n const sets = this.byType.get(next.typeName)\n if (!sets) return\n for (const handler of sets.afterChange) handler(prev, next, source)\n }\n\n /** @internal Returns false when a handler vetoed the delete. */\n handleBeforeDelete(record: R, source: ChangeSource): boolean {\n const sets = this.byType.get(record.typeName)\n if (!sets) return true\n for (const handler of sets.beforeDelete) {\n if (handler(record, source) === false) return false\n }\n return true\n }\n\n /** @internal */\n handleAfterDelete(record: R, source: ChangeSource): void {\n const sets = this.byType.get(record.typeName)\n if (!sets) return\n for (const handler of sets.afterDelete) handler(record, source)\n }\n\n /** @internal */\n handleOperationComplete(source: ChangeSource): void {\n for (const handler of this.operationComplete) handler(source)\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* helpers */\n/* ------------------------------------------------------------------------ */\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nfunction shallowEqualObjects(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n if (a === b) return true\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (!(key in b) || a[key] !== b[key]) return false\n }\n return true\n}\n\n/**\n * Records are considered unchanged when every top-level value is identical,\n * with `props` and `meta` compared one level deeper. Cheap enough to run on\n * every `put`, and avoids no-op history entries.\n */\nexport function isRecordShallowEqual(a: UnknownRecord, b: UnknownRecord): boolean {\n if (a === b) return true\n const ao = a as unknown as Record<string, unknown>\n const bo = b as unknown as Record<string, unknown>\n const aKeys = Object.keys(ao)\n const bKeys = Object.keys(bo)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (!(key in bo)) return false\n const av = ao[key]\n const bv = bo[key]\n if (av === bv) continue\n if ((key === \"props\" || key === \"meta\") && isPlainObject(av) && isPlainObject(bv)) {\n if (!shallowEqualObjects(av, bv)) return false\n continue\n }\n return false\n }\n return true\n}\n\n/** Freeze a record and its `props` / `meta` bags (one level). */\nexport function freezeRecord<R extends UnknownRecord>(record: R): R {\n const r = record as unknown as Record<string, unknown>\n if (isPlainObject(r[\"props\"]) && !Object.isFrozen(r[\"props\"])) Object.freeze(r[\"props\"])\n if (isPlainObject(r[\"meta\"]) && !Object.isFrozen(r[\"meta\"])) Object.freeze(r[\"meta\"])\n return Object.freeze(record)\n}\n\ninterface TypeIndex<R extends UnknownRecord> {\n /** Mutated in place on every add/remove: O(1) per record. */\n readonly live: Set<IdOf<R>>\n /** Bumped whenever `live` changes; the reactive handle on membership. */\n readonly epoch: Atom<number>\n}\n\ninterface Listener<R extends UnknownRecord> {\n onHistory: StoreListener<R>\n filters: StoreListenerFilters\n}\n\n/* ------------------------------------------------------------------------ */\n/* queries */\n/* ------------------------------------------------------------------------ */\n\n/** Reactive views over the store's records, cached per type name. */\n/**\n * How the records of one type are narrowed: a predicate, or a declarative\n * {@link QueryExpression} the store can answer from an index.\n *\n * Prefer the query object. A predicate has to be run against every record of\n * the type; a query with an `eq` clause is answered from an index bucket.\n */\nexport type StoreQueryFilter<Rec extends UnknownRecord> =\n | ((record: Rec) => boolean)\n | QueryExpression<Rec>\n\nfunction toPredicate<Rec extends UnknownRecord>(filter: StoreQueryFilter<Rec>): (record: Rec) => boolean {\n return typeof filter === \"function\" ? filter : (record) => matchesQuery(filter, record)\n}\n\nexport class StoreQueries<R extends UnknownRecord> {\n private readonly idsCache = new Map<string, Computed<ReadonlySet<IdOf<R>>>>()\n private readonly recordsCache = new Map<string, Computed<R[]>>()\n private readonly indexCache = new Map<string, RSIndex<any, any>>()\n private readonly historyCache = new Map<string, Computed<number, RecordsDiff<R>>>()\n\n constructor(private readonly store: Store<R, any>) {}\n\n /**\n * The set of ids of every record of `typeName`, optionally narrowed by a\n * filter. Maintained incrementally.\n */\n ids<T extends R[\"typeName\"]>(\n typeName: T,\n filter?: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<ReadonlySet<IdOf<RecordFromTypeName<R, T>>>> {\n if (filter) {\n const records = this.records(typeName, filter)\n return computed(`store:${this.store.id}:ids:${typeName}:filtered`, () => {\n const set = new Set<IdOf<RecordFromTypeName<R, T>>>()\n for (const record of records.get()) set.add(record.id as IdOf<RecordFromTypeName<R, T>>)\n return set as ReadonlySet<IdOf<RecordFromTypeName<R, T>>>\n })\n }\n let c = this.idsCache.get(typeName)\n if (!c) {\n const index = this.store.getTypeIndex(typeName)\n c = computed(`store:${this.store.id}:ids:${typeName}`, () => {\n index.epoch.get()\n return new Set(index.live) as ReadonlySet<IdOf<R>>\n })\n this.idsCache.set(typeName, c)\n }\n return c as unknown as Computed<ReadonlySet<IdOf<RecordFromTypeName<R, T>>>>\n }\n\n /**\n * Every record of `typeName`, in insertion order, optionally narrowed by a\n * filter.\n *\n * A {@link QueryExpression} with an `eq` clause is answered from the index on\n * that property, so a page with ten thousand shapes does not have to be\n * walked to find the twelve on one frame.\n */\n records<T extends R[\"typeName\"]>(\n typeName: T,\n filter?: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<RecordFromTypeName<R, T>[]> {\n if (filter) return this.filteredRecords(typeName, filter)\n let c = this.recordsCache.get(typeName)\n if (!c) {\n const ids = this.ids(typeName)\n c = computed(`store:${this.store.id}:records:${typeName}`, () => {\n const result: R[] = []\n for (const id of ids.get()) {\n const record = this.store.get(id as IdOf<R>) as R | undefined\n if (record !== undefined) result.push(record)\n }\n return result\n })\n this.recordsCache.set(typeName, c)\n }\n return c as unknown as Computed<RecordFromTypeName<R, T>[]>\n }\n\n private filteredRecords<T extends R[\"typeName\"]>(\n typeName: T,\n filter: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<RecordFromTypeName<R, T>[]> {\n type Rec = RecordFromTypeName<R, T>\n const predicate = toPredicate<Rec>(filter)\n const indexedProperty = typeof filter === \"function\" ? undefined : getIndexablePropertyOf(filter)\n\n if (indexedProperty !== undefined) {\n const clause = (filter as QueryExpression<Rec>)[indexedProperty as keyof Rec]\n const wanted = clause && \"eq\" in clause ? clause.eq : undefined\n const index = this.index(typeName, indexedProperty as keyof Rec & string)\n return computed(`store:${this.store.id}:records:${typeName}:${String(indexedProperty)}`, () => {\n const bucket = index.get().get(wanted as Rec[keyof Rec & string])\n if (!bucket) return []\n const result: Rec[] = []\n for (const id of bucket) {\n const record = this.store.get(id as IdOf<R>) as Rec | undefined\n if (record !== undefined && predicate(record)) result.push(record)\n }\n return result\n })\n }\n\n const all = this.records(typeName)\n return computed(`store:${this.store.id}:records:${typeName}:filtered`, () => all.get().filter(predicate))\n }\n\n /** The first record of `typeName` matching `filter` (or the first record, when omitted). */\n record<T extends R[\"typeName\"]>(\n typeName: T,\n filter?: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<RecordFromTypeName<R, T> | undefined> {\n const records = filter ? this.filteredRecords(typeName, filter) : this.records(typeName)\n return computed(`store:${this.store.id}:record:${typeName}`, () => records.get()[0])\n }\n\n /** Non-reactive filter over the records of `typeName`. */\n exec<T extends R[\"typeName\"]>(\n typeName: T,\n filter: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): RecordFromTypeName<R, T>[] {\n return unsafe__withoutCapture(() => this.filteredRecords(typeName, filter).get())\n }\n\n /**\n * A live index from the values of one property to the ids of the records\n * holding them.\n *\n * The index is cached per type and property, and it carries diffs: a\n * dependent that already built something from it can ask\n * `index.getDiffSince(epoch)` and patch, instead of walking the whole map\n * again. That is what makes \"every shape whose parentId is this frame\" cheap\n * enough to recompute on every pointer move.\n */\n index<T extends R[\"typeName\"], Property extends keyof RecordFromTypeName<R, T> & string>(\n typeName: T,\n property: Property,\n ): RSIndex<RecordFromTypeName<R, T>, Property> {\n type Rec = RecordFromTypeName<R, T>\n const key = `${typeName}:${property}`\n const cached = this.indexCache.get(key)\n if (cached) return cached as RSIndex<Rec, Property>\n\n const history = this.filterHistory(typeName)\n\n const index = computed<RSIndexMap<Rec, Property>, RSIndexDiff<Rec, Property>>(\n `store:${this.store.id}:index:${key}`,\n (previous, lastComputedEpoch) => {\n if (isUninitialized(previous)) {\n history.get()\n return this.buildIndex<T, Property>(typeName, property)\n }\n\n const diffs = history.getDiffSince(lastComputedEpoch)\n if (diffs === RESET_VALUE) return this.buildIndex<T, Property>(typeName, property)\n\n const nextMap: RSIndexMap<Rec, Property> = new Map(previous)\n const indexDiff: RSIndexDiff<Rec, Property> = new Map()\n let changed = false\n\n const remove = (value: Rec[Property], id: IdOf<Rec>) => {\n const bucket = nextMap.get(value)\n if (!bucket?.has(id)) return\n const next = new Set(bucket)\n next.delete(id)\n if (next.size === 0) nextMap.delete(value)\n else nextMap.set(value, next)\n const entry = indexDiff.get(value) ?? {}\n ;(entry.removed ??= new Set()).add(id)\n indexDiff.set(value, entry)\n changed = true\n }\n const add = (value: Rec[Property], id: IdOf<Rec>) => {\n const bucket = nextMap.get(value)\n if (bucket?.has(id)) return\n nextMap.set(value, new Set(bucket).add(id))\n const entry = indexDiff.get(value) ?? {}\n ;(entry.added ??= new Set()).add(id)\n indexDiff.set(value, entry)\n changed = true\n }\n\n for (const diff of diffs) {\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>] as Rec | undefined\n if (record?.typeName === typeName) add(record[property], record.id as IdOf<Rec>)\n }\n for (const id in diff.updated) {\n const [before, after] = diff.updated[id as IdOf<R>] as [Rec, Rec]\n if (after.typeName !== typeName) continue\n if (Object.is(before[property], after[property])) continue\n remove(before[property], before.id as IdOf<Rec>)\n add(after[property], after.id as IdOf<Rec>)\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>] as Rec | undefined\n if (record?.typeName === typeName) remove(record[property], record.id as IdOf<Rec>)\n }\n }\n\n if (!changed) return previous\n return withDiff(nextMap, indexDiff)\n },\n { historyLength: 128 },\n )\n\n this.indexCache.set(key, index as RSIndex<any, any>)\n return index as RSIndex<Rec, Property>\n }\n\n private buildIndex<T extends R[\"typeName\"], Property extends keyof RecordFromTypeName<R, T> & string>(\n typeName: T,\n property: Property,\n ): RSIndexMap<RecordFromTypeName<R, T>, Property> {\n type Rec = RecordFromTypeName<R, T>\n const map: RSIndexMap<Rec, Property> = new Map()\n for (const record of this.records(typeName).get()) {\n const value = record[property]\n const bucket = map.get(value)\n if (bucket) bucket.add(record.id as IdOf<Rec>)\n else map.set(value, new Set([record.id as IdOf<Rec>]))\n }\n return map\n }\n\n /**\n * The store's history, narrowed to one record type.\n *\n * Its *value* is only a counter — what it is for is the diffs it carries.\n * `filterHistory(\"shape\").getDiffSince(epoch)` is every change to shapes\n * since `epoch`, with changes to other record types dropped, which is how a\n * derived collection stays incremental without re-reading the store.\n */\n filterHistory<T extends R[\"typeName\"]>(typeName: T): Computed<number, RecordsDiff<RecordFromTypeName<R, T>>> {\n const cached = this.historyCache.get(typeName)\n if (cached) return cached as unknown as Computed<number, RecordsDiff<RecordFromTypeName<R, T>>>\n\n const filtered = computed<number, RecordsDiff<R>>(\n `store:${this.store.id}:history:${typeName}`,\n (previous, lastComputedEpoch) => {\n const epoch = this.store.history.get()\n if (isUninitialized(previous)) return epoch\n\n const diffs = this.store.history.getDiffSince(lastComputedEpoch)\n if (diffs === RESET_VALUE) return epoch\n\n const merged = createEmptyRecordsDiff<R>()\n let any = false\n for (const diff of diffs) {\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>]!\n if (record.typeName !== typeName) continue\n merged.added[id as IdOf<R>] = record\n any = true\n }\n for (const id in diff.updated) {\n const pair = diff.updated[id as IdOf<R>]!\n if (pair[1].typeName !== typeName) continue\n merged.updated[id as IdOf<R>] = pair\n any = true\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>]!\n if (record.typeName !== typeName) continue\n merged.removed[id as IdOf<R>] = record\n any = true\n }\n }\n // Nothing of this type changed: keep the old value so dependents are\n // not woken at all.\n if (!any) return previous\n return withDiff(epoch, merged)\n },\n { historyLength: 128 },\n )\n\n this.historyCache.set(typeName, filtered)\n return filtered as unknown as Computed<number, RecordsDiff<RecordFromTypeName<R, T>>>\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* store */\n/* ------------------------------------------------------------------------ */\n\n/**\n * A reactive, transactional collection of records.\n *\n * - one atom per record, so consumers subscribe to exactly what they read\n * - per-type id sets maintained incrementally\n * - writes are batched; listeners receive one squashed diff per outermost operation\n * - records are frozen on write\n */\nexport class Store<R extends UnknownRecord = UnknownRecord, Props = unknown> {\n readonly id: string\n readonly schema: StoreSchema<R, Props>\n readonly props: Props\n readonly scopedTypes: { readonly [S in RecordScope]: ReadonlySet<string> }\n readonly sideEffects = new StoreSideEffects<R>()\n readonly query: StoreQueries<R>\n /**\n * Bumped once per completed operation that changed something.\n *\n * The counter itself carries no information; the diffs do. The atom keeps a\n * bounded history of the squashed {@link RecordsDiff} of each operation, so a\n * derived collection can ask `history.getDiffSince(epoch)` and patch itself\n * instead of rebuilding. `store.query.filterHistory(typeName)` is the same\n * thing narrowed to one record type.\n */\n readonly history: Atom<number, RecordsDiff<R>>\n\n private readonly records = new Map<IdOf<R>, Atom<R | undefined>>()\n private readonly typeIndexes = new Map<string, TypeIndex<R>>()\n private readonly listeners = new Set<Listener<R>>()\n private pendingEntries: HistoryEntry<R>[] = []\n private readonly extractStack: RecordsDiff<R>[] = []\n private depth = 0\n private source: ChangeSource = \"user\"\n private runCallbacks = true\n private inOperationComplete = false\n private disposed = false\n /**\n * The diff of the operation currently being committed, handed to the history\n * atom's `computeDiff` as it is written. The atom only sees two counter\n * values, so the diff has to be staged here for the one write that follows.\n */\n private pendingHistoryDiff: RecordsDiff<R> | null = null\n\n constructor(options: StoreOptions<R, Props>) {\n this.id = options.id ?? uniqueId()\n this.schema = options.schema\n this.props = options.props\n this.history = atom<number, RecordsDiff<R>>(`store:${this.id}:history`, 0, {\n // 128 operations is deep enough that a dependent which rendered a frame\n // ago can still patch, and shallow enough that the buffer costs nothing.\n historyLength: 128,\n computeDiff: () => this.pendingHistoryDiff ?? RESET_VALUE,\n })\n this.query = new StoreQueries(this)\n\n const scoped = { document: new Set<string>(), session: new Set<string>(), presence: new Set<string>() }\n for (const type of Object.values(this.schema.types) as RecordType<R, any>[]) {\n scoped[type.scope].add(type.typeName)\n }\n this.scopedTypes = scoped\n\n if (options.initialData) {\n const records = Object.values(options.initialData) as R[]\n this.atomic(() => this.put(records, \"initialize\"), { runCallbacks: false })\n }\n }\n\n /* ---- reading ---------------------------------------------------------- */\n\n /** @internal */\n getTypeIndex(typeName: string): TypeIndex<R> {\n let index = this.typeIndexes.get(typeName)\n if (!index) {\n index = { live: new Set(), epoch: atom(`store:${this.id}:index:${typeName}`, 0) }\n this.typeIndexes.set(typeName, index)\n }\n return index\n }\n\n /** Get a record (reactive: subscribes to the record, or to its type's membership when absent). */\n get<K extends IdOf<R>>(id: K): RecordFromId<K> | undefined {\n const a = this.records.get(id)\n if (a) return a.get() as RecordFromId<K> | undefined\n // Not present: depend on membership of this id's type so creation is observed.\n this.getTypeIndex(typeNameOfId(id)).epoch.get()\n return undefined\n }\n\n /** Get a record without registering a reactive dependency. */\n unsafeGetWithoutCapture<K extends IdOf<R>>(id: K): RecordFromId<K> | undefined {\n const a = this.records.get(id)\n return a ? (unsafe__withoutCapture(() => a.get()) as RecordFromId<K> | undefined) : undefined\n }\n\n has<K extends IdOf<R>>(id: K): boolean {\n return this.get(id) !== undefined\n }\n\n /** All records (reactive over every record and every type's membership). */\n allRecords(): R[] {\n for (const index of this.typeIndexes.values()) index.epoch.get()\n const result: R[] = []\n for (const a of this.records.values()) {\n const record = a.get()\n if (record !== undefined) result.push(record)\n }\n return result\n }\n\n /** Scope of a record type; unknown types are `document`. */\n getScope(typeName: string): RecordScope {\n return this.schema.getScope(typeName)\n }\n\n /* ---- writing ---------------------------------------------------------- */\n\n /**\n * Insert or update records. Records are validated, passed through `before*`\n * side effects, frozen, and written. `after*` side effects run once every\n * record in the call has been written.\n */\n put(records: readonly R[], phaseOverride?: StoreValidationPhase): void {\n this.atomic(() => {\n const source = this.source\n const callbacks = this.runCallbacks && this.sideEffects.isEnabled()\n const created: R[] = []\n const changed: [R, R][] = []\n\n for (const record of records) {\n const id = record.id\n const existing = this.records.get(id)\n const before = existing?.get()\n\n if (before !== undefined) {\n if (before === record) continue\n let next = this.schema.validateRecord(this, record, phaseOverride ?? \"updateRecord\", before)\n if (callbacks) next = this.sideEffects.handleBeforeChange(before, next, source)\n if (next === before || isRecordShallowEqual(before, next)) continue\n if (next.id !== id) {\n throw new Error(`Cannot change the id of a record (${id} -> ${next.id})`)\n }\n freezeRecord(next)\n if (before.typeName !== next.typeName) {\n this.removeFromIndex(before.typeName, id)\n this.addToIndex(next.typeName, id)\n }\n existing!.set(next)\n this.recordChange(id, before, next)\n changed.push([before, next])\n } else {\n let next = this.schema.validateRecord(this, record, phaseOverride ?? \"createRecord\", undefined)\n if (callbacks) next = this.sideEffects.handleBeforeCreate(next, source)\n if (next.id !== id) {\n throw new Error(`Cannot change the id of a record (${id} -> ${next.id})`)\n }\n freezeRecord(next)\n const a = existing ?? atom<R | undefined>(`store:${this.id}:record:${id}`, undefined)\n a.set(next)\n this.records.set(id, a)\n this.addToIndex(next.typeName, id)\n this.recordChange(id, undefined, next)\n created.push(next)\n }\n }\n\n if (callbacks) {\n for (const record of created) this.sideEffects.handleAfterCreate(record, source)\n for (const [prev, next] of changed) this.sideEffects.handleAfterChange(prev, next, source)\n }\n })\n }\n\n /** Remove records by id. Missing ids are ignored. `beforeDelete` handlers may veto. */\n remove(ids: readonly IdOf<R>[]): void {\n this.atomic(() => {\n const source = this.source\n const callbacks = this.runCallbacks && this.sideEffects.isEnabled()\n const toRemove: R[] = []\n\n for (const id of ids) {\n const a = this.records.get(id)\n if (!a) continue\n const record = a.get()\n if (record === undefined) continue\n if (callbacks && !this.sideEffects.handleBeforeDelete(record, source)) continue\n toRemove.push(record)\n }\n\n const removed: R[] = []\n for (const record of toRemove) {\n const a = this.records.get(record.id)\n if (!a) continue // a handler already removed it\n const current = a.get()\n if (current === undefined) continue\n a.set(undefined)\n this.records.delete(record.id)\n this.removeFromIndex(current.typeName, record.id)\n this.recordChange(record.id, current, undefined)\n removed.push(current)\n }\n\n if (callbacks) {\n for (const record of removed) this.sideEffects.handleAfterDelete(record, source)\n }\n })\n }\n\n /** Remove every record. */\n clear(): void {\n this.remove(Array.from(this.records.keys()))\n }\n\n /**\n * Update one record with a function. No-op when the record does not exist.\n */\n update<K extends IdOf<R>>(id: K, updater: (record: RecordFromId<K>) => RecordFromId<K>): void {\n const current = this.unsafeGetWithoutCapture(id)\n if (current === undefined) return\n this.put([updater(current) as unknown as R])\n }\n\n /* ---- transactions ----------------------------------------------------- */\n\n /**\n * Run `fn` as one operation: side effects' `operationComplete` handlers run\n * once at the end, and listeners get a single squashed history entry.\n */\n atomic<T>(fn: () => T, options?: { source?: ChangeSource | undefined; runCallbacks?: boolean | undefined }): T {\n const prevSource = this.source\n const prevRunCallbacks = this.runCallbacks\n if (options?.source !== undefined) this.source = options.source\n if (options?.runCallbacks !== undefined) this.runCallbacks = options.runCallbacks\n const source = this.source\n const runCallbacks = this.runCallbacks\n this.depth++\n try {\n return transact(() => unsafe__withoutCapture(fn))\n } finally {\n this.depth--\n if (this.depth === 0) {\n try {\n this.completeOperation(source, runCallbacks)\n } finally {\n this.source = prevSource\n this.runCallbacks = prevRunCallbacks\n }\n } else {\n this.source = prevSource\n this.runCallbacks = prevRunCallbacks\n }\n }\n }\n\n /** Changes made inside `fn` are reported to listeners with source `remote`. */\n mergeRemoteChanges(fn: () => void): void {\n this.atomic(fn, { source: \"remote\" })\n }\n\n /** Run `fn` and return the squashed diff of everything it changed. Listeners are still notified. */\n extractingChanges(fn: () => void): RecordsDiff<R> {\n const diff = createEmptyRecordsDiff<R>()\n this.extractStack.push(diff)\n try {\n this.atomic(fn)\n } finally {\n this.extractStack.pop()\n }\n return diff\n }\n\n /**\n * Apply a diff (e.g. from `extractingChanges` or `reverseRecordsDiff`).\n * With `ignoreEphemeralKeys`, ephemeral keys of updated records keep their\n * current store values instead of the diff's.\n */\n applyDiff(\n diff: RecordsDiff<R>,\n options?: { runCallbacks?: boolean | undefined; ignoreEphemeralKeys?: boolean | undefined },\n ): void {\n const runCallbacks = options?.runCallbacks ?? true\n const ignoreEphemeralKeys = options?.ignoreEphemeralKeys ?? false\n this.atomic(\n () => {\n const toPut: R[] = []\n for (const id in diff.added) toPut.push(diff.added[id as IdOf<R>]!)\n for (const id in diff.updated) {\n let [, to] = diff.updated[id as IdOf<R>]!\n if (ignoreEphemeralKeys) {\n const current = this.unsafeGetWithoutCapture(id as IdOf<R>)\n const type = this.schema.getType(to.typeName)\n if (current !== undefined && type && type.ephemeralKeySet.size > 0) {\n const merged: Record<string, unknown> = { ...(to as unknown as Record<string, unknown>) }\n const cur = current as unknown as Record<string, unknown>\n for (const key of type.ephemeralKeySet) {\n if (key in cur) merged[key] = cur[key]\n else delete merged[key]\n }\n to = merged as unknown as R\n }\n }\n toPut.push(to)\n }\n this.put(toPut)\n const toRemove = Object.keys(diff.removed) as IdOf<R>[]\n if (toRemove.length > 0) this.remove(toRemove)\n },\n { runCallbacks },\n )\n }\n\n /* ---- listening -------------------------------------------------------- */\n\n /**\n * Subscribe to history entries. Called after each outermost operation with\n * the squashed changes, filtered by source and record scope.\n */\n listen(onHistory: StoreListener<R>, filters?: Partial<StoreListenerFilters>): () => void {\n const listener: Listener<R> = {\n onHistory,\n filters: { source: filters?.source ?? \"all\", scope: filters?.scope ?? \"all\" },\n }\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n /* ---- persistence ------------------------------------------------------ */\n\n /** Plain-object snapshot of the records in `scope` (default `document`). */\n serialize(scope: RecordScope | \"all\" = \"document\"): SerializedStore<R> {\n const result = {} as SerializedStore<R>\n unsafe__withoutCapture(() => {\n for (const [id, a] of this.records) {\n const record = a.get()\n if (record === undefined) continue\n if (scope === \"all\" || this.getScope(record.typeName) === scope) result[id] = record\n }\n })\n return result\n }\n\n getStoreSnapshot(scope: RecordScope | \"all\" = \"document\"): StoreSnapshot<R> {\n return { store: this.serialize(scope), schema: this.schema.serialize() }\n }\n\n /**\n * Bring a snapshot saved by an older document up to this store's schema,\n * without loading it.\n *\n * Every migration sequence the schema knows is run — including the ones\n * `createStore` derives from the shape and binding utils, so a board saved\n * before a prop existed is backfilled here rather than failing validation on\n * load. The input is not mutated: the result is a new snapshot carrying this\n * schema's serialized version, ready for {@link Store.loadStoreSnapshot} (or\n * for a caller that wants to inspect the migrated records first).\n *\n * A snapshot that cannot be migrated — an unknown schema version, a sequence\n * from a NEWER build than this one, a migration that throws — raises rather\n * than returning half-migrated data, so a caller can fail closed on it.\n */\n migrateSnapshot(snapshot: StoreSnapshot<R>): StoreSnapshot<R> {\n const migrated = this.schema.migrateStoreSnapshot(snapshot)\n if (migrated.type === \"error\") {\n throw new Error(`Failed to migrate snapshot: ${migrated.reason}`)\n }\n return { store: migrated.value, schema: this.schema.serialize() }\n }\n\n /**\n * Replace the store's contents with a snapshot (migrating it first).\n * Existing records in `document` scope and in every scope present in the\n * snapshot are removed unless the snapshot contains them; other scopes are\n * left alone. Side effects do not run; listeners are notified.\n */\n loadStoreSnapshot(snapshot: StoreSnapshot<R>): void {\n const migrated = this.schema.migrateStoreSnapshot(snapshot)\n if (migrated.type === \"error\") {\n throw new Error(`Failed to migrate snapshot: ${migrated.reason}`)\n }\n const incoming = migrated.value\n const records = Object.values(incoming) as R[]\n this.atomic(\n () => {\n const scopes = new Set<RecordScope>([\"document\"])\n for (const record of records) scopes.add(this.getScope(record.typeName))\n const toRemove: IdOf<R>[] = []\n for (const [id, a] of this.records) {\n const record = a.get()\n if (record === undefined) continue\n if (scopes.has(this.getScope(record.typeName)) && !(id in incoming)) toRemove.push(id)\n }\n this.remove(toRemove)\n this.put(records, \"initialize\")\n },\n { runCallbacks: false },\n )\n }\n\n /* ---- derived caches --------------------------------------------------- */\n\n /**\n * A per-record derived value, recomputed only when that record changes.\n * Entries are dropped automatically when records are removed.\n */\n createComputedCache<T, K extends IdOf<R> = IdOf<R>>(\n name: string,\n derive: (record: RecordFromId<K>) => T,\n options?: { isEqual?: ((a: T, b: T) => boolean) | undefined },\n ): { get(id: K): T | undefined } {\n const cache = new WeakMap<Atom<R | undefined>, Computed<T | undefined>>()\n return {\n get: (id: K) => {\n const a = this.records.get(id)\n if (!a) {\n this.getTypeIndex(typeNameOfId(id)).epoch.get()\n return undefined\n }\n let c = cache.get(a)\n if (!c) {\n c = computed(\n `${name}:${id}`,\n () => {\n const record = a.get()\n return record === undefined ? undefined : derive(record as unknown as RecordFromId<K>)\n },\n options?.isEqual\n ? { isEqual: (x, y) => (x === undefined || y === undefined ? x === y : options.isEqual!(x, y)) }\n : undefined,\n )\n cache.set(a, c)\n }\n return c.get()\n },\n }\n }\n\n /* ---- lifecycle -------------------------------------------------------- */\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n dispose(): void {\n this.disposed = true\n this.listeners.clear()\n }\n\n /* ---- internals -------------------------------------------------------- */\n\n private addToIndex(typeName: string, id: IdOf<R>) {\n const index = this.getTypeIndex(typeName)\n if (index.live.has(id)) return\n index.live.add(id)\n index.epoch.update((n) => n + 1)\n }\n\n private removeFromIndex(typeName: string, id: IdOf<R>) {\n const index = this.typeIndexes.get(typeName)\n if (!index || !index.live.delete(id)) return\n index.epoch.update((n) => n + 1)\n }\n\n private recordChange(id: IdOf<R>, before: R | undefined, after: R | undefined) {\n const last = this.pendingEntries[this.pendingEntries.length - 1]\n let entry: HistoryEntry<R>\n if (last && last.source === this.source) {\n entry = last\n } else {\n entry = { changes: createEmptyRecordsDiff<R>(), source: this.source }\n this.pendingEntries.push(entry)\n }\n applyChangeToDiff(entry.changes, id, before, after)\n for (const diff of this.extractStack) applyChangeToDiff(diff, id, before, after)\n }\n\n private completeOperation(source: ChangeSource, runCallbacks: boolean) {\n if (!this.pendingEntries.some((e) => !isRecordsDiffEmpty(e.changes))) {\n this.pendingEntries = []\n return\n }\n if (runCallbacks && this.sideEffects.isEnabled() && !this.inOperationComplete) {\n this.inOperationComplete = true\n const prevSource = this.source\n this.source = source\n this.depth++\n try {\n transact(() => unsafe__withoutCapture(() => this.sideEffects.handleOperationComplete(source)))\n } finally {\n this.depth--\n this.source = prevSource\n this.inOperationComplete = false\n }\n }\n this.pendingHistoryDiff = this.squashPendingEntries()\n try {\n this.history.update((n) => n + 1)\n } finally {\n this.pendingHistoryDiff = null\n }\n this.flushHistory()\n }\n\n /** One diff describing everything the operation just committed changed. */\n private squashPendingEntries(): RecordsDiff<R> {\n const diffs = this.pendingEntries.map((entry) => entry.changes).filter((diff) => !isRecordsDiffEmpty(diff))\n if (diffs.length === 1) return diffs[0]!\n return squashRecordDiffs(diffs)\n }\n\n private flushHistory() {\n const entries = this.pendingEntries\n this.pendingEntries = []\n if (this.listeners.size === 0) return\n for (const entry of entries) {\n if (isRecordsDiffEmpty(entry.changes)) continue\n for (const listener of Array.from(this.listeners)) {\n if (listener.filters.source !== \"all\" && listener.filters.source !== entry.source) continue\n const changes =\n listener.filters.scope === \"all\" ? entry.changes : this.filterDiffByScope(entry.changes, listener.filters.scope)\n if (isRecordsDiffEmpty(changes)) continue\n listener.onHistory({ changes, source: entry.source })\n }\n }\n }\n\n private filterDiffByScope(diff: RecordsDiff<R>, scope: RecordScope): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>]!\n if (this.getScope(record.typeName) === scope) result.added[id as IdOf<R>] = record\n }\n for (const id in diff.updated) {\n const pair = diff.updated[id as IdOf<R>]!\n if (this.getScope(pair[1].typeName) === scope) result.updated[id as IdOf<R>] = pair\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>]!\n if (this.getScope(record.typeName) === scope) result.removed[id as IdOf<R>] = record\n }\n return result\n }\n}\n\nfunction typeNameOfId(id: string): string {\n const colon = id.indexOf(\":\")\n return colon > 0 ? id.slice(0, colon) : parseRecordId(id).typeName\n}\n","import { isRecordLike, type IdOf, type UnknownRecord } from \"./ids\"\nimport type { SerializedSchema, SerializedStore } from \"./migrate\"\n\n/**\n * `.tldr` file envelope. Schema-agnostic: this module does not know or care\n * what record types the file holds.\n */\nexport const TLDR_FILE_FORMAT_VERSION = 1\n\nexport interface TldrFile {\n tldrawFileFormatVersion: number\n schema: SerializedSchema\n records: UnknownRecord[]\n}\n\nexport type TldrFileParseError = \"notATldrFile\" | \"v1File\" | \"invalidRecords\" | \"futureVersion\"\n\nexport type ParseTldrFileResult =\n | { ok: true; schema: SerializedSchema; records: UnknownRecord[] }\n | { ok: false; error: TldrFileParseError; cause?: unknown }\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isSerializedSchema(value: unknown): value is SerializedSchema {\n return isPlainObject(value) && typeof value[\"schemaVersion\"] === \"number\"\n}\n\n/**\n * Parse a `.tldr` file. Accepts either the JSON text or the already-parsed\n * value. Never throws.\n */\nexport function parseTldrFile(json: unknown): ParseTldrFileResult {\n let data: unknown = json\n if (typeof json === \"string\") {\n try {\n data = JSON.parse(json)\n } catch (cause) {\n return { ok: false, error: \"notATldrFile\", cause }\n }\n }\n\n if (!isPlainObject(data)) return { ok: false, error: \"notATldrFile\" }\n\n if (!(\"tldrawFileFormatVersion\" in data)) {\n // The legacy (pre-envelope) format stored a whole document object.\n const legacyDocument = data[\"document\"]\n if (isPlainObject(legacyDocument) && (\"pages\" in legacyDocument || \"version\" in legacyDocument)) {\n return { ok: false, error: \"v1File\" }\n }\n return { ok: false, error: \"notATldrFile\" }\n }\n\n const version = data[\"tldrawFileFormatVersion\"]\n if (typeof version !== \"number\" || !Number.isInteger(version) || version < 1) {\n return { ok: false, error: \"notATldrFile\" }\n }\n if (version > TLDR_FILE_FORMAT_VERSION) return { ok: false, error: \"futureVersion\" }\n\n if (!isSerializedSchema(data[\"schema\"])) return { ok: false, error: \"notATldrFile\" }\n\n const records = data[\"records\"]\n if (!Array.isArray(records)) return { ok: false, error: \"invalidRecords\" }\n const seen = new Set<string>()\n for (const record of records) {\n if (!isRecordLike(record)) return { ok: false, error: \"invalidRecords\" }\n if (seen.has(record.id)) return { ok: false, error: \"invalidRecords\" }\n seen.add(record.id)\n }\n\n return { ok: true, schema: data[\"schema\"], records: records as UnknownRecord[] }\n}\n\n/**\n * JSON.stringify with object keys sorted recursively so that identical data\n * always produces identical text. Arrays keep their order.\n */\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeysDeep)\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(value).sort()) {\n const v = value[key]\n if (v !== undefined) out[key] = sortKeysDeep(v)\n }\n return out\n }\n return value\n}\n\n/**\n * Serialize records and their schema into the `.tldr` envelope\n * (pretty-printed, stable key order). Records are written in the given order.\n */\nexport function serializeTldrFile(schema: SerializedSchema, records: readonly UnknownRecord[]): string {\n const envelope = {\n tldrawFileFormatVersion: TLDR_FILE_FORMAT_VERSION,\n schema: sortKeysDeep(schema),\n records: records.map(sortKeysDeep),\n }\n return JSON.stringify(envelope, null, 2)\n}\n\n/** Convert a parsed file into a `{ store, schema }` snapshot. */\nexport function tldrFileToStoreSnapshot(file: { schema: SerializedSchema; records: readonly UnknownRecord[] }): {\n store: SerializedStore<UnknownRecord>\n schema: SerializedSchema\n} {\n const store = {} as SerializedStore<UnknownRecord>\n for (const record of file.records) store[record.id as IdOf<UnknownRecord>] = record\n return { store, schema: file.schema }\n}\n\n/** Convert a `{ store, schema }` snapshot into `.tldr` text. Records are ordered by id. */\nexport function storeSnapshotToTldrFile(snapshot: {\n store: SerializedStore<UnknownRecord>\n schema: SerializedSchema\n}): string {\n const records = Object.values(snapshot.store).sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return serializeTldrFile(snapshot.schema, records)\n}\n","/**\n * Standalone per-record memos.\n *\n * `Store.createComputedCache` already memoizes a value per record, but it is a\n * method: the cache belongs to one store instance, and the derivation cannot see\n * anything else. A shape util or binding util usually needs the opposite shape —\n * one cache declared once at module scope, derived from a record *and* the editor\n * that owns it, and shared by every store that editor drives.\n *\n * `createComputedCache` is that form. The context is passed in at `get` time and\n * the underlying per-record cache is created lazily, once per context.\n */\nimport type { IdOf, RecordId, UnknownRecord } from \"./ids\"\nimport { Store } from \"./Store\"\n\n/**\n * A context a computed cache can read a store from: a store itself, or anything\n * holding one (an `Editor`).\n */\nexport type ComputedCacheContext = Store<any, any> | { readonly store: Store<any, any> }\n\n/** The handle returned by {@link createComputedCache}. */\nexport interface ComputedCache<Context, R extends UnknownRecord, Result> {\n /** The derived value for `id`, or `undefined` if no such record exists. */\n get(context: Context, id: IdOf<R>): Result | undefined\n}\n\n/** Options for {@link createComputedCache}. */\nexport interface CreateComputedCacheOptions<Result> {\n /**\n * Treat two derived values as the same, so dependents are not woken when the\n * derivation recomputes to an equivalent result.\n */\n isEqual?: ((a: Result, b: Result) => boolean) | undefined\n}\n\nfunction storeOf(context: unknown): Store<any, any> {\n if (context instanceof Store) return context\n const store = (context as { store?: unknown } | null | undefined)?.store\n if (store instanceof Store) return store\n throw new Error(\"createComputedCache: context is neither a Store nor an object holding one\")\n}\n\n/**\n * Declare a per-record memo, keyed by record id, recomputed only when that\n * record changes.\n *\n * ```ts\n * const bindingsCache = createComputedCache(\"connection bindings\", (editor: Editor, shape: TLShape) =>\n * editor.getBindingsFromShape(shape.id, \"connection\"),\n * )\n * bindingsCache.get(editor, shapeId)\n * ```\n *\n * SEMANTICS-ASSUMED: `Context` is unconstrained rather than bound to\n * {@link ComputedCacheContext}. The consumer annotates the derivation's own\n * parameter (`(editor: Editor, shape: TLShape) => …`) and that is what `get`\n * must accept; constraining the type parameter as well would force every caller\n * to prove `Editor` is structurally a store holder at each call site for no\n * added safety. The store is resolved at `get` time instead, and a context that\n * carries none throws immediately rather than silently returning `undefined`.\n */\nexport function createComputedCache<Context, R extends UnknownRecord, Result>(\n name: string,\n derive: (context: Context, record: R) => Result,\n options?: CreateComputedCacheOpts<Result, R>,\n): ComputedCache<Context, R, Result> {\n // Keyed on the context object, so an editor that is torn down takes its\n // caches with it and a second editor does not read the first one's values.\n const perContext = new WeakMap<object, { get(id: RecordId<UnknownRecord>): Result | undefined }>()\n\n return {\n get(context: Context, id: IdOf<R>): Result | undefined {\n const key = context as unknown as object\n if (key === null || (typeof key !== \"object\" && typeof key !== \"function\")) {\n throw new Error(\"createComputedCache: context must be an object\")\n }\n let cache = perContext.get(key)\n if (!cache) {\n // `areRecordsEqual` gates the derivation itself: when the incoming\n // record is equivalent to the one the last result came from, the\n // previous result is handed back untouched.\n const areRecordsEqual = options?.areRecordsEqual\n // Memoized per record id, not per cache: one shared \"last record\" would\n // compare a shape against whichever unrelated shape was derived before it.\n const previous = new Map<string, { record: R; result: Result }>()\n const derivation = areRecordsEqual\n ? (record: UnknownRecord): Result => {\n const next = record as R\n const last = previous.get(record.id)\n if (last && areRecordsEqual(last.record, next)) return last.result\n const result = derive(context, next)\n previous.set(record.id, { record: next, result })\n return result\n }\n : (record: UnknownRecord): Result => derive(context, record as R)\n\n cache = storeOf(context).createComputedCache<Result>(\n name,\n derivation,\n options?.isEqual ? { isEqual: options.isEqual } : undefined,\n )\n perContext.set(key, cache)\n }\n return cache.get(id as unknown as RecordId<UnknownRecord>)\n },\n }\n}\n\n/**\n * Options for {@link createComputedCache}, including the record-level equality\n * that decides when a derivation is worth re-running at all.\n */\nexport type CreateComputedCacheOpts<Result, R extends UnknownRecord = UnknownRecord> =\n CreateComputedCacheOptions<Result> & {\n /**\n * Treat two versions of the *record* as the same, so the derivation is not\n * re-run when only parts it does not read have changed.\n *\n * `isEqual` compares results and can only save the dependents work;\n * `areRecordsEqual` compares inputs and saves the derivation itself. Use it\n * when the derivation is expensive and reads only a couple of fields —\n * geometry from `props`, say, which should not be rebuilt because the shape\n * moved.\n */\n areRecordsEqual?: ((a: R, b: R) => boolean) | undefined\n }\n","/**\n * Two small guards the store leans on: a development-only deep freeze, and an\n * id assertion that narrows.\n */\n\nimport type { IdOf, RecordType, UnknownRecord } from \"./ids\"\n\n/** Whether the bundle is a development build. Frozen at module load. */\nconst IS_DEV =\n typeof process !== \"undefined\" && typeof process.env === \"object\" && process.env[\"NODE_ENV\"] !== \"production\"\n\n/**\n * Deep-freeze `object` in development builds, and hand it straight back in\n * production.\n *\n * Records in the store are shared by reference with every consumer that read\n * them, so mutating one in place skips the whole change pipeline: no diff, no\n * side effects, no listeners, and an undo that silently does nothing. Freezing\n * turns that from a bug someone finds a week later into a `TypeError` on the\n * line that did it. The check is skipped in production because freezing every\n * record on every write is not free.\n *\n * Already-frozen objects are left alone, so re-freezing a record that came out\n * of the store costs one property read.\n */\nexport function devFreeze<T>(object: T): T {\n if (!IS_DEV) return object\n return deepFreeze(object)\n}\n\nfunction deepFreeze<T>(object: T): T {\n if (object === null || typeof object !== \"object\") return object\n if (Object.isFrozen(object)) return object\n Object.freeze(object)\n // `Object.freeze` is shallow; a record's `props` and `meta` are the parts\n // most likely to be mutated in place, and they are one level down.\n for (const value of Object.values(object as Record<string, unknown>)) deepFreeze(value)\n if (Array.isArray(object)) for (const value of object) deepFreeze(value)\n return object\n}\n\n/**\n * Assert that `id` belongs to `type`, narrowing it to that type's id.\n *\n * Record ids are branded strings, so the compiler already stops most mix-ups —\n * but ids that arrive from outside the program (a URL, a saved file, a sync\n * message) are plain strings that someone has to vouch for. This is the place\n * to do that vouching: it throws with the offending id rather than letting a\n * `page:` id be looked up as a shape and quietly returning `undefined`.\n *\n * ```ts\n * assertIdType(idFromUrl, PageRecordType)\n * editor.setCurrentPage(idFromUrl) // now typed as TLPageId\n * ```\n */\nexport function assertIdType<R extends UnknownRecord>(\n id: string | undefined,\n type: RecordType<R, any>,\n): asserts id is IdOf<R> {\n if (!type.isId(id)) {\n throw new Error(`Expected ${type.typeName} id, got ${JSON.stringify(id)}`)\n }\n}\n","/**\n * The synchronous storage contract a store can be backed by.\n *\n * Deliberately synchronous and deliberately tiny: it is the shape an embedded\n * key-value store (a SQLite table, a `Map`, an in-process test double) already\n * has, so a host can hand one over without writing an adapter. Anything\n * asynchronous — a network, IndexedDB — belongs behind a snapshot load and save\n * rather than behind this.\n */\n\nimport type { IdOf, UnknownRecord } from \"./ids\"\nimport type { SerializedSchema } from \"./migrate\"\n\n/**\n * Somewhere records can be read from and written to, one at a time, without\n * awaiting.\n *\n * Implementations must be consistent within a call: `getAll` reflects every\n * `set` and `delete` that has already returned.\n */\nexport interface SynchronousRecordStorage<R extends UnknownRecord = UnknownRecord> {\n /** The record stored under `id`, or `undefined`. */\n get(id: IdOf<R>): R | undefined\n /** Every stored record. Order is not significant. */\n getAll(): R[]\n /** Store `record` under its own id, replacing anything already there. */\n set(record: R): void\n /** Remove the record stored under `id`. Removing an absent id is not an error. */\n delete(id: IdOf<R>): void\n /** Remove every record. */\n clear(): void\n}\n\n/**\n * Record storage that also remembers the schema its records were written\n * against, so they can be migrated when they are read back.\n *\n * Storing records without their schema is the one mistake that cannot be\n * recovered from later: there is no way to tell which migrations have already\n * run, and re-running them corrupts the data.\n */\nexport interface SynchronousStorage<R extends UnknownRecord = UnknownRecord> extends SynchronousRecordStorage<R> {\n /** The schema the stored records were written against, or `undefined` when empty. */\n getSchema(): SerializedSchema | undefined\n /** Record the schema the stored records are written against. */\n setSchema(schema: SerializedSchema): void\n}\n\n/**\n * A {@link SynchronousStorage} backed by a plain `Map`.\n *\n * Useful in tests and as the reference implementation of the contract — the\n * shortest correct answer to \"what does a storage have to do?\".\n */\nexport function createInMemoryStorage<R extends UnknownRecord = UnknownRecord>(): SynchronousStorage<R> {\n const records = new Map<IdOf<R>, R>()\n let schema: SerializedSchema | undefined\n\n return {\n get: (id) => records.get(id),\n getAll: () => [...records.values()],\n set: (record) => {\n records.set(record.id as IdOf<R>, record)\n },\n delete: (id) => {\n records.delete(id)\n },\n clear: () => records.clear(),\n getSchema: () => schema,\n setSchema: (next) => {\n schema = next\n },\n }\n}\n","/**\n * Grapheme cluster iteration.\n *\n * \"One character\" as a person sees it is a grapheme cluster, not a UTF-16 code\n * unit and not a code point: `👩👩👧` is one, `é` written as `e` + a combining\n * accent is one, and a flag emoji is one. Anything that measures, truncates or\n * steps through text a character at a time has to walk clusters or it will cut a\n * family emoji in half.\n */\n\n/** Lazily created, because constructing a `Segmenter` is not free. */\nlet segmenter: Intl.Segmenter | undefined\nlet segmenterChecked = false\n\nfunction getSegmenter(): Intl.Segmenter | undefined {\n if (!segmenterChecked) {\n segmenterChecked = true\n try {\n // `Intl.Segmenter` is missing on older Safari and on some minimal Node builds.\n if (typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\") {\n segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n }\n } catch {\n segmenter = undefined\n }\n }\n return segmenter\n}\n\n/**\n * Iterate the grapheme clusters of `str`.\n *\n * Uses `Intl.Segmenter` where it exists and falls back to code-point iteration\n * otherwise — which keeps surrogate pairs intact (so a plain emoji survives) but\n * cannot join a ZWJ sequence or a combining mark to its base.\n *\n * ```ts\n * [...iterateGraphemes(\"a👍🏽b\")] // [\"a\", \"👍🏽\", \"b\"]\n * ```\n */\nexport function* iterateGraphemes(str: string): Generator<string, void, undefined> {\n const seg = getSegmenter()\n if (seg) {\n for (const { segment } of seg.segment(str)) yield segment\n return\n }\n // SEMANTICS-ASSUMED: the fallback splits on code points. It is the closest\n // approximation available without shipping a Unicode break table, and it is\n // never worse than the `for (const c of str)` a caller would otherwise write.\n for (const codePoint of str) yield codePoint\n}\n\n/** The grapheme clusters of `str`, as an array. */\nexport function getGraphemes(str: string): string[] {\n return [...iterateGraphemes(str)]\n}\n\n/** How many grapheme clusters `str` has — its length as a reader would count it. */\nexport function getGraphemeLength(str: string): number {\n let n = 0\n for (const _ of iterateGraphemes(str)) n++\n return n\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ids.ts","../src/indexKey.ts","../src/zkey.ts","../src/RecordsDiff.ts","../src/migrate.ts","../src/legacy.ts","../src/StoreSchema.ts","../src/query.ts","../src/Store.ts","../src/tldr.ts","../src/computedCache.ts","../src/devFreeze.ts","../src/storage.ts","../src/graphemes.ts"],"names":["BASE_62","isPlainObject"],"mappings":"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","file":"index.js","sourcesContent":["import { nanoid } from \"nanoid\"\n\n/** Length of the unique part of a generated record id. */\nexport const UNIQUE_ID_LENGTH = 21\n\n/** Generate a URL-safe unique id (21 chars by default). */\nexport function uniqueId(size: number = UNIQUE_ID_LENGTH): string {\n return nanoid(size)\n}\n\n/**\n * A branded string id. The brand carries the record type so that ids of\n * different record types cannot be mixed up at compile time.\n */\nexport type RecordId<R extends UnknownRecord> = string & { __type__: R }\n\n/** Every record has an id and a type name. */\nexport interface BaseRecord<TypeName extends string, Id extends RecordId<UnknownRecord>> {\n readonly id: Id\n readonly typeName: TypeName\n}\n\nexport type UnknownRecord = BaseRecord<string, RecordId<UnknownRecord>>\n\nexport type IdOf<R extends UnknownRecord> = R[\"id\"]\n\n/** Extract the record type an id refers to. */\nexport type RecordFromId<K extends RecordId<UnknownRecord>> = K extends RecordId<infer R> ? R : never\n\n/**\n * Where a record lives:\n * - `document`: persisted, shared between collaborators (shapes, pages, ...)\n * - `session`: persisted locally only (camera, current page, ...)\n * - `presence`: shared but never persisted (cursors, ...)\n */\nexport type RecordScope = \"document\" | \"session\" | \"presence\"\n\nexport interface StoreValidator<R extends UnknownRecord> {\n validate(record: unknown): R\n /**\n * Optional fast path: validate `newRecord` knowing that `knownGoodVersion`\n * is a valid record of the same type. Implementations may skip the parts\n * that did not change.\n *\n * Declared as a property that may be `undefined` rather than as an optional\n * method, so that a validator carrying an explicit `undefined` — which is\n * what a class with an optional constructor argument produces — still\n * satisfies this under `exactOptionalPropertyTypes`.\n */\n validateUsingKnownGoodVersion?: ((knownGoodVersion: R, newRecord: unknown) => R) | undefined\n}\n\n/** Keys of `R` that hold data (everything except `id` and `typeName`). */\nexport type RecordDataKeys<R extends UnknownRecord> = Exclude<keyof R, \"id\" | \"typeName\">\n\nexport type EphemeralKeys<R extends UnknownRecord> = { readonly [K in RecordDataKeys<R>]: boolean }\n\nexport interface RecordTypeConfig<R extends UnknownRecord> {\n readonly scope: RecordScope\n readonly validator?: StoreValidator<R> | undefined\n /**\n * Keys whose changes should not be considered \"real\" document changes,\n * e.g. transient UI flags. Used by `Store.applyDiff({ ignoreEphemeralKeys })`.\n */\n readonly ephemeralKeys?: EphemeralKeys<R> | undefined\n}\n\n/**\n * Properties the caller must pass to `create()`: the record's data keys minus\n * whatever `withDefaultProperties` provides. `id` is always optional.\n */\nexport type RecordCreateProps<R extends UnknownRecord, RequiredProps extends keyof R> = Pick<\n R,\n RequiredProps\n> &\n Partial<Omit<R, RequiredProps | \"typeName\">>\n\n/**\n * Describes one kind of record in the store: how to make ids, defaults,\n * validation, and where the record lives (its scope).\n */\nexport class RecordType<R extends UnknownRecord, RequiredProps extends keyof R = RecordDataKeys<R>> {\n readonly typeName: R[\"typeName\"]\n readonly scope: RecordScope\n readonly validator: StoreValidator<R> | undefined\n readonly ephemeralKeys: EphemeralKeys<R> | undefined\n readonly ephemeralKeySet: ReadonlySet<string>\n\n constructor(\n typeName: R[\"typeName\"],\n private readonly config: RecordTypeConfig<R> & {\n readonly createDefaultProperties: () => Partial<Omit<R, \"id\" | \"typeName\">>\n },\n ) {\n this.typeName = typeName\n this.scope = config.scope\n this.validator = config.validator\n this.ephemeralKeys = config.ephemeralKeys\n const ephemeral = new Set<string>()\n if (config.ephemeralKeys) {\n for (const [key, value] of Object.entries(config.ephemeralKeys)) {\n if (value) ephemeral.add(key)\n }\n }\n this.ephemeralKeySet = ephemeral\n }\n\n /** Create a new record with defaults applied. A fresh id is generated when none is given. */\n create(properties: RecordCreateProps<R, RequiredProps>): R {\n const result: Record<string, unknown> = {\n ...this.config.createDefaultProperties(),\n ...(properties as Record<string, unknown>),\n }\n if (result[\"id\"] === undefined) result[\"id\"] = this.createId()\n result[\"typeName\"] = this.typeName\n return result as R\n }\n\n /** Shallow-clone a record (props/meta are shared). */\n clone(record: R): R {\n return { ...record }\n }\n\n /** Make an id of this type: `${typeName}:${uniquePart}`. */\n createId(customUniquePart?: string): IdOf<R> {\n return `${this.typeName}:${customUniquePart ?? uniqueId()}` as IdOf<R>\n }\n\n /** Recover the unique part of an id of this type. */\n parseId(id: IdOf<R>): string {\n if (!this.isId(id)) {\n throw new Error(`Id ${JSON.stringify(id)} is not a ${this.typeName} id`)\n }\n return (id as string).slice(this.typeName.length + 1)\n }\n\n isId(id?: string): id is IdOf<R> {\n if (typeof id !== \"string\") return false\n if (id.length <= this.typeName.length + 1) return false\n if (id.charCodeAt(this.typeName.length) !== 58 /* ':' */) return false\n return id.startsWith(this.typeName)\n }\n\n isInstance(record?: unknown): record is R {\n return (\n typeof record === \"object\" &&\n record !== null &&\n (record as { typeName?: unknown }).typeName === this.typeName\n )\n }\n\n /**\n * Return a new RecordType whose `create()` fills in the given defaults, so\n * those properties become optional for callers.\n */\n withDefaultProperties<DefaultProps extends RecordDataKeys<R>>(\n createDefaultProperties: () => Pick<R, DefaultProps>,\n ): RecordType<R, Exclude<RequiredProps, DefaultProps>> {\n return new RecordType<R, Exclude<RequiredProps, DefaultProps>>(this.typeName, {\n scope: this.scope,\n validator: this.validator,\n ephemeralKeys: this.ephemeralKeys,\n createDefaultProperties: createDefaultProperties as () => Partial<Omit<R, \"id\" | \"typeName\">>,\n })\n }\n\n /** Run the validator (if any). Throws on invalid input. */\n validate(record: unknown, recordBefore?: R): R {\n if (!this.validator) return record as R\n if (recordBefore !== undefined && this.validator.validateUsingKnownGoodVersion) {\n return this.validator.validateUsingKnownGoodVersion(recordBefore, record)\n }\n return this.validator.validate(record)\n }\n}\n\n/**\n * Define a record type.\n *\n * ```ts\n * const Book = createRecordType<Book>('book', { scope: 'document' })\n * .withDefaultProperties(() => ({ inStock: true }))\n * const b = Book.create({ title: 'Dune' }) // -> { id: 'book:...', typeName: 'book', title, inStock }\n * ```\n */\nexport function createRecordType<R extends UnknownRecord>(\n typeName: R[\"typeName\"],\n config: RecordTypeConfig<R>,\n): RecordType<R, RecordDataKeys<R>> {\n return new RecordType<R, RecordDataKeys<R>>(typeName, {\n scope: config.scope,\n validator: config.validator,\n ephemeralKeys: config.ephemeralKeys,\n createDefaultProperties: () => ({}),\n })\n}\n\n/** Split any `${typeName}:${unique}` id into its parts. */\nexport function parseRecordId(id: string): { typeName: string; uniquePart: string } {\n const colon = id.indexOf(\":\")\n if (colon <= 0 || colon === id.length - 1) {\n throw new Error(`Malformed record id ${JSON.stringify(id)}`)\n }\n return { typeName: id.slice(0, colon), uniquePart: id.slice(colon + 1) }\n}\n\n/** Assert that `value` looks like a record: an object with string `id` and `typeName`. */\nexport function isRecordLike(value: unknown): value is UnknownRecord {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { id?: unknown }).id === \"string\" &&\n typeof (value as { typeName?: unknown }).typeName === \"string\"\n )\n}\n","import { generateKeyBetween, generateNKeysBetween } from \"fractional-indexing\"\n\n/**\n * A fractional index: an order key that sorts lexicographically (plain string\n * comparison) and between which new keys can always be generated.\n */\nexport type IndexKey = string & { __brand: \"indexKey\" }\n\n/** The conventional first key. */\nexport const ZERO_INDEX_KEY = \"a0\" as IndexKey\n\nfunction assertOrdered(below: IndexKey | undefined, above: IndexKey | undefined) {\n if (below !== undefined && above !== undefined && !(below < above)) {\n throw new Error(`Index keys out of order: ${JSON.stringify(below)} must be below ${JSON.stringify(above)}`)\n }\n}\n\n/** Generate a key strictly between `below` and `above`; either may be omitted. Throws when `below >= above`. */\nexport function getIndexBetween(below?: IndexKey | undefined, above?: IndexKey | undefined): IndexKey {\n assertOrdered(below, above)\n return generateKeyBetween(below ?? null, above ?? null) as IndexKey\n}\n\n/** Generate a key strictly above `below` (or a first key when omitted). */\nexport function getIndexAbove(below?: IndexKey | undefined): IndexKey {\n return generateKeyBetween(below ?? null, null) as IndexKey\n}\n\n/** Generate a key strictly below `above` (or a first key when omitted). */\nexport function getIndexBelow(above?: IndexKey | undefined): IndexKey {\n return generateKeyBetween(null, above ?? null) as IndexKey\n}\n\n/** Generate `n` sorted keys strictly between `below` and `above`. */\nexport function getIndicesBetween(\n below: IndexKey | undefined,\n above: IndexKey | undefined,\n n: number,\n): IndexKey[] {\n assertOrdered(below, above)\n return generateNKeysBetween(below ?? null, above ?? null, n) as IndexKey[]\n}\n\n/** Generate `n` sorted keys strictly above `below`. */\nexport function getIndicesAbove(below: IndexKey | undefined, n: number): IndexKey[] {\n return generateNKeysBetween(below ?? null, null, n) as IndexKey[]\n}\n\n/** Generate `n` sorted keys strictly below `above`. */\nexport function getIndicesBelow(above: IndexKey | undefined, n: number): IndexKey[] {\n return generateNKeysBetween(null, above ?? null, n) as IndexKey[]\n}\n\n/**\n * Generate `n` sorted keys, the first of which is `start` (default `a0`).\n * Useful when creating `n` items at once.\n */\nexport function getIndices(n: number, start: IndexKey = ZERO_INDEX_KEY): IndexKey[] {\n if (n <= 0) return []\n validateIndexKey(start)\n return [start, ...getIndicesAbove(start, n - 1)]\n}\n\n/** Return a sorted copy of `items` ordered by their `index` (stable). */\nexport function sortByIndex<T extends { index: IndexKey }>(items: readonly T[]): T[] {\n return items\n .map((item, i) => [item, i] as const)\n .sort(([a, ai], [b, bi]) => {\n if (a.index < b.index) return -1\n if (a.index > b.index) return 1\n return ai - bi\n })\n .map(([item]) => item)\n}\n\n/** Compare two keys: negative, zero, or positive. */\nexport function compareIndexKeys(a: IndexKey, b: IndexKey): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\nconst BASE_62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nconst IS_DIGIT = new Uint8Array(128)\nfor (let i = 0; i < BASE_62.length; i++) IS_DIGIT[BASE_62.charCodeAt(i)] = 1\n\n/**\n * Length of the integer part (head marker included) encoded by a head\n * character, or -1 when the character is not a head marker.\n * `a`..`z` mark positive integer parts of length 2..27, `Z`..`A` negative ones.\n */\nfunction integerPartLength(head: number): number {\n if (head >= 97 && head <= 122) return head - 97 + 2 // a..z\n if (head >= 65 && head <= 90) return 90 - head + 2 // A..Z\n return -1\n}\n\n/**\n * Throws if `key` is not a well-formed fractional index key: a head marker,\n * enough base-62 integer digits for that head, then an optional fraction of\n * base-62 digits that does not end in `0`.\n * Narrows the type on success.\n */\nexport function validateIndexKey(key: string): asserts key is IndexKey {\n const fail = (why: string): never => {\n throw new Error(`Invalid index key ${JSON.stringify(key)}: ${why}`)\n }\n if (typeof key !== \"string\" || key.length === 0) fail(\"empty\")\n const intLen = integerPartLength(key.charCodeAt(0))\n if (intLen < 0) fail(\"bad head marker\")\n if (key.length < intLen) fail(`integer part needs ${intLen - 1} digits`)\n for (let i = 1; i < key.length; i++) {\n const c = key.charCodeAt(i)\n if (c > 127 || IS_DIGIT[c] !== 1) fail(`bad digit at ${i}`)\n }\n if (key.length > intLen && key.endsWith(\"0\")) fail(\"fraction ends in 0\")\n}\n\n/** Non-throwing variant of `validateIndexKey`. */\nexport function isIndexKey(key: unknown): key is IndexKey {\n if (typeof key !== \"string\") return false\n try {\n validateIndexKey(key)\n return true\n } catch {\n return false\n }\n}\n","import type { IndexKey } from \"./indexKey\"\n\n/**\n * Convert a fractional index key into a 64-bit unsigned sortable integer,\n * returned as two uint32 words `[lo, hi]` for transport into WASM memory.\n *\n * Key anatomy (fractional-indexing spec): the first character is a *head*\n * marker drawn from `A..Z` (negative integer parts, `Z` shortest) and `a..z`\n * (positive integer parts, `a` shortest). It encodes the length of the\n * integer part; the remaining characters are base-62 digits (integer digits\n * followed by fractional digits, no trailing `0` in the fraction).\n *\n * Because the head already sorts integer parts by length and sign, the\n * lexicographic order of two keys is: head rank first, then the digit string\n * compared as a zero-padded fixed-point fraction. We encode exactly that:\n *\n * zkey = headRank * 62^10 + Σ digit[i] * 62^(9 - i) for i in 0..9\n *\n * with headRank in 0..51 (`A`=0 … `Z`=25, `a`=26 … `z`=51). The maximum value\n * is 52 * 62^10 - 1 ≈ 4.36e18 < 2^64, so it fits in 64 bits. Ten base-62\n * digits after the head are significant; keys that agree on those ten digits\n * tie, which only happens for keys sharing a long common prefix.\n */\n\nconst BASE_62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nconst HEADS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n\n/** Number of base-62 digits (after the head marker) that affect the zkey. */\nexport const ZKEY_SIGNIFICANT_DIGITS = 10\n\nconst DIGIT_VALUE = new Int8Array(128).fill(-1)\nfor (let i = 0; i < BASE_62.length; i++) DIGIT_VALUE[BASE_62.charCodeAt(i)] = i\n\nconst HEAD_RANK = new Int8Array(128).fill(-1)\nfor (let i = 0; i < HEADS.length; i++) HEAD_RANK[HEADS.charCodeAt(i)] = i\n\nconst B = 62n\nconst B10 = B ** BigInt(ZKEY_SIGNIFICANT_DIGITS)\nconst MASK_32 = 0xffff_ffffn\n\nexport type ZKey = readonly [lo: number, hi: number]\n\nexport function indexKeyToZKey(key: IndexKey): [lo: number, hi: number] {\n if (key.length === 0) throw new Error(\"Cannot convert an empty index key\")\n const headRank = HEAD_RANK[key.charCodeAt(0)] ?? -1\n if (headRank < 0) throw new Error(`Invalid index key head in ${JSON.stringify(key)}`)\n\n let fraction = 0n\n const n = Math.min(key.length - 1, ZKEY_SIGNIFICANT_DIGITS)\n for (let i = 0; i < n; i++) {\n const d = DIGIT_VALUE[key.charCodeAt(i + 1)] ?? -1\n if (d < 0) throw new Error(`Invalid index key digit in ${JSON.stringify(key)}`)\n fraction = fraction * B + BigInt(d)\n }\n // Pad remaining digit positions with zero so shorter keys sort first.\n for (let i = n; i < ZKEY_SIGNIFICANT_DIGITS; i++) fraction *= B\n\n const value = BigInt(headRank) * B10 + fraction\n const lo = Number(value & MASK_32)\n const hi = Number((value >> 32n) & MASK_32)\n return [lo, hi]\n}\n\n/** Recombine a zkey into a BigInt (mostly for tests and debugging). */\nexport function zKeyToBigInt([lo, hi]: ZKey): bigint {\n return (BigInt(hi) << 32n) | BigInt(lo)\n}\n\n/** Compare two zkeys as unsigned 64-bit integers. */\nexport function compareZKeys(a: ZKey, b: ZKey): number {\n if (a[1] !== b[1]) return a[1] < b[1] ? -1 : 1\n if (a[0] !== b[0]) return a[0] < b[0] ? -1 : 1\n return 0\n}\n","import type { IdOf, UnknownRecord } from \"./ids\"\n\n/** A set of changes to a store's records. */\nexport interface RecordsDiff<R extends UnknownRecord> {\n added: Record<IdOf<R>, R>\n updated: Record<IdOf<R>, [from: R, to: R]>\n removed: Record<IdOf<R>, R>\n}\n\nexport function createEmptyRecordsDiff<R extends UnknownRecord>(): RecordsDiff<R> {\n return { added: {}, updated: {}, removed: {} } as RecordsDiff<R>\n}\n\nexport function isRecordsDiffEmpty<R extends UnknownRecord>(diff: RecordsDiff<R>): boolean {\n for (const _ in diff.added) return false\n for (const _ in diff.updated) return false\n for (const _ in diff.removed) return false\n return true\n}\n\n/** Produce the diff that undoes `diff`. */\nexport function reverseRecordsDiff<R extends UnknownRecord>(diff: RecordsDiff<R>): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const id in diff.added) {\n result.removed[id as IdOf<R>] = diff.added[id as IdOf<R>]!\n }\n for (const id in diff.removed) {\n result.added[id as IdOf<R>] = diff.removed[id as IdOf<R>]!\n }\n for (const id in diff.updated) {\n const [from, to] = diff.updated[id as IdOf<R>]!\n result.updated[id as IdOf<R>] = [to, from]\n }\n return result\n}\n\n/**\n * Record that `id` went from `before` to `after` in `target`, collapsing with\n * any change already recorded for the same id:\n *\n * added + updated -> added (latest)\n * added + removed -> (nothing)\n * updated + updated -> updated [original from, latest to]\n * updated + removed -> removed (original from)\n * removed + added -> updated [removed, added] (or nothing if identical)\n */\nexport function applyChangeToDiff<R extends UnknownRecord>(\n target: RecordsDiff<R>,\n id: IdOf<R>,\n before: R | undefined,\n after: R | undefined,\n): void {\n if (before === undefined && after === undefined) return\n\n if (id in target.added) {\n if (after === undefined) {\n delete target.added[id]\n } else {\n target.added[id] = after\n }\n return\n }\n\n if (id in target.updated) {\n const [from] = target.updated[id]!\n if (after === undefined) {\n delete target.updated[id]\n target.removed[id] = from\n } else if (from === after) {\n delete target.updated[id]\n } else {\n target.updated[id] = [from, after]\n }\n return\n }\n\n if (id in target.removed) {\n const original = target.removed[id]!\n if (after === undefined) return // removed twice: keep original\n delete target.removed[id]\n if (original !== after) target.updated[id] = [original, after]\n return\n }\n\n // No prior entry for this id.\n if (before === undefined) {\n if (after !== undefined) target.added[id] = after\n } else if (after === undefined) {\n target.removed[id] = before\n } else if (before !== after) {\n target.updated[id] = [before, after]\n }\n}\n\n/** Merge `diff` into `target` in place (see `applyChangeToDiff` for the rules). */\nexport function squashRecordDiffsMutable<R extends UnknownRecord>(\n target: RecordsDiff<R>,\n diff: RecordsDiff<R>,\n): void {\n for (const id in diff.added) {\n applyChangeToDiff(target, id as IdOf<R>, undefined, diff.added[id as IdOf<R>]!)\n }\n for (const id in diff.updated) {\n const [from, to] = diff.updated[id as IdOf<R>]!\n applyChangeToDiff(target, id as IdOf<R>, from, to)\n }\n for (const id in diff.removed) {\n applyChangeToDiff(target, id as IdOf<R>, diff.removed[id as IdOf<R>]!, undefined)\n }\n}\n\n/** Squash a sequence of diffs into one equivalent diff (does not mutate inputs). */\nexport function squashRecordDiffs<R extends UnknownRecord>(diffs: readonly RecordsDiff<R>[]): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const diff of diffs) squashRecordDiffsMutable(result, diff)\n return result\n}\n\n/** Shallow-copy a diff (entries are shared). */\nexport function cloneRecordsDiff<R extends UnknownRecord>(diff: RecordsDiff<R>): RecordsDiff<R> {\n return {\n added: { ...diff.added },\n updated: { ...diff.updated },\n removed: { ...diff.removed },\n } as RecordsDiff<R>\n}\n","import type { IdOf, UnknownRecord } from \"./ids\"\nimport type { SerializedSchemaV1 } from \"./legacy\"\n\n/** Serialized records keyed by id. */\nexport type SerializedStore<R extends UnknownRecord> = Record<IdOf<R>, R>\n\n/**\n * Persisted description of a schema: for each migration sequence, how many\n * migrations had been applied when the data was saved.\n */\nexport interface SerializedSchemaV2 {\n schemaVersion: 2\n sequences: { [sequenceId: string]: number }\n}\n\n/**\n * A persisted schema, in either format mocanvas can read.\n *\n * Only {@link SerializedSchemaV2} is ever *written* — see\n * `StoreSchema.serialize`. The v1 arm is here so a document saved by an older,\n * pre-sequence writer is still loadable rather than being rejected as\n * \"unsupported schema version\".\n */\nexport type SerializedSchema = SerializedSchemaV1 | SerializedSchemaV2\n\nexport type MigrationId = `${string}/${number}`\n\nexport interface RecordMigration {\n readonly id: MigrationId\n readonly scope: \"record\"\n /** Only records for which this returns true are migrated. Defaults to all records. */\n readonly filter?: ((record: UnknownRecord) => boolean) | undefined\n /** Mutate the record in place, or return a replacement. */\n readonly up: (record: UnknownRecord) => void | UnknownRecord\n readonly down?: ((record: UnknownRecord) => void | UnknownRecord) | undefined\n}\n\nexport interface StoreMigration {\n readonly id: MigrationId\n readonly scope: \"store\"\n /** Mutate the store in place, or return a replacement. */\n readonly up: (store: SerializedStore<UnknownRecord>) => void | SerializedStore<UnknownRecord>\n readonly down?:\n | ((store: SerializedStore<UnknownRecord>) => void | SerializedStore<UnknownRecord>)\n | undefined\n}\n\nexport type Migration = RecordMigration | StoreMigration\n\nexport interface MigrationSequence {\n readonly sequenceId: string\n /**\n * When data is loaded that has never seen this sequence, should every\n * migration be applied (`true`, the default) or should the data be assumed\n * already up to date (`false`)? Use `false` for sequences added to a type\n * that already existed before the sequence did.\n */\n readonly retroactive: boolean\n readonly sequence: readonly Migration[]\n}\n\nexport type MigrationResult<T> = { type: \"success\"; value: T } | { type: \"error\"; reason: string }\n\n/**\n * Build the ids of a sequence's migrations from friendly names:\n *\n * ```ts\n * const Versions = createMigrationIds('com.example.shape.box', { AddColor: 1, AddSize: 2 })\n * // Versions.AddColor === 'com.example.shape.box/1'\n * ```\n */\nexport function createMigrationIds<const ID extends string, const Versions extends Record<string, number>>(\n sequenceId: ID,\n versions: Versions,\n): { readonly [K in keyof Versions]: `${ID}/${Versions[K]}` } {\n const result: Record<string, string> = {}\n for (const [name, version] of Object.entries(versions)) {\n result[name] = `${sequenceId}/${version}`\n }\n return result as { readonly [K in keyof Versions]: `${ID}/${Versions[K]}` }\n}\n\nexport function parseMigrationId(id: string): { sequenceId: string; version: number } {\n const slash = id.lastIndexOf(\"/\")\n if (slash <= 0) throw new Error(`Malformed migration id ${JSON.stringify(id)}`)\n const version = Number(id.slice(slash + 1))\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(`Malformed migration id ${JSON.stringify(id)}: version must be a positive integer`)\n }\n return { sequenceId: id.slice(0, slash), version }\n}\n\n/**\n * Create a validated migration sequence. Migration ids must be\n * `${sequenceId}/1`, `${sequenceId}/2`, ... in order.\n */\nexport function createMigrationSequence(options: {\n sequenceId: string\n retroactive?: boolean | undefined\n sequence: readonly Migration[]\n}): MigrationSequence {\n const { sequenceId, retroactive = true, sequence } = options\n if (!sequenceId || sequenceId.includes(\"/\")) {\n throw new Error(`Invalid sequenceId ${JSON.stringify(sequenceId)}: must be non-empty and not contain \"/\"`)\n }\n sequence.forEach((migration, i) => {\n const id = migration.id\n const parsed = parseMigrationId(id)\n if (parsed.sequenceId !== sequenceId) {\n throw new Error(`Migration ${id} does not belong to sequence ${sequenceId}`)\n }\n if (parsed.version !== i + 1) {\n throw new Error(`Migration ${id} is out of order: expected version ${i + 1}`)\n }\n const scope: string = migration.scope\n if (scope !== \"record\" && scope !== \"store\") {\n throw new Error(`Migration ${id} has invalid scope ${JSON.stringify(scope)}`)\n }\n })\n return { sequenceId, retroactive, sequence: [...sequence] }\n}\n\n/**\n * Convenience for the common case: a sequence of record-scoped migrations\n * that all apply to one record type (optionally narrowed further by `filter`).\n */\nexport function createRecordMigrationSequence(options: {\n sequenceId: string\n recordType: string\n retroactive?: boolean | undefined\n filter?: ((record: UnknownRecord) => boolean) | undefined\n sequence: readonly Omit<RecordMigration, \"scope\" | \"filter\">[]\n}): MigrationSequence {\n const { recordType, filter } = options\n const combinedFilter = (record: UnknownRecord) =>\n record.typeName === recordType && (filter ? filter(record) : true)\n return createMigrationSequence({\n sequenceId: options.sequenceId,\n retroactive: options.retroactive,\n sequence: options.sequence.map(\n (m): RecordMigration => ({ id: m.id, scope: \"record\", filter: combinedFilter, up: m.up, down: m.down }),\n ),\n })\n}\n\n/** Apply one record migration to a single record, honoring its filter. */\nexport function applyRecordMigration(\n migration: RecordMigration,\n record: UnknownRecord,\n direction: \"up\" | \"down\",\n): UnknownRecord {\n if (migration.filter && !migration.filter(record)) return record\n const fn = direction === \"up\" ? migration.up : migration.down\n if (!fn) throw new Error(`Migration ${migration.id} has no ${direction} function`)\n const result = fn(record)\n return result === undefined ? record : result\n}\n\n/** Apply one migration (record- or store-scoped) to a whole store in place. */\nexport function applyMigrationToStore(\n migration: Migration,\n store: SerializedStore<UnknownRecord>,\n direction: \"up\" | \"down\",\n): SerializedStore<UnknownRecord> {\n if (migration.scope === \"store\") {\n const fn = direction === \"up\" ? migration.up : migration.down\n if (!fn) throw new Error(`Migration ${migration.id} has no ${direction} function`)\n const result = fn(store)\n return result === undefined ? store : result\n }\n for (const id in store) {\n const record = store[id as IdOf<UnknownRecord>]!\n const next = applyRecordMigration(migration, record, direction)\n if (next !== record) store[id as IdOf<UnknownRecord>] = next\n }\n return store\n}\n","/**\n * The pre-sequence migration format, and the reasons a migration can fail.\n *\n * Before migrations were named sequences, a schema declared one integer version\n * per record type plus one for the store, and a table of numbered up/down\n * functions between them. mocanvas never *writes* that format — {@link\n * SerializedSchemaV1} exists so a document saved by something that did can\n * still be recognised and loaded, and so a schema written against the old shape\n * can still be described.\n *\n * Nothing here changes what mocanvas persists. See `StoreSchema.serialize`,\n * which always produces the v2 shape.\n */\n\nimport type { UnknownRecord } from \"./ids\"\n\n/**\n * The persisted schema shape used before migration sequences: a version number\n * per record type, and one for the store as a whole.\n *\n * Read-only as far as mocanvas is concerned. A snapshot carrying one is treated\n * as knowing none of today's sequences, so every retroactive sequence runs from\n * the beginning — which is right, because none of them existed when the file\n * was written.\n */\nexport interface SerializedSchemaV1 {\n schemaVersion: 1\n storeVersion: number\n recordVersions: Record<\n string,\n { version: number } | { version: number; subTypeVersions: Record<string, number>; subTypeKey: string }\n >\n}\n\n/** Whether a persisted schema is in the pre-sequence format. */\nexport function isSerializedSchemaV1(schema: { schemaVersion: number }): schema is SerializedSchemaV1 {\n return schema.schemaVersion === 1\n}\n\n/** One numbered step of a {@link LegacyMigrations} table. */\nexport interface LegacyMigration<Before = any, After = any> {\n up: (oldState: Before) => After\n down: (newState: After) => Before\n}\n\n/** The version bounds every legacy migration table declares. */\nexport interface LegacyBaseMigrationsInfo {\n firstVersion: number\n currentVersion: number\n migrators: { [version: number]: LegacyMigration }\n}\n\n/**\n * A legacy migration table: the version range it covers, the numbered steps,\n * and optionally the sub-type split a record type used (a shape's `type`, say,\n * each with its own version line).\n */\nexport interface LegacyMigrations extends LegacyBaseMigrationsInfo {\n subTypeKey?: string\n subTypeMigrations?: Record<string, LegacyBaseMigrationsInfo>\n}\n\n/**\n * A dependency declared by a standalone migration sequence: it must run after\n * (or before) another sequence's numbered migration, even though neither owns\n * the other.\n *\n * Ordering between sequences is otherwise registration order, which is fine\n * until one sequence's `up` reads a field another sequence is still about to\n * add.\n */\nexport interface StandaloneDependsOn {\n dependsOn: readonly string[]\n}\n\n/**\n * Why loading a persisted snapshot failed.\n *\n * These are the cases worth telling apart in a UI: \"this file is from a newer\n * version of the app\" is a message a user can act on, and\n * \"migrationError\" is not.\n */\nexport const MigrationFailureReason = {\n /** The persisted schema names a sequence version higher than this schema knows. */\n TargetVersionTooNew: \"target-version-too-new\",\n /** The persisted data is older than the oldest migration that survives. */\n TargetVersionTooOld: \"target-version-too-old\",\n /** A record's type is not registered in this schema and cannot be migrated. */\n UnrecognizedType: \"unrecognized-type\",\n /** A migration function threw. */\n MigrationError: \"migration-error\",\n /** The persisted schema itself is malformed. */\n IncompatibleSubtype: \"incompatible-subtype\",\n /** The persisted schema version is not one this store understands. */\n UnknownSchemaVersion: \"unknown-schema-version\",\n} as const\n\n/** One of the {@link MigrationFailureReason} values. */\nexport type MigrationFailureReason = (typeof MigrationFailureReason)[keyof typeof MigrationFailureReason]\n","import { isRecordLike, type IdOf, type RecordScope, type RecordType, type UnknownRecord } from \"./ids\"\nimport {\n applyMigrationToStore,\n applyRecordMigration,\n type Migration,\n type MigrationResult,\n type MigrationSequence,\n type SerializedSchema,\n type SerializedSchemaV2,\n type SerializedStore,\n} from \"./migrate\"\nimport { isSerializedSchemaV1 } from \"./legacy\"\nimport type { Store } from \"./Store\"\n\nexport type StoreValidationPhase = \"initialize\" | \"createRecord\" | \"updateRecord\" | \"tests\"\n\nexport type RecordTypeMap<R extends UnknownRecord> = {\n readonly [TypeName in R[\"typeName\"]]: RecordType<Extract<R, { typeName: TypeName }>, any>\n}\n\nexport interface StoreValidationFailure<R extends UnknownRecord> {\n error: unknown\n store: Store<R, any>\n record: R\n phase: StoreValidationPhase\n recordBefore: R | null\n}\n\nexport interface StoreSchemaOptions<R extends UnknownRecord, Props> {\n readonly migrations?: readonly MigrationSequence[] | undefined\n /**\n * Called when a record fails validation. Return a repaired record to keep\n * going, or throw to abort the operation. When omitted the error is thrown.\n */\n readonly onValidationFailure?: ((data: StoreValidationFailure<R>) => R) | undefined\n /** Reserved for store-level integrity checks; unused by the schema itself. */\n readonly createIntegrityChecker?: ((store: Store<R, Props>) => void) | undefined\n}\n\nexport interface StoreSnapshot<R extends UnknownRecord> {\n store: SerializedStore<R>\n schema: SerializedSchema\n}\n\n/**\n * The set of record types a store holds plus the migrations that bring\n * persisted data up to date.\n */\nexport class StoreSchema<R extends UnknownRecord, Props = unknown> {\n static create<R extends UnknownRecord, Props = unknown>(\n types: RecordTypeMap<R>,\n options?: StoreSchemaOptions<R, Props>,\n ): StoreSchema<R, Props> {\n return new StoreSchema<R, Props>(types, options ?? {})\n }\n\n readonly migrations: Readonly<Record<string, MigrationSequence>>\n /** All migrations in application order (sequence registration order, then version). */\n readonly sortedMigrations: readonly Migration[]\n private readonly typeByName: ReadonlyMap<string, RecordType<R, any>>\n\n private constructor(\n readonly types: RecordTypeMap<R>,\n private readonly options: StoreSchemaOptions<R, Props>,\n ) {\n const byName = new Map<string, RecordType<R, any>>()\n for (const [name, type] of Object.entries(types) as [string, RecordType<R, any>][]) {\n if (type.typeName !== name) {\n throw new Error(`Record type registered under \"${name}\" has typeName \"${type.typeName}\"`)\n }\n byName.set(name, type)\n }\n this.typeByName = byName\n\n const migrations: Record<string, MigrationSequence> = {}\n const sorted: Migration[] = []\n const seenIds = new Set<string>()\n for (const sequence of options.migrations ?? []) {\n if (migrations[sequence.sequenceId]) {\n throw new Error(`Duplicate migration sequence \"${sequence.sequenceId}\"`)\n }\n migrations[sequence.sequenceId] = sequence\n for (const migration of sequence.sequence) {\n if (seenIds.has(migration.id)) throw new Error(`Duplicate migration id \"${migration.id}\"`)\n seenIds.add(migration.id)\n sorted.push(migration)\n }\n }\n this.migrations = migrations\n this.sortedMigrations = sorted\n }\n\n getType(typeName: string): RecordType<R, any> | undefined {\n return this.typeByName.get(typeName)\n }\n\n /** Scope of a record type; unknown types are treated as `document`. */\n getScope(typeName: string): RecordScope {\n return this.typeByName.get(typeName)?.scope ?? \"document\"\n }\n\n /**\n * Validate a record, delegating to its record type's validator.\n *\n * Two things are checked before the delegation. First, the value has to be a\n * record at all: an object with a string `id` and a string `typeName`.\n * Without that check a value carrying no `typeName` looks up `undefined` in\n * the type map, misses, and takes the unknown-type path below — which is how\n * `store.put([{ id: \"shape:bogus\", x: 0, y: 0 }])` used to be accepted.\n *\n * Second, a record whose `typeName` this schema does not know is passed\n * through untouched, so foreign data survives a load/save round-trip. That\n * is the escape hatch; it is not meant to cover malformed input, hence the\n * first check.\n */\n validateRecord(\n store: Store<R, any>,\n record: R,\n phase: StoreValidationPhase,\n recordBefore: R | undefined,\n ): R {\n if (!isRecordLike(record)) {\n return this.onFailure(\n new Error(\n `Expected a record with a string \\`id\\` and \\`typeName\\`, got ${describeRecord(record)}`,\n ),\n store,\n record,\n phase,\n recordBefore,\n )\n }\n const type = this.typeByName.get(record.typeName)\n if (!type) return record\n try {\n return type.validate(record, recordBefore)\n } catch (error) {\n return this.onFailure(error, store, record, phase, recordBefore)\n }\n }\n\n private onFailure(\n error: unknown,\n store: Store<R, any>,\n record: R,\n phase: StoreValidationPhase,\n recordBefore: R | undefined,\n ): R {\n if (this.options.onValidationFailure) {\n return this.options.onValidationFailure({\n error,\n store,\n record,\n phase,\n recordBefore: recordBefore ?? null,\n })\n }\n throw error\n }\n\n /** The current version of every sequence. Always the v2 shape — mocanvas never writes v1. */\n serialize(): SerializedSchemaV2 {\n const sequences: Record<string, number> = {}\n for (const sequence of Object.values(this.migrations)) {\n sequences[sequence.sequenceId] = sequence.sequence.length\n }\n return { schemaVersion: 2, sequences }\n }\n\n /** A schema at version 0 of every sequence (all migrations still pending). */\n serializeEarliestVersion(): SerializedSchemaV2 {\n const sequences: Record<string, number> = {}\n for (const sequence of Object.values(this.migrations)) sequences[sequence.sequenceId] = 0\n return { schemaVersion: 2, sequences }\n }\n\n /**\n * The migrations that must run to bring data saved under `persistedSchema`\n * up to this schema, in order. Sequences the persisted schema knows but we\n * do not are ignored with a warning.\n */\n getMigrationsSince(persistedSchema: SerializedSchema): MigrationResult<Migration[]> {\n // A pre-sequence schema records one version number per record type and\n // says nothing about which of today's sequences have run. There is no\n // sound mapping from that to sequence versions, and guessing would\n // re-apply migrations that had already been applied — so this is refused\n // rather than migrated. `SerializedSchemaV1` exists so such a file can be\n // *recognised* and reported, not silently corrupted.\n if (isSerializedSchemaV1(persistedSchema)) {\n return {\n type: \"error\",\n reason:\n \"Schema version 1 (per-record-type versions) predates migration sequences and cannot be migrated automatically\",\n }\n }\n if (persistedSchema.schemaVersion !== 2) {\n return {\n type: \"error\",\n reason: `Unsupported schema version ${String((persistedSchema as { schemaVersion: unknown }).schemaVersion)}`,\n }\n }\n return this.migrationsSince(persistedSchema.sequences ?? {})\n }\n\n private migrationsSince(persisted: { [sequenceId: string]: number }): MigrationResult<Migration[]> {\n for (const sequenceId of Object.keys(persisted)) {\n if (!this.migrations[sequenceId]) {\n console.warn(`[store] ignoring unknown migration sequence \"${sequenceId}\" in persisted schema`)\n }\n }\n\n const result: Migration[] = []\n for (const sequence of Object.values(this.migrations)) {\n const persistedVersion = persisted[sequence.sequenceId]\n let startAt: number\n if (persistedVersion === undefined) {\n if (!sequence.retroactive) continue\n startAt = 0\n } else {\n if (!Number.isInteger(persistedVersion) || persistedVersion < 0) {\n return { type: \"error\", reason: `Invalid version ${String(persistedVersion)} for sequence \"${sequence.sequenceId}\"` }\n }\n if (persistedVersion > sequence.sequence.length) {\n return {\n type: \"error\",\n reason: `Sequence \"${sequence.sequenceId}\" is at version ${persistedVersion} but this schema only knows ${sequence.sequence.length}: data comes from a newer version`,\n }\n }\n startAt = persistedVersion\n }\n for (let i = startAt; i < sequence.sequence.length; i++) result.push(sequence.sequence[i]!)\n }\n return { type: \"success\", value: result }\n }\n\n /**\n * Migrate a single record. Only record-scoped migrations can be applied;\n * encountering a store-scoped one is an error. `down` runs the migrations\n * in reverse (from this schema to `persistedSchema`).\n */\n migratePersistedRecord(\n record: UnknownRecord,\n persistedSchema: SerializedSchema,\n direction: \"up\" | \"down\" = \"up\",\n ): MigrationResult<UnknownRecord> {\n const migrations = this.getMigrationsSince(persistedSchema)\n if (migrations.type === \"error\") return migrations\n const ordered = direction === \"up\" ? migrations.value : [...migrations.value].reverse()\n let current: UnknownRecord = structuredClone(record)\n try {\n for (const migration of ordered) {\n if (migration.scope !== \"record\") {\n return { type: \"error\", reason: `Migration ${migration.id} is store-scoped and cannot be applied to a single record` }\n }\n if (direction === \"down\" && !migration.down) {\n return { type: \"error\", reason: `Migration ${migration.id} has no down migration` }\n }\n current = applyRecordMigration(migration, current, direction)\n }\n } catch (error) {\n return { type: \"error\", reason: `Migration failed: ${error instanceof Error ? error.message : String(error)}` }\n }\n return { type: \"success\", value: current }\n }\n\n /**\n * Bring a whole persisted store up to date. The input is not mutated.\n * Records of types this schema does not know are preserved as-is.\n */\n migrateStoreSnapshot(snapshot: StoreSnapshot<R>): MigrationResult<SerializedStore<R>> {\n const migrations = this.getMigrationsSince(snapshot.schema)\n if (migrations.type === \"error\") return migrations\n\n let store: SerializedStore<UnknownRecord> = structuredClone(snapshot.store)\n if (migrations.value.length === 0) return { type: \"success\", value: store as SerializedStore<R> }\n\n try {\n for (const migration of migrations.value) {\n store = applyMigrationToStore(migration, store, \"up\")\n }\n } catch (error) {\n return { type: \"error\", reason: `Migration failed: ${error instanceof Error ? error.message : String(error)}` }\n }\n\n // Migrations must not change a record's id or lose it.\n for (const id in store) {\n const record = store[id as IdOf<UnknownRecord>]\n if (!record || record.id !== id) {\n return { type: \"error\", reason: `Migration produced a record whose id does not match its key (${id})` }\n }\n }\n return { type: \"success\", value: store as SerializedStore<R> }\n }\n}\n\n/** How a non-record reads back in the failure message. */\nfunction describeRecord(value: unknown): string {\n if (value === null) return \"null\"\n if (typeof value !== \"object\") return typeof value\n if (Array.isArray(value)) return \"an array\"\n const { id, typeName } = value as { id?: unknown; typeName?: unknown }\n const parts: string[] = []\n parts.push(typeof id === \"string\" ? `id ${JSON.stringify(id)}` : `id ${id === undefined ? \"missing\" : typeof id}`)\n parts.push(\n typeof typeName === \"string\"\n ? `typeName ${JSON.stringify(typeName)}`\n : `typeName ${typeName === undefined ? \"missing\" : typeof typeName}`,\n )\n return `an object with ${parts.join(\" and \")}`\n}\n","/**\n * Declarative queries over the store, and the incremental indexes they run on.\n *\n * A query is a plain object — `{ type: { eq: \"geo\" }, parentId: { eq: pageId } }`\n * — rather than a predicate function, and that is the point: an object can be\n * inspected. The store picks one of the query's properties, maintains an index\n * from that property's value to the ids that hold it, and answers the query by\n * intersecting index buckets instead of scanning every record. A predicate can\n * only be run over everything.\n *\n * The index is itself a signal, and it carries diffs: a dependent that already\n * built a result can patch it from {@link RSIndexDiff} rather than rebuilding.\n */\n\nimport type { IdOf, UnknownRecord } from \"./ids\"\n\n/**\n * What changed in a set: the members added and the members removed.\n *\n * Either side may be absent, which means \"nothing on that side\" — a diff with\n * neither is a diff that says nothing happened.\n */\nexport interface CollectionDiff<T> {\n added?: Set<T>\n removed?: Set<T>\n}\n\n/**\n * How one property of a record is matched.\n *\n * SEMANTICS-ASSUMED: three comparisons — equality, inequality and a numeric\n * greater-than — are what an index can answer without scanning, which is the\n * whole reason queries are data rather than functions. `gt` is deliberately\n * numeric: the only ordered property records carry is a number.\n */\nexport type QueryValueMatcher<T> = { eq: T } | { neq: T } | { gt: number }\n\n/**\n * A query over the records of one type: property name to matcher, every entry\n * of which must hold (they are ANDed).\n *\n * ```ts\n * store.query.records(\"shape\", () => ({ type: { eq: \"geo\" }, isLocked: { eq: false } }))\n * ```\n */\nexport type QueryExpression<R extends object> = {\n [K in keyof R]?: QueryValueMatcher<R[K]>\n}\n\n/**\n * An index over one property of one record type: for each value that property\n * takes, the ids of the records that hold it.\n */\nexport type RSIndexMap<R extends UnknownRecord, Property extends keyof R & string = keyof R & string> = Map<\n R[Property],\n Set<IdOf<R>>\n>\n\n/** How an {@link RSIndexMap} changed: per property value, which ids joined and left. */\nexport type RSIndexDiff<R extends UnknownRecord, Property extends keyof R & string = keyof R & string> = Map<\n R[Property],\n CollectionDiff<IdOf<R>>\n>\n\n/**\n * A live index over one property, as a diff-carrying signal.\n *\n * Reading it gives the current {@link RSIndexMap}; asking it for the diffs\n * since a past epoch gives {@link RSIndexDiff}s that describe how to get from\n * the old map to the new one.\n */\nexport type RSIndex<R extends UnknownRecord, Property extends keyof R & string = keyof R & string> = import(\"./_signals\").Computed<\n RSIndexMap<R, Property>,\n RSIndexDiff<R, Property>\n>\n\n/** Whether `value` satisfies `matcher`. */\nexport function matchesQueryValue<T>(matcher: QueryValueMatcher<T>, value: T): boolean {\n if (\"eq\" in matcher) return Object.is(matcher.eq, value)\n if (\"neq\" in matcher) return !Object.is(matcher.neq, value)\n return typeof value === \"number\" && value > matcher.gt\n}\n\n/** Whether `record` satisfies every entry of `query`. An empty query matches everything. */\nexport function matchesQuery<R extends object>(query: QueryExpression<R>, record: R): boolean {\n for (const key of Object.keys(query) as (keyof R)[]) {\n const matcher = query[key]\n if (matcher === undefined) continue\n if (!matchesQueryValue(matcher, record[key])) return false\n }\n return true\n}\n\n/**\n * The property this query can be answered from an index on, or `undefined`\n * when none of it is indexable.\n *\n * Only an `eq` clause narrows to a single index bucket; `neq` and `gt` still\n * need every bucket looked at, so they are no better than a scan. The first\n * `eq` wins — the remaining clauses are checked against the records it yields.\n */\nexport function getIndexablePropertyOf<R extends object>(query: QueryExpression<R>): (keyof R & string) | undefined {\n for (const key of Object.keys(query) as (keyof R & string)[]) {\n const matcher = query[key]\n if (matcher && \"eq\" in matcher) return key\n }\n return undefined\n}\n\n/** Apply a {@link CollectionDiff} to a set, in place. */\nexport function applyCollectionDiff<T>(set: Set<T>, diff: CollectionDiff<T>): Set<T> {\n if (diff.removed) for (const value of diff.removed) set.delete(value)\n if (diff.added) for (const value of diff.added) set.add(value)\n return set\n}\n\n/** Whether a {@link CollectionDiff} describes no change at all. */\nexport function isCollectionDiffEmpty<T>(diff: CollectionDiff<T>): boolean {\n return (diff.added?.size ?? 0) === 0 && (diff.removed?.size ?? 0) === 0\n}\n","import {\n atom,\n computed,\n isUninitialized,\n RESET_VALUE,\n transact,\n unsafe__withoutCapture,\n withDiff,\n type Atom,\n type Computed,\n} from \"./_signals\"\nimport type { IdOf, RecordFromId, RecordScope, RecordType, StoreValidator, UnknownRecord } from \"./ids\"\nimport { parseRecordId, uniqueId } from \"./ids\"\nimport {\n getIndexablePropertyOf,\n matchesQuery,\n type CollectionDiff,\n type QueryExpression,\n type RSIndex,\n type RSIndexDiff,\n type RSIndexMap,\n} from \"./query\"\nimport type { SerializedSchema, SerializedStore } from \"./migrate\"\nimport {\n applyChangeToDiff,\n createEmptyRecordsDiff,\n isRecordsDiffEmpty,\n squashRecordDiffs,\n type RecordsDiff,\n} from \"./RecordsDiff\"\nimport type { StoreSchema, StoreSnapshot, StoreValidationPhase } from \"./StoreSchema\"\n\nexport type ChangeSource = \"user\" | \"remote\"\n\nexport interface HistoryEntry<R extends UnknownRecord> {\n changes: RecordsDiff<R>\n source: ChangeSource\n}\n\nexport type StoreListener<R extends UnknownRecord> = (entry: HistoryEntry<R>) => void\n\nexport interface StoreListenerFilters {\n source: ChangeSource | \"all\"\n scope: RecordScope | \"all\"\n}\n\nexport type RecordFromTypeName<R extends UnknownRecord, T extends string> = Extract<R, { typeName: T }>\n\nexport type StoreRecord<S extends Store<any, any>> = S extends Store<infer R, any> ? R : never\n\n/**\n * Anything that owns a store: a `Store` itself, or an object holding one (an\n * `Editor`). Written for the helpers that want to accept either without their\n * callers having to reach for `.store`.\n */\nexport type StoreObject<R extends UnknownRecord = UnknownRecord> = Store<R, any> | { store: Store<R, any> }\n\n/** The record union of whatever store a {@link StoreObject} carries. */\nexport type StoreObjectRecordType<Context extends StoreObject<any>> = Context extends Store<infer R, any>\n ? R\n : Context extends { store: Store<infer R, any> }\n ? R\n : never\n\n/** A validator per record type, as `StoreSchema` collects them from the record types. */\nexport type StoreValidators<R extends UnknownRecord> = {\n [TypeName in R[\"typeName\"]]: StoreValidator<Extract<R, { typeName: TypeName }>>\n}\n\n/**\n * A record that failed validation, with enough context to say what was being\n * done to it at the time.\n *\n * Thrown rather than returned: a store that keeps going after writing an\n * invalid record is a store whose next save produces a file nothing can load.\n */\nexport interface StoreError {\n error: Error\n phase: \"initialize\" | \"createRecord\" | \"updateRecord\" | \"tests\"\n recordBefore?: unknown\n recordAfter: unknown\n isExistingValidationIssue: boolean\n}\n\nexport interface StoreOptions<R extends UnknownRecord, Props> {\n schema: StoreSchema<R, Props>\n initialData?: SerializedStore<R> | undefined\n props: Props\n id?: string | undefined\n}\n\n/* ------------------------------------------------------------------------ */\n/* side effects */\n/* ------------------------------------------------------------------------ */\n\nexport type StoreBeforeCreateHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => R\nexport type StoreAfterCreateHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void\nexport type StoreBeforeChangeHandler<R extends UnknownRecord> = (prev: R, next: R, source: ChangeSource) => R\nexport type StoreAfterChangeHandler<R extends UnknownRecord> = (prev: R, next: R, source: ChangeSource) => void\n/** Return `false` to veto the deletion. */\nexport type StoreBeforeDeleteHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void | false\nexport type StoreAfterDeleteHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void\nexport type StoreOperationCompleteHandler = (source: ChangeSource) => void\n\nexport interface StoreSideEffectHandlers<R extends UnknownRecord> {\n beforeCreate?: StoreBeforeCreateHandler<R> | undefined\n afterCreate?: StoreAfterCreateHandler<R> | undefined\n beforeChange?: StoreBeforeChangeHandler<R> | undefined\n afterChange?: StoreAfterChangeHandler<R> | undefined\n beforeDelete?: StoreBeforeDeleteHandler<R> | undefined\n afterDelete?: StoreAfterDeleteHandler<R> | undefined\n}\n\ninterface HandlerSets<R extends UnknownRecord> {\n beforeCreate: Set<StoreBeforeCreateHandler<R>>\n afterCreate: Set<StoreAfterCreateHandler<R>>\n beforeChange: Set<StoreBeforeChangeHandler<R>>\n afterChange: Set<StoreAfterChangeHandler<R>>\n beforeDelete: Set<StoreBeforeDeleteHandler<R>>\n afterDelete: Set<StoreAfterDeleteHandler<R>>\n}\n\n/**\n * Hooks that run around record writes. `before*` handlers may replace the\n * record being written (or veto a delete); `after*` handlers observe.\n * `operationComplete` handlers run once when the outermost operation ends,\n * before history listeners are notified.\n */\nexport class StoreSideEffects<R extends UnknownRecord> {\n private readonly byType = new Map<string, HandlerSets<R>>()\n private readonly operationComplete = new Set<StoreOperationCompleteHandler>()\n private enabled = true\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n setIsEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n private sets(typeName: string): HandlerSets<R> {\n let sets = this.byType.get(typeName)\n if (!sets) {\n sets = {\n beforeCreate: new Set(),\n afterCreate: new Set(),\n beforeChange: new Set(),\n afterChange: new Set(),\n beforeDelete: new Set(),\n afterDelete: new Set(),\n }\n this.byType.set(typeName, sets)\n }\n return sets\n }\n\n private add<K extends keyof HandlerSets<R>>(\n typeName: string,\n kind: K,\n handler: HandlerSets<R>[K] extends Set<infer H> ? H : never,\n ): () => void {\n const set = this.sets(typeName)[kind] as Set<unknown>\n set.add(handler)\n return () => {\n set.delete(handler)\n }\n }\n\n /** Register several handlers for several types at once. Returns a disposer for all of them. */\n register(handlers: {\n [T in R[\"typeName\"]]?: StoreSideEffectHandlers<RecordFromTypeName<R, T>>\n }): () => void {\n const disposers: (() => void)[] = []\n for (const [typeName, h] of Object.entries(handlers) as [string, StoreSideEffectHandlers<any> | undefined][]) {\n if (!h) continue\n if (h.beforeCreate) disposers.push(this.add(typeName, \"beforeCreate\", h.beforeCreate))\n if (h.afterCreate) disposers.push(this.add(typeName, \"afterCreate\", h.afterCreate))\n if (h.beforeChange) disposers.push(this.add(typeName, \"beforeChange\", h.beforeChange))\n if (h.afterChange) disposers.push(this.add(typeName, \"afterChange\", h.afterChange))\n if (h.beforeDelete) disposers.push(this.add(typeName, \"beforeDelete\", h.beforeDelete))\n if (h.afterDelete) disposers.push(this.add(typeName, \"afterDelete\", h.afterDelete))\n }\n return () => disposers.forEach((d) => d())\n }\n\n registerBeforeCreateHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeCreateHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeCreate\", handler as unknown as StoreBeforeCreateHandler<R>)\n }\n\n registerAfterCreateHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterCreateHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterCreate\", handler as unknown as StoreAfterCreateHandler<R>)\n }\n\n registerBeforeChangeHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeChangeHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeChange\", handler as unknown as StoreBeforeChangeHandler<R>)\n }\n\n registerAfterChangeHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterChangeHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterChange\", handler as unknown as StoreAfterChangeHandler<R>)\n }\n\n registerBeforeDeleteHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeDeleteHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeDelete\", handler as unknown as StoreBeforeDeleteHandler<R>)\n }\n\n registerAfterDeleteHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterDeleteHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterDelete\", handler as unknown as StoreAfterDeleteHandler<R>)\n }\n\n registerOperationCompleteHandler(handler: StoreOperationCompleteHandler): () => void {\n this.operationComplete.add(handler)\n return () => {\n this.operationComplete.delete(handler)\n }\n }\n\n /** @internal */\n handleBeforeCreate(record: R, source: ChangeSource): R {\n const sets = this.byType.get(record.typeName)\n if (!sets) return record\n let result = record\n for (const handler of sets.beforeCreate) result = handler(result, source)\n return result\n }\n\n /** @internal */\n handleAfterCreate(record: R, source: ChangeSource): void {\n const sets = this.byType.get(record.typeName)\n if (!sets) return\n for (const handler of sets.afterCreate) handler(record, source)\n }\n\n /** @internal */\n handleBeforeChange(prev: R, next: R, source: ChangeSource): R {\n const sets = this.byType.get(next.typeName)\n if (!sets) return next\n let result = next\n for (const handler of sets.beforeChange) result = handler(prev, result, source)\n return result\n }\n\n /** @internal */\n handleAfterChange(prev: R, next: R, source: ChangeSource): void {\n const sets = this.byType.get(next.typeName)\n if (!sets) return\n for (const handler of sets.afterChange) handler(prev, next, source)\n }\n\n /** @internal Returns false when a handler vetoed the delete. */\n handleBeforeDelete(record: R, source: ChangeSource): boolean {\n const sets = this.byType.get(record.typeName)\n if (!sets) return true\n for (const handler of sets.beforeDelete) {\n if (handler(record, source) === false) return false\n }\n return true\n }\n\n /** @internal */\n handleAfterDelete(record: R, source: ChangeSource): void {\n const sets = this.byType.get(record.typeName)\n if (!sets) return\n for (const handler of sets.afterDelete) handler(record, source)\n }\n\n /** @internal */\n handleOperationComplete(source: ChangeSource): void {\n for (const handler of this.operationComplete) handler(source)\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* helpers */\n/* ------------------------------------------------------------------------ */\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nfunction shallowEqualObjects(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n if (a === b) return true\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (!(key in b) || a[key] !== b[key]) return false\n }\n return true\n}\n\n/**\n * Records are considered unchanged when every top-level value is identical,\n * with `props` and `meta` compared one level deeper. Cheap enough to run on\n * every `put`, and avoids no-op history entries.\n */\nexport function isRecordShallowEqual(a: UnknownRecord, b: UnknownRecord): boolean {\n if (a === b) return true\n const ao = a as unknown as Record<string, unknown>\n const bo = b as unknown as Record<string, unknown>\n const aKeys = Object.keys(ao)\n const bKeys = Object.keys(bo)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (!(key in bo)) return false\n const av = ao[key]\n const bv = bo[key]\n if (av === bv) continue\n if ((key === \"props\" || key === \"meta\") && isPlainObject(av) && isPlainObject(bv)) {\n if (!shallowEqualObjects(av, bv)) return false\n continue\n }\n return false\n }\n return true\n}\n\n/** Freeze a record and its `props` / `meta` bags (one level). */\nexport function freezeRecord<R extends UnknownRecord>(record: R): R {\n const r = record as unknown as Record<string, unknown>\n if (isPlainObject(r[\"props\"]) && !Object.isFrozen(r[\"props\"])) Object.freeze(r[\"props\"])\n if (isPlainObject(r[\"meta\"]) && !Object.isFrozen(r[\"meta\"])) Object.freeze(r[\"meta\"])\n return Object.freeze(record)\n}\n\ninterface TypeIndex<R extends UnknownRecord> {\n /** Mutated in place on every add/remove: O(1) per record. */\n readonly live: Set<IdOf<R>>\n /** Bumped whenever `live` changes; the reactive handle on membership. */\n readonly epoch: Atom<number>\n}\n\ninterface Listener<R extends UnknownRecord> {\n onHistory: StoreListener<R>\n filters: StoreListenerFilters\n}\n\n/* ------------------------------------------------------------------------ */\n/* queries */\n/* ------------------------------------------------------------------------ */\n\n/** Reactive views over the store's records, cached per type name. */\n/**\n * How the records of one type are narrowed: a predicate, or a declarative\n * {@link QueryExpression} the store can answer from an index.\n *\n * Prefer the query object. A predicate has to be run against every record of\n * the type; a query with an `eq` clause is answered from an index bucket.\n */\nexport type StoreQueryFilter<Rec extends UnknownRecord> =\n | ((record: Rec) => boolean)\n | QueryExpression<Rec>\n\nfunction toPredicate<Rec extends UnknownRecord>(filter: StoreQueryFilter<Rec>): (record: Rec) => boolean {\n return typeof filter === \"function\" ? filter : (record) => matchesQuery(filter, record)\n}\n\nexport class StoreQueries<R extends UnknownRecord> {\n private readonly idsCache = new Map<string, Computed<ReadonlySet<IdOf<R>>>>()\n private readonly recordsCache = new Map<string, Computed<R[]>>()\n private readonly indexCache = new Map<string, RSIndex<any, any>>()\n private readonly historyCache = new Map<string, Computed<number, RecordsDiff<R>>>()\n\n constructor(private readonly store: Store<R, any>) {}\n\n /**\n * The set of ids of every record of `typeName`, optionally narrowed by a\n * filter. Maintained incrementally.\n */\n ids<T extends R[\"typeName\"]>(\n typeName: T,\n filter?: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<ReadonlySet<IdOf<RecordFromTypeName<R, T>>>> {\n if (filter) {\n const records = this.records(typeName, filter)\n return computed(`store:${this.store.id}:ids:${typeName}:filtered`, () => {\n const set = new Set<IdOf<RecordFromTypeName<R, T>>>()\n for (const record of records.get()) set.add(record.id as IdOf<RecordFromTypeName<R, T>>)\n return set as ReadonlySet<IdOf<RecordFromTypeName<R, T>>>\n })\n }\n let c = this.idsCache.get(typeName)\n if (!c) {\n const index = this.store.getTypeIndex(typeName)\n c = computed(`store:${this.store.id}:ids:${typeName}`, () => {\n index.epoch.get()\n return new Set(index.live) as ReadonlySet<IdOf<R>>\n })\n this.idsCache.set(typeName, c)\n }\n return c as unknown as Computed<ReadonlySet<IdOf<RecordFromTypeName<R, T>>>>\n }\n\n /**\n * Every record of `typeName`, in insertion order, optionally narrowed by a\n * filter.\n *\n * A {@link QueryExpression} with an `eq` clause is answered from the index on\n * that property, so a page with ten thousand shapes does not have to be\n * walked to find the twelve on one frame.\n */\n records<T extends R[\"typeName\"]>(\n typeName: T,\n filter?: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<RecordFromTypeName<R, T>[]> {\n if (filter) return this.filteredRecords(typeName, filter)\n let c = this.recordsCache.get(typeName)\n if (!c) {\n const ids = this.ids(typeName)\n c = computed(`store:${this.store.id}:records:${typeName}`, () => {\n const result: R[] = []\n for (const id of ids.get()) {\n const record = this.store.get(id as IdOf<R>) as R | undefined\n if (record !== undefined) result.push(record)\n }\n return result\n })\n this.recordsCache.set(typeName, c)\n }\n return c as unknown as Computed<RecordFromTypeName<R, T>[]>\n }\n\n private filteredRecords<T extends R[\"typeName\"]>(\n typeName: T,\n filter: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<RecordFromTypeName<R, T>[]> {\n type Rec = RecordFromTypeName<R, T>\n const predicate = toPredicate<Rec>(filter)\n const indexedProperty = typeof filter === \"function\" ? undefined : getIndexablePropertyOf(filter)\n\n if (indexedProperty !== undefined) {\n const clause = (filter as QueryExpression<Rec>)[indexedProperty as keyof Rec]\n const wanted = clause && \"eq\" in clause ? clause.eq : undefined\n const index = this.index(typeName, indexedProperty as keyof Rec & string)\n return computed(`store:${this.store.id}:records:${typeName}:${String(indexedProperty)}`, () => {\n const bucket = index.get().get(wanted as Rec[keyof Rec & string])\n if (!bucket) return []\n const result: Rec[] = []\n for (const id of bucket) {\n const record = this.store.get(id as IdOf<R>) as Rec | undefined\n if (record !== undefined && predicate(record)) result.push(record)\n }\n return result\n })\n }\n\n const all = this.records(typeName)\n return computed(`store:${this.store.id}:records:${typeName}:filtered`, () => all.get().filter(predicate))\n }\n\n /** The first record of `typeName` matching `filter` (or the first record, when omitted). */\n record<T extends R[\"typeName\"]>(\n typeName: T,\n filter?: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): Computed<RecordFromTypeName<R, T> | undefined> {\n const records = filter ? this.filteredRecords(typeName, filter) : this.records(typeName)\n return computed(`store:${this.store.id}:record:${typeName}`, () => records.get()[0])\n }\n\n /** Non-reactive filter over the records of `typeName`. */\n exec<T extends R[\"typeName\"]>(\n typeName: T,\n filter: StoreQueryFilter<RecordFromTypeName<R, T>>,\n ): RecordFromTypeName<R, T>[] {\n return unsafe__withoutCapture(() => this.filteredRecords(typeName, filter).get())\n }\n\n /**\n * A live index from the values of one property to the ids of the records\n * holding them.\n *\n * The index is cached per type and property, and it carries diffs: a\n * dependent that already built something from it can ask\n * `index.getDiffSince(epoch)` and patch, instead of walking the whole map\n * again. That is what makes \"every shape whose parentId is this frame\" cheap\n * enough to recompute on every pointer move.\n */\n index<T extends R[\"typeName\"], Property extends keyof RecordFromTypeName<R, T> & string>(\n typeName: T,\n property: Property,\n ): RSIndex<RecordFromTypeName<R, T>, Property> {\n type Rec = RecordFromTypeName<R, T>\n const key = `${typeName}:${property}`\n const cached = this.indexCache.get(key)\n if (cached) return cached as RSIndex<Rec, Property>\n\n const history = this.filterHistory(typeName)\n\n const index = computed<RSIndexMap<Rec, Property>, RSIndexDiff<Rec, Property>>(\n `store:${this.store.id}:index:${key}`,\n (previous, lastComputedEpoch) => {\n if (isUninitialized(previous)) {\n history.get()\n return this.buildIndex<T, Property>(typeName, property)\n }\n\n const diffs = history.getDiffSince(lastComputedEpoch)\n if (diffs === RESET_VALUE) return this.buildIndex<T, Property>(typeName, property)\n\n const nextMap: RSIndexMap<Rec, Property> = new Map(previous)\n const indexDiff: RSIndexDiff<Rec, Property> = new Map()\n let changed = false\n\n const remove = (value: Rec[Property], id: IdOf<Rec>) => {\n const bucket = nextMap.get(value)\n if (!bucket?.has(id)) return\n const next = new Set(bucket)\n next.delete(id)\n if (next.size === 0) nextMap.delete(value)\n else nextMap.set(value, next)\n const entry = indexDiff.get(value) ?? {}\n ;(entry.removed ??= new Set()).add(id)\n indexDiff.set(value, entry)\n changed = true\n }\n const add = (value: Rec[Property], id: IdOf<Rec>) => {\n const bucket = nextMap.get(value)\n if (bucket?.has(id)) return\n nextMap.set(value, new Set(bucket).add(id))\n const entry = indexDiff.get(value) ?? {}\n ;(entry.added ??= new Set()).add(id)\n indexDiff.set(value, entry)\n changed = true\n }\n\n for (const diff of diffs) {\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>] as Rec | undefined\n if (record?.typeName === typeName) add(record[property], record.id as IdOf<Rec>)\n }\n for (const id in diff.updated) {\n const [before, after] = diff.updated[id as IdOf<R>] as [Rec, Rec]\n if (after.typeName !== typeName) continue\n if (Object.is(before[property], after[property])) continue\n remove(before[property], before.id as IdOf<Rec>)\n add(after[property], after.id as IdOf<Rec>)\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>] as Rec | undefined\n if (record?.typeName === typeName) remove(record[property], record.id as IdOf<Rec>)\n }\n }\n\n if (!changed) return previous\n return withDiff(nextMap, indexDiff)\n },\n { historyLength: 128 },\n )\n\n this.indexCache.set(key, index as RSIndex<any, any>)\n return index as RSIndex<Rec, Property>\n }\n\n private buildIndex<T extends R[\"typeName\"], Property extends keyof RecordFromTypeName<R, T> & string>(\n typeName: T,\n property: Property,\n ): RSIndexMap<RecordFromTypeName<R, T>, Property> {\n type Rec = RecordFromTypeName<R, T>\n const map: RSIndexMap<Rec, Property> = new Map()\n for (const record of this.records(typeName).get()) {\n const value = record[property]\n const bucket = map.get(value)\n if (bucket) bucket.add(record.id as IdOf<Rec>)\n else map.set(value, new Set([record.id as IdOf<Rec>]))\n }\n return map\n }\n\n /**\n * The store's history, narrowed to one record type.\n *\n * Its *value* is only a counter — what it is for is the diffs it carries.\n * `filterHistory(\"shape\").getDiffSince(epoch)` is every change to shapes\n * since `epoch`, with changes to other record types dropped, which is how a\n * derived collection stays incremental without re-reading the store.\n */\n filterHistory<T extends R[\"typeName\"]>(typeName: T): Computed<number, RecordsDiff<RecordFromTypeName<R, T>>> {\n const cached = this.historyCache.get(typeName)\n if (cached) return cached as unknown as Computed<number, RecordsDiff<RecordFromTypeName<R, T>>>\n\n const filtered = computed<number, RecordsDiff<R>>(\n `store:${this.store.id}:history:${typeName}`,\n (previous, lastComputedEpoch) => {\n const epoch = this.store.history.get()\n if (isUninitialized(previous)) return epoch\n\n const diffs = this.store.history.getDiffSince(lastComputedEpoch)\n if (diffs === RESET_VALUE) return epoch\n\n const merged = createEmptyRecordsDiff<R>()\n let any = false\n for (const diff of diffs) {\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>]!\n if (record.typeName !== typeName) continue\n merged.added[id as IdOf<R>] = record\n any = true\n }\n for (const id in diff.updated) {\n const pair = diff.updated[id as IdOf<R>]!\n if (pair[1].typeName !== typeName) continue\n merged.updated[id as IdOf<R>] = pair\n any = true\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>]!\n if (record.typeName !== typeName) continue\n merged.removed[id as IdOf<R>] = record\n any = true\n }\n }\n // Nothing of this type changed: keep the old value so dependents are\n // not woken at all.\n if (!any) return previous\n return withDiff(epoch, merged)\n },\n { historyLength: 128 },\n )\n\n this.historyCache.set(typeName, filtered)\n return filtered as unknown as Computed<number, RecordsDiff<RecordFromTypeName<R, T>>>\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* store */\n/* ------------------------------------------------------------------------ */\n\n/**\n * A reactive, transactional collection of records.\n *\n * - one atom per record, so consumers subscribe to exactly what they read\n * - per-type id sets maintained incrementally\n * - writes are batched; listeners receive one squashed diff per outermost operation\n * - records are frozen on write\n */\nexport class Store<R extends UnknownRecord = UnknownRecord, Props = unknown> {\n readonly id: string\n readonly schema: StoreSchema<R, Props>\n readonly props: Props\n readonly scopedTypes: { readonly [S in RecordScope]: ReadonlySet<string> }\n readonly sideEffects = new StoreSideEffects<R>()\n readonly query: StoreQueries<R>\n /**\n * Bumped once per completed operation that changed something.\n *\n * The counter itself carries no information; the diffs do. The atom keeps a\n * bounded history of the squashed {@link RecordsDiff} of each operation, so a\n * derived collection can ask `history.getDiffSince(epoch)` and patch itself\n * instead of rebuilding. `store.query.filterHistory(typeName)` is the same\n * thing narrowed to one record type.\n */\n readonly history: Atom<number, RecordsDiff<R>>\n\n private readonly records = new Map<IdOf<R>, Atom<R | undefined>>()\n private readonly typeIndexes = new Map<string, TypeIndex<R>>()\n private readonly listeners = new Set<Listener<R>>()\n private pendingEntries: HistoryEntry<R>[] = []\n private readonly extractStack: RecordsDiff<R>[] = []\n private depth = 0\n private source: ChangeSource = \"user\"\n private runCallbacks = true\n private inOperationComplete = false\n private disposed = false\n /**\n * The diff of the operation currently being committed, handed to the history\n * atom's `computeDiff` as it is written. The atom only sees two counter\n * values, so the diff has to be staged here for the one write that follows.\n */\n private pendingHistoryDiff: RecordsDiff<R> | null = null\n\n constructor(options: StoreOptions<R, Props>) {\n this.id = options.id ?? uniqueId()\n this.schema = options.schema\n this.props = options.props\n this.history = atom<number, RecordsDiff<R>>(`store:${this.id}:history`, 0, {\n // 128 operations is deep enough that a dependent which rendered a frame\n // ago can still patch, and shallow enough that the buffer costs nothing.\n historyLength: 128,\n computeDiff: () => this.pendingHistoryDiff ?? RESET_VALUE,\n })\n this.query = new StoreQueries(this)\n\n const scoped = { document: new Set<string>(), session: new Set<string>(), presence: new Set<string>() }\n for (const type of Object.values(this.schema.types) as RecordType<R, any>[]) {\n scoped[type.scope].add(type.typeName)\n }\n this.scopedTypes = scoped\n\n if (options.initialData) {\n const records = Object.values(options.initialData) as R[]\n this.atomic(() => this.put(records, \"initialize\"), { runCallbacks: false })\n }\n }\n\n /* ---- reading ---------------------------------------------------------- */\n\n /** @internal */\n getTypeIndex(typeName: string): TypeIndex<R> {\n let index = this.typeIndexes.get(typeName)\n if (!index) {\n index = { live: new Set(), epoch: atom(`store:${this.id}:index:${typeName}`, 0) }\n this.typeIndexes.set(typeName, index)\n }\n return index\n }\n\n /** Get a record (reactive: subscribes to the record, or to its type's membership when absent). */\n get<K extends IdOf<R>>(id: K): RecordFromId<K> | undefined {\n const a = this.records.get(id)\n if (a) return a.get() as RecordFromId<K> | undefined\n // Not present: depend on membership of this id's type so creation is observed.\n this.getTypeIndex(typeNameOfId(id)).epoch.get()\n return undefined\n }\n\n /** Get a record without registering a reactive dependency. */\n unsafeGetWithoutCapture<K extends IdOf<R>>(id: K): RecordFromId<K> | undefined {\n const a = this.records.get(id)\n return a ? (unsafe__withoutCapture(() => a.get()) as RecordFromId<K> | undefined) : undefined\n }\n\n has<K extends IdOf<R>>(id: K): boolean {\n return this.get(id) !== undefined\n }\n\n /** All records (reactive over every record and every type's membership). */\n allRecords(): R[] {\n for (const index of this.typeIndexes.values()) index.epoch.get()\n const result: R[] = []\n for (const a of this.records.values()) {\n const record = a.get()\n if (record !== undefined) result.push(record)\n }\n return result\n }\n\n /** Scope of a record type; unknown types are `document`. */\n getScope(typeName: string): RecordScope {\n return this.schema.getScope(typeName)\n }\n\n /* ---- writing ---------------------------------------------------------- */\n\n /**\n * Insert or update records. Records are validated, passed through `before*`\n * side effects, frozen, and written. `after*` side effects run once every\n * record in the call has been written.\n */\n put(records: readonly R[], phaseOverride?: StoreValidationPhase): void {\n this.atomic(() => {\n const source = this.source\n const callbacks = this.runCallbacks && this.sideEffects.isEnabled()\n const created: R[] = []\n const changed: [R, R][] = []\n\n for (const record of records) {\n const id = record.id\n const existing = this.records.get(id)\n const before = existing?.get()\n\n if (before !== undefined) {\n if (before === record) continue\n let next = this.schema.validateRecord(this, record, phaseOverride ?? \"updateRecord\", before)\n if (callbacks) next = this.sideEffects.handleBeforeChange(before, next, source)\n if (next === before || isRecordShallowEqual(before, next)) continue\n if (next.id !== id) {\n throw new Error(`Cannot change the id of a record (${id} -> ${next.id})`)\n }\n freezeRecord(next)\n if (before.typeName !== next.typeName) {\n this.removeFromIndex(before.typeName, id)\n this.addToIndex(next.typeName, id)\n }\n existing!.set(next)\n this.recordChange(id, before, next)\n changed.push([before, next])\n } else {\n let next = this.schema.validateRecord(this, record, phaseOverride ?? \"createRecord\", undefined)\n if (callbacks) next = this.sideEffects.handleBeforeCreate(next, source)\n if (next.id !== id) {\n throw new Error(`Cannot change the id of a record (${id} -> ${next.id})`)\n }\n freezeRecord(next)\n const a = existing ?? atom<R | undefined>(`store:${this.id}:record:${id}`, undefined)\n a.set(next)\n this.records.set(id, a)\n this.addToIndex(next.typeName, id)\n this.recordChange(id, undefined, next)\n created.push(next)\n }\n }\n\n if (callbacks) {\n for (const record of created) this.sideEffects.handleAfterCreate(record, source)\n for (const [prev, next] of changed) this.sideEffects.handleAfterChange(prev, next, source)\n }\n })\n }\n\n /** Remove records by id. Missing ids are ignored. `beforeDelete` handlers may veto. */\n remove(ids: readonly IdOf<R>[]): void {\n this.atomic(() => {\n const source = this.source\n const callbacks = this.runCallbacks && this.sideEffects.isEnabled()\n const toRemove: R[] = []\n\n for (const id of ids) {\n const a = this.records.get(id)\n if (!a) continue\n const record = a.get()\n if (record === undefined) continue\n if (callbacks && !this.sideEffects.handleBeforeDelete(record, source)) continue\n toRemove.push(record)\n }\n\n const removed: R[] = []\n for (const record of toRemove) {\n const a = this.records.get(record.id)\n if (!a) continue // a handler already removed it\n const current = a.get()\n if (current === undefined) continue\n a.set(undefined)\n this.records.delete(record.id)\n this.removeFromIndex(current.typeName, record.id)\n this.recordChange(record.id, current, undefined)\n removed.push(current)\n }\n\n if (callbacks) {\n for (const record of removed) this.sideEffects.handleAfterDelete(record, source)\n }\n })\n }\n\n /** Remove every record. */\n clear(): void {\n this.remove(Array.from(this.records.keys()))\n }\n\n /**\n * Update one record with a function. No-op when the record does not exist.\n */\n update<K extends IdOf<R>>(id: K, updater: (record: RecordFromId<K>) => RecordFromId<K>): void {\n const current = this.unsafeGetWithoutCapture(id)\n if (current === undefined) return\n this.put([updater(current) as unknown as R])\n }\n\n /* ---- transactions ----------------------------------------------------- */\n\n /**\n * Run `fn` as one operation: side effects' `operationComplete` handlers run\n * once at the end, and listeners get a single squashed history entry.\n */\n atomic<T>(fn: () => T, options?: { source?: ChangeSource | undefined; runCallbacks?: boolean | undefined }): T {\n const prevSource = this.source\n const prevRunCallbacks = this.runCallbacks\n if (options?.source !== undefined) this.source = options.source\n if (options?.runCallbacks !== undefined) this.runCallbacks = options.runCallbacks\n const source = this.source\n const runCallbacks = this.runCallbacks\n this.depth++\n try {\n return transact(() => unsafe__withoutCapture(fn))\n } finally {\n this.depth--\n if (this.depth === 0) {\n try {\n this.completeOperation(source, runCallbacks)\n } finally {\n this.source = prevSource\n this.runCallbacks = prevRunCallbacks\n }\n } else {\n this.source = prevSource\n this.runCallbacks = prevRunCallbacks\n }\n }\n }\n\n /** Changes made inside `fn` are reported to listeners with source `remote`. */\n mergeRemoteChanges(fn: () => void): void {\n this.atomic(fn, { source: \"remote\" })\n }\n\n /** Run `fn` and return the squashed diff of everything it changed. Listeners are still notified. */\n extractingChanges(fn: () => void): RecordsDiff<R> {\n const diff = createEmptyRecordsDiff<R>()\n this.extractStack.push(diff)\n try {\n this.atomic(fn)\n } finally {\n this.extractStack.pop()\n }\n return diff\n }\n\n /**\n * Apply a diff (e.g. from `extractingChanges` or `reverseRecordsDiff`).\n * With `ignoreEphemeralKeys`, ephemeral keys of updated records keep their\n * current store values instead of the diff's.\n */\n applyDiff(\n diff: RecordsDiff<R>,\n options?: { runCallbacks?: boolean | undefined; ignoreEphemeralKeys?: boolean | undefined },\n ): void {\n const runCallbacks = options?.runCallbacks ?? true\n const ignoreEphemeralKeys = options?.ignoreEphemeralKeys ?? false\n this.atomic(\n () => {\n const toPut: R[] = []\n for (const id in diff.added) toPut.push(diff.added[id as IdOf<R>]!)\n for (const id in diff.updated) {\n let [, to] = diff.updated[id as IdOf<R>]!\n if (ignoreEphemeralKeys) {\n const current = this.unsafeGetWithoutCapture(id as IdOf<R>)\n const type = this.schema.getType(to.typeName)\n if (current !== undefined && type && type.ephemeralKeySet.size > 0) {\n const merged: Record<string, unknown> = { ...(to as unknown as Record<string, unknown>) }\n const cur = current as unknown as Record<string, unknown>\n for (const key of type.ephemeralKeySet) {\n if (key in cur) merged[key] = cur[key]\n else delete merged[key]\n }\n to = merged as unknown as R\n }\n }\n toPut.push(to)\n }\n this.put(toPut)\n const toRemove = Object.keys(diff.removed) as IdOf<R>[]\n if (toRemove.length > 0) this.remove(toRemove)\n },\n { runCallbacks },\n )\n }\n\n /* ---- listening -------------------------------------------------------- */\n\n /**\n * Subscribe to history entries. Called after each outermost operation with\n * the squashed changes, filtered by source and record scope.\n */\n listen(onHistory: StoreListener<R>, filters?: Partial<StoreListenerFilters>): () => void {\n const listener: Listener<R> = {\n onHistory,\n filters: { source: filters?.source ?? \"all\", scope: filters?.scope ?? \"all\" },\n }\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n /* ---- persistence ------------------------------------------------------ */\n\n /** Plain-object snapshot of the records in `scope` (default `document`). */\n serialize(scope: RecordScope | \"all\" = \"document\"): SerializedStore<R> {\n const result = {} as SerializedStore<R>\n unsafe__withoutCapture(() => {\n for (const [id, a] of this.records) {\n const record = a.get()\n if (record === undefined) continue\n if (scope === \"all\" || this.getScope(record.typeName) === scope) result[id] = record\n }\n })\n return result\n }\n\n getStoreSnapshot(scope: RecordScope | \"all\" = \"document\"): StoreSnapshot<R> {\n return { store: this.serialize(scope), schema: this.schema.serialize() }\n }\n\n /**\n * Bring a snapshot saved by an older document up to this store's schema,\n * without loading it.\n *\n * Every migration sequence the schema knows is run — including the ones\n * `createStore` derives from the shape and binding utils, so a board saved\n * before a prop existed is backfilled here rather than failing validation on\n * load. The input is not mutated: the result is a new snapshot carrying this\n * schema's serialized version, ready for {@link Store.loadStoreSnapshot} (or\n * for a caller that wants to inspect the migrated records first).\n *\n * A snapshot that cannot be migrated — an unknown schema version, a sequence\n * from a NEWER build than this one, a migration that throws — raises rather\n * than returning half-migrated data, so a caller can fail closed on it.\n */\n migrateSnapshot(snapshot: StoreSnapshot<R>): StoreSnapshot<R> {\n const migrated = this.schema.migrateStoreSnapshot(snapshot)\n if (migrated.type === \"error\") {\n throw new Error(`Failed to migrate snapshot: ${migrated.reason}`)\n }\n return { store: migrated.value, schema: this.schema.serialize() }\n }\n\n /**\n * Replace the store's contents with a snapshot (migrating it first).\n * Existing records in `document` scope and in every scope present in the\n * snapshot are removed unless the snapshot contains them; other scopes are\n * left alone. Side effects do not run; listeners are notified.\n */\n loadStoreSnapshot(snapshot: StoreSnapshot<R>): void {\n const migrated = this.schema.migrateStoreSnapshot(snapshot)\n if (migrated.type === \"error\") {\n throw new Error(`Failed to migrate snapshot: ${migrated.reason}`)\n }\n const incoming = migrated.value\n const records = Object.values(incoming) as R[]\n this.atomic(\n () => {\n const scopes = new Set<RecordScope>([\"document\"])\n for (const record of records) scopes.add(this.getScope(record.typeName))\n const toRemove: IdOf<R>[] = []\n for (const [id, a] of this.records) {\n const record = a.get()\n if (record === undefined) continue\n if (scopes.has(this.getScope(record.typeName)) && !(id in incoming)) toRemove.push(id)\n }\n this.remove(toRemove)\n this.put(records, \"initialize\")\n },\n { runCallbacks: false },\n )\n }\n\n /* ---- derived caches --------------------------------------------------- */\n\n /**\n * A per-record derived value, recomputed only when that record changes.\n * Entries are dropped automatically when records are removed.\n */\n createComputedCache<T, K extends IdOf<R> = IdOf<R>>(\n name: string,\n derive: (record: RecordFromId<K>) => T,\n options?: { isEqual?: ((a: T, b: T) => boolean) | undefined },\n ): { get(id: K): T | undefined } {\n const cache = new WeakMap<Atom<R | undefined>, Computed<T | undefined>>()\n return {\n get: (id: K) => {\n const a = this.records.get(id)\n if (!a) {\n this.getTypeIndex(typeNameOfId(id)).epoch.get()\n return undefined\n }\n let c = cache.get(a)\n if (!c) {\n c = computed(\n `${name}:${id}`,\n () => {\n const record = a.get()\n return record === undefined ? undefined : derive(record as unknown as RecordFromId<K>)\n },\n options?.isEqual\n ? { isEqual: (x, y) => (x === undefined || y === undefined ? x === y : options.isEqual!(x, y)) }\n : undefined,\n )\n cache.set(a, c)\n }\n return c.get()\n },\n }\n }\n\n /* ---- lifecycle -------------------------------------------------------- */\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n dispose(): void {\n this.disposed = true\n this.listeners.clear()\n }\n\n /* ---- internals -------------------------------------------------------- */\n\n private addToIndex(typeName: string, id: IdOf<R>) {\n const index = this.getTypeIndex(typeName)\n if (index.live.has(id)) return\n index.live.add(id)\n index.epoch.update((n) => n + 1)\n }\n\n private removeFromIndex(typeName: string, id: IdOf<R>) {\n const index = this.typeIndexes.get(typeName)\n if (!index || !index.live.delete(id)) return\n index.epoch.update((n) => n + 1)\n }\n\n private recordChange(id: IdOf<R>, before: R | undefined, after: R | undefined) {\n const last = this.pendingEntries[this.pendingEntries.length - 1]\n let entry: HistoryEntry<R>\n if (last && last.source === this.source) {\n entry = last\n } else {\n entry = { changes: createEmptyRecordsDiff<R>(), source: this.source }\n this.pendingEntries.push(entry)\n }\n applyChangeToDiff(entry.changes, id, before, after)\n for (const diff of this.extractStack) applyChangeToDiff(diff, id, before, after)\n }\n\n private completeOperation(source: ChangeSource, runCallbacks: boolean) {\n if (!this.pendingEntries.some((e) => !isRecordsDiffEmpty(e.changes))) {\n this.pendingEntries = []\n return\n }\n if (runCallbacks && this.sideEffects.isEnabled() && !this.inOperationComplete) {\n this.inOperationComplete = true\n const prevSource = this.source\n this.source = source\n this.depth++\n try {\n transact(() => unsafe__withoutCapture(() => this.sideEffects.handleOperationComplete(source)))\n } finally {\n this.depth--\n this.source = prevSource\n this.inOperationComplete = false\n }\n }\n this.pendingHistoryDiff = this.squashPendingEntries()\n try {\n this.history.update((n) => n + 1)\n } finally {\n this.pendingHistoryDiff = null\n }\n this.flushHistory()\n }\n\n /** One diff describing everything the operation just committed changed. */\n private squashPendingEntries(): RecordsDiff<R> {\n const diffs = this.pendingEntries.map((entry) => entry.changes).filter((diff) => !isRecordsDiffEmpty(diff))\n if (diffs.length === 1) return diffs[0]!\n return squashRecordDiffs(diffs)\n }\n\n private flushHistory() {\n const entries = this.pendingEntries\n this.pendingEntries = []\n if (this.listeners.size === 0) return\n for (const entry of entries) {\n if (isRecordsDiffEmpty(entry.changes)) continue\n for (const listener of Array.from(this.listeners)) {\n if (listener.filters.source !== \"all\" && listener.filters.source !== entry.source) continue\n const changes =\n listener.filters.scope === \"all\" ? entry.changes : this.filterDiffByScope(entry.changes, listener.filters.scope)\n if (isRecordsDiffEmpty(changes)) continue\n listener.onHistory({ changes, source: entry.source })\n }\n }\n }\n\n private filterDiffByScope(diff: RecordsDiff<R>, scope: RecordScope): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>]!\n if (this.getScope(record.typeName) === scope) result.added[id as IdOf<R>] = record\n }\n for (const id in diff.updated) {\n const pair = diff.updated[id as IdOf<R>]!\n if (this.getScope(pair[1].typeName) === scope) result.updated[id as IdOf<R>] = pair\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>]!\n if (this.getScope(record.typeName) === scope) result.removed[id as IdOf<R>] = record\n }\n return result\n }\n}\n\nfunction typeNameOfId(id: string): string {\n const colon = id.indexOf(\":\")\n return colon > 0 ? id.slice(0, colon) : parseRecordId(id).typeName\n}\n","import { isRecordLike, type IdOf, type UnknownRecord } from \"./ids\"\nimport type { SerializedSchema, SerializedStore } from \"./migrate\"\n\n/**\n * `.tldr` file envelope. Schema-agnostic: this module does not know or care\n * what record types the file holds.\n */\nexport const TLDR_FILE_FORMAT_VERSION = 1\n\nexport interface TldrFile {\n tldrawFileFormatVersion: number\n schema: SerializedSchema\n records: UnknownRecord[]\n}\n\nexport type TldrFileParseError = \"notATldrFile\" | \"v1File\" | \"invalidRecords\" | \"futureVersion\"\n\nexport type ParseTldrFileResult =\n | { ok: true; schema: SerializedSchema; records: UnknownRecord[] }\n | { ok: false; error: TldrFileParseError; cause?: unknown }\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isSerializedSchema(value: unknown): value is SerializedSchema {\n return isPlainObject(value) && typeof value[\"schemaVersion\"] === \"number\"\n}\n\n/**\n * Parse a `.tldr` file. Accepts either the JSON text or the already-parsed\n * value. Never throws.\n */\nexport function parseTldrFile(json: unknown): ParseTldrFileResult {\n let data: unknown = json\n if (typeof json === \"string\") {\n try {\n data = JSON.parse(json)\n } catch (cause) {\n return { ok: false, error: \"notATldrFile\", cause }\n }\n }\n\n if (!isPlainObject(data)) return { ok: false, error: \"notATldrFile\" }\n\n if (!(\"tldrawFileFormatVersion\" in data)) {\n // The legacy (pre-envelope) format stored a whole document object.\n const legacyDocument = data[\"document\"]\n if (isPlainObject(legacyDocument) && (\"pages\" in legacyDocument || \"version\" in legacyDocument)) {\n return { ok: false, error: \"v1File\" }\n }\n return { ok: false, error: \"notATldrFile\" }\n }\n\n const version = data[\"tldrawFileFormatVersion\"]\n if (typeof version !== \"number\" || !Number.isInteger(version) || version < 1) {\n return { ok: false, error: \"notATldrFile\" }\n }\n if (version > TLDR_FILE_FORMAT_VERSION) return { ok: false, error: \"futureVersion\" }\n\n if (!isSerializedSchema(data[\"schema\"])) return { ok: false, error: \"notATldrFile\" }\n\n const records = data[\"records\"]\n if (!Array.isArray(records)) return { ok: false, error: \"invalidRecords\" }\n const seen = new Set<string>()\n for (const record of records) {\n if (!isRecordLike(record)) return { ok: false, error: \"invalidRecords\" }\n if (seen.has(record.id)) return { ok: false, error: \"invalidRecords\" }\n seen.add(record.id)\n }\n\n return { ok: true, schema: data[\"schema\"], records: records as UnknownRecord[] }\n}\n\n/**\n * JSON.stringify with object keys sorted recursively so that identical data\n * always produces identical text. Arrays keep their order.\n */\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeysDeep)\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(value).sort()) {\n const v = value[key]\n if (v !== undefined) out[key] = sortKeysDeep(v)\n }\n return out\n }\n return value\n}\n\n/**\n * Serialize records and their schema into the `.tldr` envelope\n * (pretty-printed, stable key order). Records are written in the given order.\n */\nexport function serializeTldrFile(schema: SerializedSchema, records: readonly UnknownRecord[]): string {\n const envelope = {\n tldrawFileFormatVersion: TLDR_FILE_FORMAT_VERSION,\n schema: sortKeysDeep(schema),\n records: records.map(sortKeysDeep),\n }\n return JSON.stringify(envelope, null, 2)\n}\n\n/** Convert a parsed file into a `{ store, schema }` snapshot. */\nexport function tldrFileToStoreSnapshot(file: { schema: SerializedSchema; records: readonly UnknownRecord[] }): {\n store: SerializedStore<UnknownRecord>\n schema: SerializedSchema\n} {\n const store = {} as SerializedStore<UnknownRecord>\n for (const record of file.records) store[record.id as IdOf<UnknownRecord>] = record\n return { store, schema: file.schema }\n}\n\n/** Convert a `{ store, schema }` snapshot into `.tldr` text. Records are ordered by id. */\nexport function storeSnapshotToTldrFile(snapshot: {\n store: SerializedStore<UnknownRecord>\n schema: SerializedSchema\n}): string {\n const records = Object.values(snapshot.store).sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return serializeTldrFile(snapshot.schema, records)\n}\n","/**\n * Standalone per-record memos.\n *\n * `Store.createComputedCache` already memoizes a value per record, but it is a\n * method: the cache belongs to one store instance, and the derivation cannot see\n * anything else. A shape util or binding util usually needs the opposite shape —\n * one cache declared once at module scope, derived from a record *and* the editor\n * that owns it, and shared by every store that editor drives.\n *\n * `createComputedCache` is that form. The context is passed in at `get` time and\n * the underlying per-record cache is created lazily, once per context.\n */\nimport type { IdOf, RecordId, UnknownRecord } from \"./ids\"\nimport { Store } from \"./Store\"\n\n/**\n * A context a computed cache can read a store from: a store itself, or anything\n * holding one (an `Editor`).\n */\nexport type ComputedCacheContext = Store<any, any> | { readonly store: Store<any, any> }\n\n/** The handle returned by {@link createComputedCache}. */\nexport interface ComputedCache<Context, R extends UnknownRecord, Result> {\n /** The derived value for `id`, or `undefined` if no such record exists. */\n get(context: Context, id: IdOf<R>): Result | undefined\n}\n\n/** Options for {@link createComputedCache}. */\nexport interface CreateComputedCacheOptions<Result> {\n /**\n * Treat two derived values as the same, so dependents are not woken when the\n * derivation recomputes to an equivalent result.\n */\n isEqual?: ((a: Result, b: Result) => boolean) | undefined\n}\n\nfunction storeOf(context: unknown): Store<any, any> {\n if (context instanceof Store) return context\n const store = (context as { store?: unknown } | null | undefined)?.store\n if (store instanceof Store) return store\n throw new Error(\"createComputedCache: context is neither a Store nor an object holding one\")\n}\n\n/**\n * Declare a per-record memo, keyed by record id, recomputed only when that\n * record changes.\n *\n * ```ts\n * const bindingsCache = createComputedCache(\"connection bindings\", (editor: Editor, shape: TLShape) =>\n * editor.getBindingsFromShape(shape.id, \"connection\"),\n * )\n * bindingsCache.get(editor, shapeId)\n * ```\n *\n * SEMANTICS-ASSUMED: `Context` is unconstrained rather than bound to\n * {@link ComputedCacheContext}. The consumer annotates the derivation's own\n * parameter (`(editor: Editor, shape: TLShape) => …`) and that is what `get`\n * must accept; constraining the type parameter as well would force every caller\n * to prove `Editor` is structurally a store holder at each call site for no\n * added safety. The store is resolved at `get` time instead, and a context that\n * carries none throws immediately rather than silently returning `undefined`.\n */\nexport function createComputedCache<Context, R extends UnknownRecord, Result>(\n name: string,\n derive: (context: Context, record: R) => Result,\n options?: CreateComputedCacheOpts<Result, R>,\n): ComputedCache<Context, R, Result> {\n // Keyed on the context object, so an editor that is torn down takes its\n // caches with it and a second editor does not read the first one's values.\n const perContext = new WeakMap<object, { get(id: RecordId<UnknownRecord>): Result | undefined }>()\n\n return {\n get(context: Context, id: IdOf<R>): Result | undefined {\n const key = context as unknown as object\n if (key === null || (typeof key !== \"object\" && typeof key !== \"function\")) {\n throw new Error(\"createComputedCache: context must be an object\")\n }\n let cache = perContext.get(key)\n if (!cache) {\n // `areRecordsEqual` gates the derivation itself: when the incoming\n // record is equivalent to the one the last result came from, the\n // previous result is handed back untouched.\n const areRecordsEqual = options?.areRecordsEqual\n // Memoized per record id, not per cache: one shared \"last record\" would\n // compare a shape against whichever unrelated shape was derived before it.\n const previous = new Map<string, { record: R; result: Result }>()\n const derivation = areRecordsEqual\n ? (record: UnknownRecord): Result => {\n const next = record as R\n const last = previous.get(record.id)\n if (last && areRecordsEqual(last.record, next)) return last.result\n const result = derive(context, next)\n previous.set(record.id, { record: next, result })\n return result\n }\n : (record: UnknownRecord): Result => derive(context, record as R)\n\n cache = storeOf(context).createComputedCache<Result>(\n name,\n derivation,\n options?.isEqual ? { isEqual: options.isEqual } : undefined,\n )\n perContext.set(key, cache)\n }\n return cache.get(id as unknown as RecordId<UnknownRecord>)\n },\n }\n}\n\n/**\n * Options for {@link createComputedCache}, including the record-level equality\n * that decides when a derivation is worth re-running at all.\n */\nexport type CreateComputedCacheOpts<Result, R extends UnknownRecord = UnknownRecord> =\n CreateComputedCacheOptions<Result> & {\n /**\n * Treat two versions of the *record* as the same, so the derivation is not\n * re-run when only parts it does not read have changed.\n *\n * `isEqual` compares results and can only save the dependents work;\n * `areRecordsEqual` compares inputs and saves the derivation itself. Use it\n * when the derivation is expensive and reads only a couple of fields —\n * geometry from `props`, say, which should not be rebuilt because the shape\n * moved.\n */\n areRecordsEqual?: ((a: R, b: R) => boolean) | undefined\n }\n","/**\n * Two small guards the store leans on: a development-only deep freeze, and an\n * id assertion that narrows.\n */\n\nimport type { IdOf, RecordType, UnknownRecord } from \"./ids\"\n\n/** Whether the bundle is a development build. Frozen at module load. */\nconst IS_DEV =\n typeof process !== \"undefined\" && typeof process.env === \"object\" && process.env[\"NODE_ENV\"] !== \"production\"\n\n/**\n * Deep-freeze `object` in development builds, and hand it straight back in\n * production.\n *\n * Records in the store are shared by reference with every consumer that read\n * them, so mutating one in place skips the whole change pipeline: no diff, no\n * side effects, no listeners, and an undo that silently does nothing. Freezing\n * turns that from a bug someone finds a week later into a `TypeError` on the\n * line that did it. The check is skipped in production because freezing every\n * record on every write is not free.\n *\n * Already-frozen objects are left alone, so re-freezing a record that came out\n * of the store costs one property read.\n */\nexport function devFreeze<T>(object: T): T {\n if (!IS_DEV) return object\n return deepFreeze(object)\n}\n\nfunction deepFreeze<T>(object: T): T {\n if (object === null || typeof object !== \"object\") return object\n if (Object.isFrozen(object)) return object\n Object.freeze(object)\n // `Object.freeze` is shallow; a record's `props` and `meta` are the parts\n // most likely to be mutated in place, and they are one level down.\n for (const value of Object.values(object as Record<string, unknown>)) deepFreeze(value)\n if (Array.isArray(object)) for (const value of object) deepFreeze(value)\n return object\n}\n\n/**\n * Assert that `id` belongs to `type`, narrowing it to that type's id.\n *\n * Record ids are branded strings, so the compiler already stops most mix-ups —\n * but ids that arrive from outside the program (a URL, a saved file, a sync\n * message) are plain strings that someone has to vouch for. This is the place\n * to do that vouching: it throws with the offending id rather than letting a\n * `page:` id be looked up as a shape and quietly returning `undefined`.\n *\n * ```ts\n * assertIdType(idFromUrl, PageRecordType)\n * editor.setCurrentPage(idFromUrl) // now typed as TLPageId\n * ```\n */\nexport function assertIdType<R extends UnknownRecord>(\n id: string | undefined,\n type: RecordType<R, any>,\n): asserts id is IdOf<R> {\n if (!type.isId(id)) {\n throw new Error(`Expected ${type.typeName} id, got ${JSON.stringify(id)}`)\n }\n}\n","/**\n * The synchronous storage contract a store can be backed by.\n *\n * Deliberately synchronous and deliberately tiny: it is the shape an embedded\n * key-value store (a SQLite table, a `Map`, an in-process test double) already\n * has, so a host can hand one over without writing an adapter. Anything\n * asynchronous — a network, IndexedDB — belongs behind a snapshot load and save\n * rather than behind this.\n */\n\nimport type { IdOf, UnknownRecord } from \"./ids\"\nimport type { SerializedSchema } from \"./migrate\"\n\n/**\n * Somewhere records can be read from and written to, one at a time, without\n * awaiting.\n *\n * Implementations must be consistent within a call: `getAll` reflects every\n * `set` and `delete` that has already returned.\n */\nexport interface SynchronousRecordStorage<R extends UnknownRecord = UnknownRecord> {\n /** The record stored under `id`, or `undefined`. */\n get(id: IdOf<R>): R | undefined\n /** Every stored record. Order is not significant. */\n getAll(): R[]\n /** Store `record` under its own id, replacing anything already there. */\n set(record: R): void\n /** Remove the record stored under `id`. Removing an absent id is not an error. */\n delete(id: IdOf<R>): void\n /** Remove every record. */\n clear(): void\n}\n\n/**\n * Record storage that also remembers the schema its records were written\n * against, so they can be migrated when they are read back.\n *\n * Storing records without their schema is the one mistake that cannot be\n * recovered from later: there is no way to tell which migrations have already\n * run, and re-running them corrupts the data.\n */\nexport interface SynchronousStorage<R extends UnknownRecord = UnknownRecord> extends SynchronousRecordStorage<R> {\n /** The schema the stored records were written against, or `undefined` when empty. */\n getSchema(): SerializedSchema | undefined\n /** Record the schema the stored records are written against. */\n setSchema(schema: SerializedSchema): void\n}\n\n/**\n * A {@link SynchronousStorage} backed by a plain `Map`.\n *\n * Useful in tests and as the reference implementation of the contract — the\n * shortest correct answer to \"what does a storage have to do?\".\n */\nexport function createInMemoryStorage<R extends UnknownRecord = UnknownRecord>(): SynchronousStorage<R> {\n const records = new Map<IdOf<R>, R>()\n let schema: SerializedSchema | undefined\n\n return {\n get: (id) => records.get(id),\n getAll: () => [...records.values()],\n set: (record) => {\n records.set(record.id as IdOf<R>, record)\n },\n delete: (id) => {\n records.delete(id)\n },\n clear: () => records.clear(),\n getSchema: () => schema,\n setSchema: (next) => {\n schema = next\n },\n }\n}\n","/**\n * Grapheme cluster iteration.\n *\n * \"One character\" as a person sees it is a grapheme cluster, not a UTF-16 code\n * unit and not a code point: `👩👩👧` is one, `é` written as `e` + a combining\n * accent is one, and a flag emoji is one. Anything that measures, truncates or\n * steps through text a character at a time has to walk clusters or it will cut a\n * family emoji in half.\n */\n\n/** Lazily created, because constructing a `Segmenter` is not free. */\nlet segmenter: Intl.Segmenter | undefined\nlet segmenterChecked = false\n\nfunction getSegmenter(): Intl.Segmenter | undefined {\n if (!segmenterChecked) {\n segmenterChecked = true\n try {\n // `Intl.Segmenter` is missing on older Safari and on some minimal Node builds.\n if (typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\") {\n segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n }\n } catch {\n segmenter = undefined\n }\n }\n return segmenter\n}\n\n/**\n * Iterate the grapheme clusters of `str`.\n *\n * Uses `Intl.Segmenter` where it exists and falls back to code-point iteration\n * otherwise — which keeps surrogate pairs intact (so a plain emoji survives) but\n * cannot join a ZWJ sequence or a combining mark to its base.\n *\n * ```ts\n * [...iterateGraphemes(\"a👍🏽b\")] // [\"a\", \"👍🏽\", \"b\"]\n * ```\n */\nexport function* iterateGraphemes(str: string): Generator<string, void, undefined> {\n const seg = getSegmenter()\n if (seg) {\n for (const { segment } of seg.segment(str)) yield segment\n return\n }\n // SEMANTICS-ASSUMED: the fallback splits on code points. It is the closest\n // approximation available without shipping a Unicode break table, and it is\n // never worse than the `for (const c of str)` a caller would otherwise write.\n for (const codePoint of str) yield codePoint\n}\n\n/** The grapheme clusters of `str`, as an array. */\nexport function getGraphemes(str: string): string[] {\n return [...iterateGraphemes(str)]\n}\n\n/** How many grapheme clusters `str` has — its length as a reader would count it. */\nexport function getGraphemeLength(str: string): number {\n let n = 0\n for (const _ of iterateGraphemes(str)) n++\n return n\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mocanvas/store",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "The mocanvas document model: reactive records, schema, migrations and .tldr file IO.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "Symbio Digital",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"fractional-indexing": "^3.2.0",
|
|
47
47
|
"nanoid": "^5.1.0",
|
|
48
|
-
"@mocanvas/state": "4.0
|
|
48
|
+
"@mocanvas/state": "4.1.0"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "tsup",
|