@weasel-js/gestures 1.13.0-rc.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +9 -7
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -355,7 +355,7 @@ interface PointerDownSpec {
|
|
|
355
355
|
* A hover binding claims nothing. Every live binding that matches the move
|
|
356
356
|
* runs, not only the best one, and the move still reaches the hover-cursor
|
|
357
357
|
* pump. There is no press to own, so bind an immediate action, not an ongoing
|
|
358
|
-
* one. Its params carry `
|
|
358
|
+
* one. Its params carry `world`, `clientX` / `clientY`,
|
|
359
359
|
* `affordance`, `bodyTarget`, `mods`, and `held`.
|
|
360
360
|
*/
|
|
361
361
|
interface HoverSpec {
|
|
@@ -628,6 +628,9 @@ interface WheelEvent extends EventModifiers {
|
|
|
628
628
|
deltaY: number;
|
|
629
629
|
clientX: number;
|
|
630
630
|
clientY: number;
|
|
631
|
+
/** The world point under the pointer, when the source knows it. */
|
|
632
|
+
x?: number;
|
|
633
|
+
y?: number;
|
|
631
634
|
affordance?: unknown;
|
|
632
635
|
bodyTarget?: BodyTarget;
|
|
633
636
|
bodyKind?: BodyKind;
|
|
@@ -1330,10 +1333,9 @@ interface PressFacts extends EventModifiers {
|
|
|
1330
1333
|
target: unknown;
|
|
1331
1334
|
clientX: number;
|
|
1332
1335
|
clientY: number;
|
|
1333
|
-
/**
|
|
1334
|
-
* `pressX`/`pressY` — see `ClickEvent`. */
|
|
1335
|
-
|
|
1336
|
-
worldY: number;
|
|
1336
|
+
/** The press point in the host's world space, forwarded onto the
|
|
1337
|
+
* synthesized click as `pressX`/`pressY` — see `ClickEvent`. */
|
|
1338
|
+
world: Point;
|
|
1337
1339
|
affordance?: unknown;
|
|
1338
1340
|
bodyTarget?: BodyTarget;
|
|
1339
1341
|
bodyKind?: BodyKind;
|
|
@@ -1345,8 +1347,8 @@ interface ReleaseFacts extends EventModifiers {
|
|
|
1345
1347
|
target: unknown;
|
|
1346
1348
|
clientX: number;
|
|
1347
1349
|
clientY: number;
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
+
/** The release point in the host's world space. */
|
|
1351
|
+
world: Point;
|
|
1350
1352
|
}
|
|
1351
1353
|
/** A press released where it went down, as a click, and as the double click
|
|
1352
1354
|
* it is when it follows another closely. Both happen at the release, with the
|
package/dist/index.js
CHANGED
|
@@ -1132,14 +1132,14 @@ function clickEvents(down, up) {
|
|
|
1132
1132
|
ctrlKey: up.ctrlKey,
|
|
1133
1133
|
metaKey: up.metaKey,
|
|
1134
1134
|
shiftKey: up.shiftKey,
|
|
1135
|
-
x: up.
|
|
1136
|
-
y: up.
|
|
1135
|
+
x: up.world.x,
|
|
1136
|
+
y: up.world.y,
|
|
1137
1137
|
clientX: up.clientX,
|
|
1138
1138
|
clientY: up.clientY
|
|
1139
1139
|
};
|
|
1140
1140
|
const named = down.doubleClickBody;
|
|
1141
1141
|
return {
|
|
1142
|
-
click: { kind: "click", ...shared, ...pressedOn(down), pressX: down.
|
|
1142
|
+
click: { kind: "click", ...shared, ...pressedOn(down), pressX: down.world.x, pressY: down.world.y },
|
|
1143
1143
|
doubleclick: {
|
|
1144
1144
|
kind: "doubleclick",
|
|
1145
1145
|
...shared,
|
|
@@ -1156,7 +1156,7 @@ function longPressEvents(down) {
|
|
|
1156
1156
|
shiftKey: down.shiftKey,
|
|
1157
1157
|
...pressedOn(down)
|
|
1158
1158
|
};
|
|
1159
|
-
const at2 = { x: down.
|
|
1159
|
+
const at2 = { x: down.world.x, y: down.world.y, clientX: down.clientX, clientY: down.clientY };
|
|
1160
1160
|
return {
|
|
1161
1161
|
longpress: { kind: "longpress", ...at2, ...shared },
|
|
1162
1162
|
contextmenu: { kind: "contextmenu", ...at2, ...shared }
|
|
@@ -1166,7 +1166,7 @@ function longPressEvents(down) {
|
|
|
1166
1166
|
// src/recognizer/click.ts
|
|
1167
1167
|
function composeClick(down, up, clicks, now, dispatch, observer, limits = { maxMs: DOUBLE_CLICK_MAX_MS, maxPx: DOUBLE_CLICK_MAX_PX }) {
|
|
1168
1168
|
const evs = clickEvents(down, up);
|
|
1169
|
-
const
|
|
1169
|
+
const { world } = up;
|
|
1170
1170
|
dispatch(evs.click);
|
|
1171
1171
|
observer.click?.(world);
|
|
1172
1172
|
const t = now();
|
|
@@ -1271,8 +1271,7 @@ function pressFactsOf(s) {
|
|
|
1271
1271
|
target: s.target,
|
|
1272
1272
|
clientX: s.clientX,
|
|
1273
1273
|
clientY: s.clientY,
|
|
1274
|
-
|
|
1275
|
-
worldY: s.y,
|
|
1274
|
+
world: { x: s.x, y: s.y },
|
|
1276
1275
|
...modifiersOf(s),
|
|
1277
1276
|
...pressedOn(s),
|
|
1278
1277
|
...s.doubleClickBody !== void 0 ? { doubleClickBody: s.doubleClickBody } : {}
|
|
@@ -1405,8 +1404,7 @@ function createPointerRecognizer(opts) {
|
|
|
1405
1404
|
target: s.target,
|
|
1406
1405
|
clientX: s.clientX,
|
|
1407
1406
|
clientY: s.clientY,
|
|
1408
|
-
|
|
1409
|
-
worldY: at2.y,
|
|
1407
|
+
world: { x: at2.x, y: at2.y },
|
|
1410
1408
|
...modifiersOf(s)
|
|
1411
1409
|
};
|
|
1412
1410
|
return composeClick(rec.down, up, clicks, () => happenedAt(s), (ev) => sink.dispatch(ev), observer, doubleClick());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/grammar/gestures.ts","../src/grammar/modifiers.ts","../src/grammar/routeGrammar.ts","../src/grammar/keyRouteGrammar.ts","../src/ui/ingestTypes.ts","../src/ui/matchTarget.ts","../src/ui/match.ts","../src/grammar/specKinds.ts","../src/grammar/routeToSpec.ts","../src/grammar/describeRoute.ts","../src/grammar/modifierComboToParsed.ts","../src/ui/stylus.ts","../src/ui/spec.ts","../src/ui/platform.ts","../src/ui/keySpecsFromMods.ts","../src/ui/keySpecsFromShortcut.ts","../src/ui/keySpecFromCode.ts","../src/ui/formatShortcut.ts","../src/ui/keySugar.ts","../src/ui/fixedSeat.ts","../src/ui/specificity.ts","../src/ui/dragThreshold.ts","../src/recognizer/thresholds.ts","../src/recognizer/pressFacts.ts","../src/recognizer/click.ts","../src/recognizer/longPressHold.ts","../src/recognizer/multiTouch.ts","../src/recognizer/samples.ts","../src/recognizer/pointerRecognizer.ts","../src/ui/controlTarget.ts","../src/ui/heldPointers.ts","../src/ui/keyOwner.ts"],"names":["held","phase","key","mods","MOD_ORDER","at"],"mappings":";AAsEO,IAAM,mBAAA,GAAoD;AAAA,EAC/D,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,IAAA,EAAM;AAAA,EAC1C,EAAE,IAAA,EAAM,aAAA,EAAiB,SAAA,EAAW,IAAA,EAAM;AAAA,EAC1C,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,IAAA,EAAO,KAAK,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAG,OAAA,EAAS,QAAO,EAAE;AAAA,EAClH,EAAE,IAAA,EAAM,QAAA,EAAiB,SAAA,EAAW,IAAA,EAAM;AAAA,EAC1C,EAAE,IAAA,EAAM,MAAA,EAAiB,SAAA,EAAW,IAAA,EAAM;AAAA,EAC1C,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,IAAA,EAAO,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,GAAG,CAAA,EAAG,OAAA,EAAS,KAAI,EAAE;AAAA,EACjH,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,IAAA,EAAO,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,CAAC,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA,EAAG,OAAA,EAAS,KAAI,EAAE;AAAA,EAChH,EAAE,IAAA,EAAM,SAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,EAAE;AAAA,EACtF,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,EAAE;AAAA,EACtF,EAAE,IAAA,EAAM,SAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,EAAE;AAAA,EACtF,EAAE,IAAA,EAAM,aAAA,EAAiB,SAAA,EAAW,IAAA,EAAM;AAAA,EAC1C,EAAE,IAAA,EAAM,WAAA,EAAiB,SAAA,EAAW,IAAA,EAAM;AAAA,EAC1C,EAAE,IAAA,EAAM,YAAA,EAAiB,SAAA,EAAW,OAAO,GAAA,EAAK,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,GAAE,EAAE;AAAA,EAC/F,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,OAAO,GAAA,EAAK,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,GAAE,EAAE;AAAA;AAAA;AAAA;AAAA,EAI/F,EAAE,IAAA,EAAM,MAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,EAAE;AAAA,EACtF,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,IAAA,EAAO,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,EAAE;AAAA,EACtF,EAAE,IAAA,EAAM,OAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,MAAA,EAAO;AACtF;AAEA,IAAM,UAAU,IAAI,GAAA;AAAA,EAClB,mBAAA,CAAoB,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC;AAC5C,CAAA;AAIO,SAAS,qBAAqB,IAAA,EAAsC;AACzE,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC1B,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAClD,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,mBAAmB,IAAA,EAAmC;AACpE,EAAA,OAAO,OAAA,CAAQ,IAAI,IAAI,CAAA;AACzB;;;AC1FO,SAAS,QACX,IAAA,EACY;AACf,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,SAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAI,CAAA;AACxB,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAO,KAAA;AAAA,IACpB,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,IAAK,OAAA;AAAA,IACpB,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAO;AAAA,GACtB,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5B;;;ACoBO,IAAM,oBAAA,uBAAgD,GAAA,CAAI;AAAA,EAC/D,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK;AACrC,CAAC;AAKM,IAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EAC5D,SAAA;AAAA,EAAW;AACb,CAAC;AAOM,IAAM,kBAAkB,CAAC,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAQ,MAAM;AAY9D,IAAM,eAAA,mBAAuC,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC;AAGxF,IAAM,gCAAqC,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAG,CAAC;AAIpE,IAAM,YAAA,GAAoC,IAAI,GAAA,CAAI,eAAe;AA8B1D,SAAS,WAAW,KAAA,EAA4B;AAErD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,KAAK,CAAA,CAAE,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACpC,EAAA,IAAI,WAAW,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,KAAK,CAAA,CAAE,CAAA;AACpF,EAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AACrD,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,YAAA,EAAc,KAAK,CAAA;AACjD,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAG5C,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC7C,EAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,KAAK,CAAA,CAAE,CAAA;AAC9E,EAAA,MAAM,WAAA,GAAc,aAAa,CAAC,CAAA;AAClC,EAAA,IAAI,CAAC,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,WAAW,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9E;AACA,EAAA,IAAA,GAAO,KAAK,KAAA,CAAM,YAAA,CAAa,CAAC,CAAA,CAAE,MAAM,EAAE,SAAA,EAAU;AACpD,EAAA,MAAM,IAAA,GAAO,qBAAqB,WAAW,CAAA;AAG7C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,WAAW,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,KAAK,CAAA,CAAE,CAAA;AACnF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,WAAW,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAE,CAAA;AACpF,IAAA,IAAI,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACrF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,SAAA,EAAY,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IAC7F;AACA,IAAA,GAAA,GAAM,MAAA;AACN,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,SAAA,EAAU;AAAA,EAC5C,CAAA,MAAA,IAAW,KAAK,GAAA,EAAK;AACnB,IAAA,GAAA,GAAM,IAAA,CAAK,IAAI,OAAA,IAAW,GAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,WAAW,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AAC7F,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,SAAA,EAAU;AAC/B,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,KAAK,CAAA,CAAE,CAAA;AACpF,IAAA,MAAA,GAAS,SAAS,CAAC,CAAA;AACnB,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,CAAE,MAAM,EAAE,SAAA,EAAU;AAAA,EAClD,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACzB,IAAA,MAAA,GAAS,GAAA;AAAA,EACX;AAGA,EAAA,MAAM,YAA6B,EAAC;AACpC,EAAA,IAAIA,KAAAA;AACJ,EAAA,OAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,EAAE,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAAA,IAChF;AACA,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8B,EAAE,SAAS,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IAC7E;AACA,IAAA,MAAM,KAAA,GAAQ,EAAA;AACd,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACnB,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,0BAAA,EAA6B,KAAK,CAAA,CAAE,CAAA;AAClG,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,WAAA,KAAgB,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,WAAW,CAAA,WAAA,EAAc,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAC1G,MAAA,IAAIA,KAAAA,KAAS,QAAW,MAAM,IAAI,MAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AACvF,MAAAA,KAAAA,GAAO,KAAA,KAAU,GAAA,GAAM,UAAA,GAAa,UAAA;AACpC,MAAA,IAAA,GAAO,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,CAAE,MAAM,EAAE,SAAA,EAAU;AACjD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,SAAA,CAAU,IAAmB,CAAA,KAAM,MAAA,EAAW;AAChD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1E;AACA,IAAA,SAAA,CAAU,IAAmB,CAAA,GAAI,KAAA,KAAU,GAAA,GAAM,UAAA,GAAa,UAAA;AAC9D,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,CAAE,MAAM,EAAE,SAAA,EAAU;AAAA,EACnD;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,KAAK,MAAA,EAAQ,SAAA,EAAW,GAAIA,KAAAA,GAAO,EAAE,IAAA,EAAAA,KAAAA,EAAK,GAAI,EAAC,EAAG;AAC3F;AAGA,IAAM,IAAA,GAAO,MAAA;AAEb,SAAS,cAAA,CAAe,KAAa,KAAA,EAAqC;AACxE,EAAA,IAAI,QAAQ,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,KAAK,CAAA,CAAE,CAAA;AAC5E,EAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7E,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,KAAK,CAAA,CAAE,CAAA;AACrF,EAAA,OAAO,OAAO,GAAA,CAAI,CAAC,MAAM,cAAA,CAAe,CAAA,EAAG,KAAK,CAAC,CAAA;AACnD;AAEA,IAAM,+BAAoC,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,SAAA,EAAW,GAAG,CAAC,CAAA;AAE7E,SAAS,cAAA,CAAe,KAAa,KAAA,EAA0B;AAG7D,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAMC,MAAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAIA,MAAK,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,8BAAA,EAAiCA,MAAK,SAAS,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,KAAA,EAAOA,MAAAA,EAA4B;AAAA,EAC5D;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,MAAM,CAAA,8BAAA,EAAiC,KAAK,SAAS,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,KAAY,GAAA,EAAK;AACtC,IAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAE,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,CAAA,8BAAA,EAAiC,QAAQ,CAAC,CAAC,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IAC7G;AAAA,EACF;AACA,EAAA,OAAO,EAAE,SAAS,KAAA,EAAmC;AACvD;AAKO,SAAS,gBAAgB,CAAA,EAAsB;AACpD,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA;AAChC,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAChC;AAWO,SAAS,mBAAmB,MAAA,EAAqC;AACtE,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,CAAC,GAAG,MAAM,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAC,CAAA,EAAE,CAAE,CAAA;AAC/D,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG;AACrB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAElB,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG;AACrB,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,IAAI,WAAA,CAAY,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG;AAAE,QAAA,SAAA,GAAY,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACrD;AACA,IAAA,IAAI,YAAY,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,CAAA;AAAG,MAAA;AAAA,IAAU;AAChD,IAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AAEtB,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,SAAA,EAAW,EAAE,GAAG,YAAA,CAAa,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,KAAA,EAAO,UAAA;AAAW,KACjE;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAA,CAAY,GAAgB,CAAA,EAAyB;AAC5D,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,OAAA,EAAS,OAAO,KAAA;AACpC,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,EAAM,OAAO,KAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,GAAA,EAAK,OAAO,KAAA;AAC5B,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,CAAC,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAM,GAAG,OAAO,KAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,EAAE,SAAA,CAAU,KAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,EAAE,SAAA,CAAU,KAAA;AAC3B,EAAA,MAAM,OAAO,MAAA,KAAW,UAAA;AACxB,EAAA,MAAM,OAAO,MAAA,KAAW,UAAA;AACxB,EAAA,IAAI,EAAE,IAAA,KAAS,IAAA,CAAA,EAAO,OAAO,KAAA;AAC7B,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,UAAA,EAAY,OAAO,KAAA;AAE3D,EAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,IAAI,CAAA,KAAM,EAAE,SAAA,CAAU,IAAI,GAAG,OAAO,KAAA;AAAA,EACtD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CACP,GACA,CAAA,EACS;AACT,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,EAAE,CAAC,CAAA,CAAG,OAAA,KAAY,CAAA,CAAE,CAAC,CAAA,CAAG,OAAA,IAAW,CAAA,CAAE,CAAC,EAAG,KAAA,KAAU,CAAA,CAAE,CAAC,CAAA,CAAG,OAAO,OAAO,KAAA;AAAA,EAC7E;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAa,CAAA,EAAqC;AACzD,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,MAAK,GAAI,CAAA;AAEnC,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,YAAoC,CAAC,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAQ,MAAM,CAAA;AAKzE,SAAS,YAAY,CAAA,EAAwB;AAClD,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,CAAA,CAAE,OAAO,CAAA;AAI3C,EAAA,MAAM,QAAA,GAAW,IAAI,CAAA,CAAE,MAAA,CAAO,IAAI,eAAe,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAE5D,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA;AAIlC,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,CAAA,CAAE,GAAA,KAAQ,MAAA,IAAa,EAAE,GAAA,MAAS,IAAA,CAAK,GAAA,CAAI,OAAA,IAAW,GAAA,CAAA,EAAM;AAC1E,IAAA,GAAA,IAAO,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA,CAAA;AAAA,EAClB;AAGA,EAAA,IAAI,KAAK,SAAA,IAAa,CAAA,CAAE,WAAW,MAAA,IAAa,CAAA,CAAE,WAAW,GAAA,EAAK;AAChE,IAAA,GAAA,IAAO,CAAA,IAAA,EAAO,EAAE,MAAM,CAAA,CAAA;AAAA,EACxB;AAGA,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,SAAA,CAAU,IAAI,CAAA;AAC5B,IAAA,IAAI,GAAA,KAAQ,UAAA,EAAY,GAAA,IAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAAA,SAAA,IAC/B,GAAA,KAAQ,UAAA,EAAY,GAAA,IAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY,GAAA,IAAO,KAAK,IAAI,CAAA,CAAA;AAAA,OAAA,IAClC,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY,GAAA,IAAO,KAAK,IAAI,CAAA,CAAA;AAEhD,EAAA,OAAO,GAAA;AACT;;;AC3VA,IAAM,YAAA,GAAe,IAAI,GAAA,CAAY,eAAe,CAAA;AAW7C,SAAS,cAAc,KAAA,EAA+B;AAC3D,EAAA,MAAM,CAACC,IAAAA,EAAK,GAAGC,KAAI,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AACtC,EAAA,IAAI,CAACD,IAAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AACnE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAKC,KAAAA,EAAM;AACpB,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AACxF,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AACjF,IAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,EAAE,GAAA,EAAAD,IAAAA,EAAK,YAAA,EAAcC,KAAAA,EAAsB;AACpD;AAIO,SAAS,eAAe,CAAA,EAA2B;AACxD,EAAA,OAAO,CAAA,CAAE,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,EAAE,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACnF;AAMO,SAAS,eAAe,CAAA,EAA4B;AACzD,EAAA,MAAMA,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,CAAA,CAAE,YAAA,EAAcA,KAAAA,CAAK,CAAC,CAAA,GAAI,UAAA;AAC1C,EAAA,MAAM,OAAgB,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,EAAE,GAAA,EAAI;AAChD,EAAA,IAAI,OAAO,IAAA,CAAKA,KAAI,EAAE,MAAA,GAAS,CAAA,OAAQ,IAAA,GAAOA,KAAAA;AAC9C,EAAA,OAAO,IAAA;AACT;;;ACnDO,SAAS,eAAA,CAAgB,MAAc,IAAA,EAAuB;AACnE,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,KAAA,EAAO,OAAO,IAAA;AACrC,EAAA,IAAI,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,UAAA,CAAW,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxD,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;AAIO,IAAM,YAAA,GAAe;AAKrB,SAAS,gBAAA,CACd,OACA,KAAA,EACS;AACT,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AACzC,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,YAAA,IAAgB,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,eAAA,CAAgB,EAAA,CAAG,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AACtG;;;ACnBA,SAAS,iBAAiB,MAAA,EAAqC;AAC7D,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,MAAA;AAC1D,EAAA,MAAM,IAAK,MAAA,CAA8B,IAAA;AACzC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA;AACrC;AAcA,SAAS,SAAA,CAA4B,GAAW,MAAA,EAAiC;AAC/E,EAAA,OAAO,CAAA,CAAE,WAAW,MAAM,CAAA;AAC5B;AASO,SAAS,gBAAgB,IAAA,EAAyC;AACvE,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,GAC3C,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GACzC,IAAA;AAAA,EACN;AACA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,eAAA,IAAmB,SAAS,iBAAA,EAAmB;AAC9E,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACpC;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,EAAE,MAAM,YAAA,EAAc,IAAA,EAAM,KAAK,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA,EAAE;AAAA,EACtE;AAGA,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACtC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,kBAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,WAAA,CAAY,MAAM,CAAA,GAAI,IAAA;AAAA,MAC7D;AAAA,KACF;AAAA,EACF;AAGA,EAAA,OAAO,IAAA;AACT;AA0BO,SAAS,WAAA,CACd,MAAA,EACA,UAAA,EACA,UAAA,EACA,QAAA,EACS;AACT,EAAA,IAAI,UAAA,KAAe,QAAW,OAAO,IAAA;AACrC,EAAA,MAAM,IAAA,GAAO,gBAAgB,UAAU,CAAA;AACvC,EAAA,IAAI,IAAA,KAAS,MAAM,OAAO,KAAA;AAE1B,EAAA,QAAQ,KAAK,IAAA;AAAM;AAAA,IAEjB,KAAK,WAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,UAAU,CAAA;AAAA;AAAA;AAAA,IAIvC,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,IAAA,CAAK,IAAA;AAAA,IAEzD,KAAK,YAAA;AACH,MAAA,OAAO,gBAAA,CAAiB,MAAM,CAAA,KAAM,IAAA,CAAK,IAAA;AAAA,IAE3C,KAAK,MAAA;AACH,MAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,CAAK,MAAM,OAAO,KAAA;AAC7D,MAAA,OAAO,IAAA,CAAK,eAAA,GAAkB,UAAA,KAAe,eAAA,GAAkB,IAAA;AAAA,IAEjE,SAAS;AAIP,MAAA,OAAO,KAAA;AAAA,IACT;AAAA;AAEJ;;;ACzGA,SAAS,iBAAiB,KAAA,EAAyD;AACjF,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,UAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,YAAY,OAAO,UAAA;AACjC,EAAA,OAAO,WAAA;AACT;AAYO,SAAS,cAAA,CACd,CAAA,EACAA,KAAAA,EACA,KAAA,EACS;AAET,EAAA,IAAI,GAAA,GAAsB,WAAA;AAC1B,EAAA,IAAI,IAAA,GAAuB,WAAA;AAC3B,EAAA,IAAI,IAAA,GAAuB,WAAA;AAC3B,EAAA,IAAI,KAAA,GAAwB,WAAA;AAE5B,EAAA,IAAIA,KAAAA,EAAM;AACR,IAAA,GAAA,GAAM,gBAAA,CAAiBA,MAAK,GAAG,CAAA;AAC/B,IAAA,KAAA,GAAQ,gBAAA,CAAiBA,MAAK,KAAK,CAAA;AAInC,IAAA,IAAIA,KAAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiBA,KAAAA,CAAK,GAAG,CAAA;AACxC,MAAA,IAAI,OAAO,IAAA,GAAO,MAAA;AAAA,WACb,IAAA,GAAO,MAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,gBAAA,CAAiBA,MAAK,IAAI,CAAA;AACjC,MAAA,IAAA,GAAO,gBAAA,CAAiBA,MAAK,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OACE,SAAS,GAAA,EAAO,CAAA,CAAE,MAAM,CAAA,IACxB,QAAA,CAAS,MAAO,CAAA,CAAE,OAAO,CAAA,IACzB,QAAA,CAAS,MAAO,CAAA,CAAE,OAAO,KACzB,QAAA,CAAS,KAAA,EAAO,EAAE,QAAQ,CAAA;AAE9B;AAEA,SAAS,QAAA,CAAS,KAAqBH,KAAAA,EAAwB;AAC7D,EAAA,IAAI,GAAA,KAAQ,YAAY,OAAOA,KAAAA;AAC/B,EAAA,IAAI,GAAA,KAAQ,WAAA,EAAa,OAAO,CAACA,KAAAA;AACjC,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,QAAA,CAAS,UAAkB,OAAA,EAAqC;AAC9E,EAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,WAAA,OAAkB,KAAK,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,OAAA,CAAQ,aAAY,KAAM,KAAA;AACnC;AAIA,SAAS,cAAA,CACP,GACA,IAAA,EACS;AACT,EAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAa,CAAA,CAAE,IAAA,KAAS,UAAa,CAAC,IAAA,CAAK,IAAI,CAAA,CAAE,MAAK,CAAE,QAAA,CAAS,CAAA,CAAE,IAAI,GAAG,OAAO,IAAA;AACnG,EAAA,OAAO,QAAA,CAAS,CAAA,CAAE,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA;AACjC;AAcA,SAAS,eAAe,IAAA,EAAuC;AAC7D,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,CAAC,EAAE,OAAA,EAAS,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,UAAA,CAAW,MAA6B,GAAA,EAA4B;AAClF,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,cAAA,CAAe,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,IAAA;AAAA,EACrC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,GAAc,GAAA,EAA4B;AAChE,EAAA,IAAI,CAAA,CAAE,YAAY,GAAA,EAAK;AAGrB,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,GAAA,EAAK,OAAO,IAAA;AAC5B,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,eAAA,CAAgB,IAAA,GAAO,CAAA;AAC9C,IAAA,OAAO,CAAA,CAAE,KAAA,KAAU,SAAA,GAAY,UAAA,GAAa,CAAC,UAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,KAAK,CAAA,CAAE,OAAA,KAAY,GAAA,GAAM,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA;AACnD,EAAA,IAAI,EAAA,IAAM,MAAM,OAAO,KAAA;AACvB,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,GAAA,EAAK,OAAO,IAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA;AAC5C,EAAA,OAAO,CAAA,CAAE,KAAA,KAAU,SAAA,GAAY,SAAA,GAAY,CAAC,SAAA;AAC9C;AASA,SAAS,UAAA,CACP,CAAA,EACA,IAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe,OAAO,KAAA;AACrC,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAIxB,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,OAAA,EAAS,OAAO,KAAA;AAAA,EAClC,CAAA,MAAA,IAAW,CAAA,CAAE,KAAA,KAAU,OAAA,EAAS;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AAGjD,EAAA,OAAO,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,QAAQ,CAAA;AACxE;AAQO,SAAS,SAAA,CACd,CAAA,EACA,IAAA,EACA,KAAA,EACA,QAAA,EACS;AAGT,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,MAAM,MAAoB,QAAA,IAAY,EAAE,WAAA,EAAa,IAAA,EAAM,iBAAiB,aAAA,EAAc;AAC1F,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,GAAG,GAAG,OAAO,KAAA;AAAA,EAC3C;AAEA,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO,OAAO,KAAA;AAC7B,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,IAAI,GAAG,OAAO,KAAA;AACrC,MAAA,OAAO,cAAA,CAAe,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY,OAAO,KAAA;AAClC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAQ,OAAO,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,IAAI,GAAG,OAAO,KAAA;AACrC,MAAA,OAAO,cAAA,CAAe,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,IAEA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AACjD,MAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,MAAA,IAAI,cAAc,IAAA,IAAQ,EAAE,CAAA,CAAE,MAAA,GAAS,IAAI,OAAO,KAAA;AAClD,MAAA,IAAI,cAAc,MAAA,IAAU,EAAE,CAAA,CAAE,MAAA,GAAS,IAAI,OAAO,KAAA;AACpD,MAAA,OAAO,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,QAAQ,CAAA;AAAA,IACxE;AAAA,IAEA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AACjD,MAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,MAAA,IAAI,cAAc,KAAA,IAAS,EAAE,CAAA,CAAE,KAAA,GAAQ,IAAI,OAAO,KAAA;AAClD,MAAA,IAAI,cAAc,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAA,GAAQ,IAAI,OAAO,KAAA;AACjD,MAAA,OAAO,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,QAAQ,CAAA;AAAA,IACxE;AAAA,IAEA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AAIjD,MAAA,OAAO,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,QAAQ,CAAA;AAAA,IACxE;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe,OAAO,KAAA;AACrC,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AACjD,MAAA,OAAO,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,QAAQ,CAAA;AAAA,IACxE;AAAA;AAAA;AAAA,IAIA,KAAK,aAAA;AAAA,IACL,KAAK,WAAA,EAAa;AAChB,MAAA,IAAI,EAAE,IAAA,KAAS,aAAA,IAAiB,CAAA,CAAE,IAAA,KAAS,aAAa,OAAO,KAAA;AAC/D,MAAA,IAAI,EAAE,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,WAAA,IAAe,OAAO,KAAA;AAC/C,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AACjD,MAAA,OAAO,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,QAAQ,CAAA;AAAA,IACxE;AAAA,IAEA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAC/B,MAAA,IAAI,CAAC,cAAA,CAAe,CAAA,EAAG,KAAK,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AACjD,MAAA,IAAI,CAAC,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,IAAA,KAAS,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,MAAA,GAAY,IAAA,CAAK,IAAA,KAAS,IAAA,CAAA,EAAO,OAAO,KAAA;AACvF,MAAA,MAAM,EAAA,GAAK,CAAC,CAAA,CAAE,GAAA,IAAO,WAAA,CAAY,CAAA,CAAE,UAAA,EAAY,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,QAAQ,CAAA;AACpF,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,EAAS,OAAO,EAAA;AACpC,MAAA,OAAO,CAAC,EAAA,IAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAa,YAAY,CAAA,CAAE,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,IACtH;AAAA,IAEA,KAAK,MAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,OAAO,UAAA,CAAW,CAAA,EAAG,IAAA,EAAM,KAAK,CAAA;AAAA,IAElC,KAAK,YAAA,EAAc;AACjB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,YAAA,EAAc,OAAO,KAAA;AACpC,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AACvC,MAAA,OAAO,cAAA,CAAe,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,IAEA,KAAK,eAAA,EAAiB;AACpB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,eAAA,EAAiB,OAAO,KAAA;AACvC,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AACvC,MAAA,OAAO,cAAA,CAAe,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,IAEA,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,CAAA,EAAG,IAAA,EAAM,KAAK,CAAA;AAAA,IAEpC,SAAS;AAIP,MAAA,OAAO,KAAA;AAAA,IACT;AAAA;AAEJ;AAOA,SAAS,YAAA,CAAa,CAAA,EAAe,IAAA,EAAwC,KAAA,EAAyB;AACpG,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AACjC,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,MAAM,MAAA,GAAS,QAAA,IAAY,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,MAAA;AAChD,IAAA,IAAI,CAAA,CAAE,UAAU,OAAA,IAAY,CAAA,CAAE,UAAU,MAAA,IAAU,MAAA,KAAW,QAAY,OAAO,KAAA;AAChF,IAAA,IAAI,CAAC,gBAAA,CAAiB,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9D,IAAA,IAAI,CAAC,WAAA,CAAY,CAAA,CAAE,UAAA,EAAY,MAAA,EAAQ,EAAE,UAAA,EAAY,CAAA,CAAE,QAAQ,CAAA,EAAG,OAAO,KAAA;AAAA,EAC3E,WAAW,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,OAAA,EAAS;AAClD,IAAA,IAAI,CAAC,gBAAA,CAAiB,CAAA,CAAE,OAAO,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AAAA,EACrD;AACA,EAAA,OAAO,cAAA,CAAe,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC3C;AAEA,IAAM,aAAA,uBAAyC,GAAA,EAAI;;;ACxSnD,IAAM,oBAAA,GAAkE;AAAA,EACtE,GAAA,EAAK,SAAA;AAAA,EACL,UAAA,EAAY,SAAA;AAAA,EACZ,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa,QAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,uBAAuB,IAAI,GAAA;AAAA,EAC9B,MAAA,CAAO,QAAQ,oBAAoB,CAAA,CACjC,OAAO,CAAC,CAAA,KAAoC,EAAE,CAAC,CAAA,KAAM,MAAS,CAAA,CAC9D,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,OAAO,CAAA,KAAM,CAAC,OAAA,EAAS,IAAI,CAAC;AAC7C,CAAA;AAIO,SAAS,wBAAwB,IAAA,EAAyC;AAC/E,EAAA,OAAO,qBAAqB,IAAI,CAAA;AAClC;AAIO,SAAS,wBAAwB,OAAA,EAA4C;AAClF,EAAA,OAAO,oBAAA,CAAqB,IAAI,OAAO,CAAA;AACzC;;;ACvBO,SAAS,YAAY,MAAA,EAAkC;AAC5D,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAuB;AACnC,IAAA,MAAM,IAAI,MAAM,CAAA,aAAA,EAAgB,GAAG,KAAK,WAAA,CAAY,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/D,CAAA;AACA,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,KAAQ,GAAA,GAAM,SAAY,MAAA,CAAO,GAAA;AAEpD,EAAA,MAAMG,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC1D,IAAAA,KAAAA,CAAK,IAAqB,CAAA,GAAI,GAAA,KAAQ,aAAa,IAAA,GAAO,UAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,SAAgD,EAAC;AACvD,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,KAC5C,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAG,YAAY,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,CAAC,EAAG,KAAA,KAAU,GAAA;AACtE,EAAA,IAAI,CAAC,eAAA,EAAiB,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,CAAwB,IAAA,KAAe;AACtD,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAGA,KAAAA,EAAM,GAAG,KAAA,EAAM;AACnC,IAAA,MAAM,GAAA,GAAM,EAAE,GAAG,IAAA,EAAM,GAAG,MAAA,EAAO;AACjC,IAAA,IAAI,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,GAAS,CAAA,MAAO,IAAA,GAAO,MAAA;AAC/C,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,WAAW,GAAA,EAAK;AACxD,IAAA,IAAI,eAAA,CAAgB,MAAA,CAAO,MAAoB,CAAA,KAAM,IAAA,EAAM;AACzD,MAAA,IAAA,CAAK,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAChD;AACA,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,EAClB;AACA,EAAA,MAAM,IAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAO;AAE/C,EAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,MAAA,CAAO,OAAO,CAAA;AACnD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACzD,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS;AAAA,QACd,IAAA;AAAA,QACA,GAAI,GAAA,KAAQ,OAAA,GAAU,EAAE,MAAA,EAAQ,OAAA,KAAqB,EAAC;AAAA,QACtD,GAAI,MAAA,CAAO,IAAA,GAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,KAAS,UAAA,GAAc,IAAA,GAAkB,UAAA,EAAqB,GAAI,EAAC;AAAA,QACpG,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,OAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,IAAA,EAAM,GAAG,GAAG,CAAA;AAAA,IAChC,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,IAAA,EAAM,GAAI,GAAA,GAAM,EAAE,SAAA,EAAW,GAAA,EAAqB,GAAI,EAAC,EAAI,GAAG,GAAG,CAAA;AAAA,IACrF,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,IAAA,EAAM,GAAI,GAAA,GAAM,EAAE,SAAA,EAAW,GAAA,EAAoB,GAAI,EAAC,EAAI,GAAG,GAAG,CAAA;AAAA,IACpF,KAAK,KAAA;AAAA,IACL,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,IAAA,CAAK,iCAAiC,CAAA;AACpE,MAAA,MAAM,EAAE,GAAA,EAAAD,IAAAA,EAAK,YAAA,EAAa,GAAI,cAAc,GAAG,CAAA;AAC/C,MAAA,MAAM,WAAoB,EAAC;AAC3B,MAAA,KAAA,MAAW,CAAA,IAAK,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA,GAAI,UAAA;AAC5C,MAAA,OAAO,QAAA,CAAS,EAAE,IAAA,EAAM,GAAA,EAAAA,MAAK,GAAI,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,IAAK,CAAA;AAAA,IACvF;AAAA,IACA,KAAK,YAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,IAAI,QAAQ,MAAA,EAAW,OAAO,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAC1E,MAAA,OAAO,SAAS,EAAE,IAAA,EAAM,SAAS,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,IAChD,KAAK,OAAA;AACH,MAAA,OAAO,SAAS,EAAE,IAAA,EAAM,GAAI,GAAA,GAAM,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,GAAG,GAAE,GAAI,EAAC,EAAI,GAAG,GAAG,CAAA;AAAA,IAC3E,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,IAAA,EAAM,GAAI,MAAM,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAE,GAAI,IAAK,CAAA;AAAA;AAEzE;;;ACzFA,IAAM,SAAA,GAAyC;AAAA,EAC7C,GAAA,EAAK,KAAA;AAAA,EAAO,KAAA,EAAO,OAAA;AAAA,EAAS,GAAA,EAAK,KAAA;AAAA,EAAO,IAAA,EAAM,MAAA;AAAA,EAAQ,IAAA,EAAM;AAC9D,CAAA;AACA,IAAME,aAAoC,CAAC,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAQ,MAAM,CAAA;AAIzE,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM,6DAAA;AAAA,EACN,aAAA,EAAe;AACjB;AAKO,IAAM,uBAAA,GAA0B;AAAA,EACrC,MAAA,EAAQ,iOAAA;AAAA,EACR,OAAA,EAAS,wKAAA;AAAA,EACT,GAAA,EAAK,iOAAA;AAAA,EACL,MAAA,EAAQ,iKAAA;AAAA,EACR,SAAA,EAAW;AACb;AAcA,SAAS,KAAK,KAAA,EAA6C;AACzD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAY,WAAA,CAAY,KAAK,CAAA,EAAE;AAC/D;AAEA,SAAS,QAAQ,KAAA,EAAkC;AACjD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA,EAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AACzE;AAEA,SAAS,mBAAmBD,KAAAA,EAAmE;AAC7F,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,QAAQC,UAAAA,EAAW;AAC5B,IAAA,MAAM,GAAA,GAAMD,MAAK,IAAI,CAAA;AACrB,IAAA,IAAI,QAAQ,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,SAAA,IAC5C,QAAQ,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,EAAE,UAAU,QAAA,EAAS;AAC9B;AAGA,SAAS,WAAW,MAAA,EAAoC;AACtD,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,GAAA,EAAK,OAAO,iBAAA;AACnD,EAAA,OAAO,MAAA,KAAW,OAAA,GAAU,kBAAA,GAAqB,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA;AAClE;AAEA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,KAAA,EAAM,EAAsC;AAC7E,EAAA,MAAM,OAAA,GAAU,YAAY,GAAA,GAAM,UAAA,GAC9B,YAAY,GAAA,GAAM,UAAA,GAClB,OAAO,OAAO,CAAA,KAAA,CAAA;AAClB,EAAA,IAAI,KAAA,KAAU,WAAW,OAAO,CAAC,GAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC/D,EAAA,IAAI,KAAA,KAAU,WAAW,OAAO,CAAC,GAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,IAAA,CAAK,aAAa,CAAC,CAAA;AACtE,EAAA,OAAO,CAAC,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAkB,CAAA;AACtC;AAEA,SAAS,YAAY,MAAA,EAAsD;AACzE,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,SAAU,cAAA,CAAe,MAAA,CAAO,CAAC,CAAC,CAAA;AACxD,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,IAAA,IAAI,CAAA,GAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1B,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,EAC/B,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CAAa,QAA4B,SAAA,EAA4B;AAC5E,EAAA,IAAI,CAAC,SAAA,IAAa,MAAA,KAAW,MAAA,EAAW,OAAO,EAAA;AAC/C,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,WAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,kBAAA;AAC/B,EAAA,OAAO,SAAS,MAAM,CAAA,CAAA;AACxB;AAEA,SAAS,UAAU,MAAA,EAAoC;AACrD,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,GAAA,EAAK,OAAO,iBAAA;AACnD,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,mBAAA;AAC/B,EAAA,OAAO,UAAU,MAAM,CAAA,CAAA;AACzB;AAIA,SAAS,YAAY,MAAA,EAAyC;AAC5D,EAAA,OAAO,MAAA,CAAO,GAAA,KAAQ,GAAA,GAAM,MAAA,GAAY,MAAA,CAAO,GAAA;AACjD;AAIA,SAAS,QAAA,CAAS,UAA6B,IAAA,EAAsB;AACnE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,YAAY,IAAI,CAAA,CAAA;AAClD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,YAAY,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjE,EAAA,OAAO,CAAA,eAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAC,QAAQ,IAAI,CAAA,CAAA;AACxD;AAEA,SAAS,YAAA,CAAa,QAAqB,QAAA,EAAqC;AAC9E,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,MAAA,CAAO,OAAsB,CAAA;AAC/D,EAAA,MAAM,GAAA,GAAM,YAAY,MAAM,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAS,CAAA;AAEzD,EAAA,QAAQ,OAAO,OAAA;AAAS,IACtB,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,KAAY,SAAA,GAAY,YACxC,MAAA,CAAO,OAAA,KAAY,UAAU,UAAA,GAC7B,OAAA;AACJ,MAAA,MAAMD,OAAM,GAAA,IAAO,SAAA;AACnB,MAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GACrB,CAAA,eAAA,EAAkB,QAAQ,QAAQ,CAAC,CAAA,KAAA,EAAQ,IAAI,IAAIA,IAAG,CAAA,CAAA,GACtD,CAAA,SAAA,EAAY,IAAI,IAAIA,IAAG,CAAA,CAAA;AAAA,IAC7B;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,YAAY,GAAA,KAAQ,IAAA,GAAO,KAAA,GAC7B,GAAA,KAAQ,SAAS,OAAA,GACjB,EAAA;AACJ,MAAA,OAAO,SAAS,QAAA,EAAU,CAAA,OAAA,EAAU,SAAS,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,YAAY,GAAA,KAAQ,IAAA,GAAO,KAAA,GAC7B,GAAA,KAAQ,QAAQ,MAAA,GAChB,EAAA;AACJ,MAAA,OAAO,SAAS,QAAA,EAAU,CAAA,OAAA,EAAU,SAAS,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,IACA,KAAK,YAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,aAAA,EAAgB,GAAA,IAAO,UAAU,CAAA,QAAA,CAAU,CAAA;AAAA,IACvE,KAAK,eAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,UAAA,EAAa,GAAA,IAAO,UAAU,CAAA,QAAA,CAAU,CAAA;AAAA,IACpE,KAAK,aAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7D,KAAK,WAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,CAAA;AAAA,IACnD,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7C,KAAK,aAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9C,KAAK,OAAA,EAAS;AACZ,MAAA,MAAMF,KAAAA,GAAO,OAAO,IAAA,KAAS,UAAA,GAAa,wBACtC,MAAA,CAAO,IAAA,KAAS,aAAa,kCAAA,GAC7B,EAAA;AACJ,MAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,GAAU,CAAA,CAAA,EAAI,WAAW,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,GAAK,MAAA;AAClE,MAAA,OAAO,SAAS,QAAA,EAAU,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAGA,KAAI,CAAA,CAAE,CAAA;AAAA,IAC9D;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,IAClD,KAAK,MAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,MAAA,EAAS,GAAA,IAAO,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC3E,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,QAAA,EAAW,GAAA,IAAO,UAAU,IAAI,SAAA,CAAU,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IACtF,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,QAAA,EAAU,CAAA,OAAA,EAAU,GAAA,IAAO,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA;AAEhE;AAeO,SAAS,kBAAA,CACd,MAAA,EACA,IAAA,GAA6B,EAAC,EACG;AACjC,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAM,MAAA,GAAS,MAAK,GAAI,IAAA;AAC7C,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,kBAAA,CAAmB,OAAO,SAAS,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,SAAS,MAAA,GAAS,CAAA,GAChC,KAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,UAAA,CAAA,GACtB,EAAA;AAEJ,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,MAAM,IAAA,GAAO,cAAc,MAAM,CAAA,QAAA,CAAA;AACjC,EAAA,KAAA,CAAM,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AACxC,EAAA,IAAI,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,EAAA,OAAO,qBAAqB,KAAK,CAAA;AACnC;AAMO,SAAS,aAAA,CAAc,MAAA,EAAqB,IAAA,GAA6B,EAAC,EAAW;AAC1F,EAAA,OAAO,kBAAA,CAAmB,MAAA,EAAQ,IAAI,CAAA,CACnC,IAAI,CAAC,CAAA,KAAO,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,CAAA,CAAE,KAAM,CAAA,CAChD,KAAK,EAAE,CAAA;AACZ;AAEA,SAAS,qBAAqB,KAAA,EAAgE;AAC5F,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,IAAA,KAAS,QAAA,EAAU,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA,GAAO,CAAA;AAAA,SAC/E,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,GAAA;AACT;;;ACzNO,SAAS,sBAAsBE,IAAAA,EAAqC;AACzE,EAAA,IAAIA,IAAAA,KAAQ,SAAA,EAAW,OAAO,EAAC;AAC/B,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQA,IAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACjC,IAAA,GAAA,CAAI,IAAmB,CAAA,GAAI,UAAA;AAAA,EAC7B;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,mBAAmBC,KAAAA,EAA+B;AAChE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQA,KAAI,CAAA,CACvB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,EAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACrC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA,CACrC,KAAK,GAAG,CAAA;AACb;;;AClBO,SAAS,SAAS,GAAA,EAA+C;AACtE,EAAA,OAAO;AAAA,IACL,GAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,EAAU,GAAA,CAAI,QAAA,EAAS,GAAI,EAAC;AAAA,IACrE,GAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM,GAAI,EAAC;AAAA,IAC5D,GAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM,GAAI;AAAC,GAC9D;AACF;;;AC2BO,SAAS,aACd,EAAA,EAC6C;AAC7C,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACZ,CAAC,GAAA,EAAc,UAAA,KAAiC,EAAA,CAAG,KAAK,UAAU,CAAA;AAAA,IAClE,EAAE,iBAAiB,IAAA;AAAc,GACnC;AACF;AAIO,SAAS,cACd,EAAA,EAC8C;AAC9C,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACZ,CAAC,IAAA,EAAe,UAAA,KAAiC,EAAA,CAAG,UAAU,CAAA;AAAA,IAC9D,EAAE,iBAAiB,KAAA;AAAe,GACpC;AACF;;;AChDO,SAAS,eAAA,GAA2B;AACzC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,WAAW,OAAO,KAAA;AAC3D,EAAA,MAAM,GAAA,GAAM,SAAA;AAEZ,EAAA,MAAM,MAAM,GAAA,CAAI,aAAA,EAAe,YAAY,GAAA,CAAI,QAAA,IAAY,IAAI,SAAA,IAAa,EAAA;AAC5E,EAAA,OAAO,uBAAA,CAAwB,KAAK,GAAG,CAAA;AACzC;;;AC0CA,IAAM,eAAA,GAAqF;AAAA,EACzF,GAAA,EAAK;AAAA,IACH,OAAS,EAAE,IAAA,EAAM,UAAQ,MAAA,EAAQ,QAAA,EAAK,MAAM,KAAA,EAAM;AAAA,IAClD,SAAS,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,QAAA,EAAK,MAAM,MAAA,EAAO;AAAA,IACnD,OAAS,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,QAAA,EAAK,MAAM,MAAA;AAAO,GACrD;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAS,EAAE,IAAA,EAAM,UAAK,MAAA,EAAQ,QAAA,EAAK,MAAM,OAAA,EAAQ;AAAA,IACjD,SAAS,EAAE,IAAA,EAAM,UAAK,MAAA,EAAQ,QAAA,EAAK,MAAM,OAAA,EAAQ;AAAA,IACjD,OAAS,EAAE,IAAA,EAAM,UAAK,MAAA,EAAQ,QAAA,EAAK,MAAM,OAAA;AAAQ,GACnD;AAAA;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,OAAS,EAAE,IAAA,EAAM,UAAO,MAAA,EAAQ,QAAA,EAAK,MAAM,QAAA,EAAS;AAAA,IACpD,SAAS,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,QAAA,EAAK,MAAM,KAAA,EAAM;AAAA,IACjD,OAAS,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,QAAA,EAAK,MAAM,KAAA;AAAM,GACnD;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAS,EAAE,IAAA,EAAM,UAAQ,MAAA,EAAQ,QAAA,EAAK,MAAM,SAAA,EAAU;AAAA,IACtD,SAAS,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,QAAA,EAAK,MAAM,MAAA,EAAO;AAAA,IACnD,OAAS,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,QAAA,EAAK,MAAM,MAAA;AAAO,GACrD;AAAA;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,OAAS,EAAE,IAAA,EAAM,UAAK,MAAA,EAAQ,QAAA,EAAK,MAAM,KAAA,EAAM;AAAA,IAC/C,SAAS,EAAE,IAAA,EAAM,UAAK,MAAA,EAAQ,QAAA,EAAK,MAAM,KAAA,EAAM;AAAA,IAC/C,OAAS,EAAE,IAAA,EAAM,UAAK,MAAA,EAAQ,QAAA,EAAK,MAAM,OAAA;AAAQ;AAErD,CAAA;AAGO,IAAM,kBAAuC,IAAI,GAAA;AAAA,EACtD,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,UAAA,KACtC,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,QAAA,KAAa,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC;AAAA;AAE3E;AAOO,SAAS,cAAA,GAA2B;AACzC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,WAAW,OAAO,OAAA;AAC3D,EAAA,IAAI,eAAA,IAAmB,OAAO,OAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,MAAM,MAAM,GAAA,CAAI,aAAA,EAAe,YAAY,GAAA,CAAI,QAAA,IAAY,IAAI,SAAA,IAAa,EAAA;AAE5E,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,SAAA,GAAY,OAAA;AAC1C;AAaO,SAAS,gBAAA,CACdA,KAAAA,EACA,IAAA,GAAgC,EAAC,EACX;AACtB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,cAAA,EAAe;AACjD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,MAAA;AAC9B,EAAA,OAAOA,KAAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,IAAI,CAAA,IAAK,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAM,CAAA;AAC/E,IAAA,OAAO,CAAA,CAAE,WAAW,EAAE,KAAA,EAAO,UAAU,IAAA,EAAK,GAAI,EAAE,KAAA,EAAM;AAAA,EAC1D,CAAC,CAAA;AACH;AAKA,IAAM,SAAA,GAA2E;AAAA,EAC/E,MAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,KAAA,EAAM,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,QAAA,EAAW,IAAA,EAAM,KAAA,EAAM,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,QAAA,EAAW,IAAA,EAAM,KAAA,EAAM,EAAE;AAAA,EAClN,KAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAS,EAAM,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EAChN,MAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAS,EAAM,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EAChN,GAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,KAAA,EAAM,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,QAAA,EAAW,IAAA,EAAM,KAAA,EAAM,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAa,MAAA,EAAQ,QAAA,EAAW,IAAA,EAAM,KAAA,EAAM,EAAE;AAAA,EAClN,KAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,OAAA,EAAQ,EAAO,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EAChN,GAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,OAAA,EAAQ,EAAO,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EAChN,SAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,WAAA,EAAY,EAAG,OAAA,EAAS,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,WAAA,EAAY,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,WAAA,EAAY,EAAE;AAAA,EAC5M,MAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAS,EAAM,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAQ,IAAA,EAAM,QAAA,EAAS,EAAM,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAQ,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA;AAAA;AAAA,EAG/M,WAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAY,IAAA,EAAM,MAAA,EAAO,EAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,MAAA,EAAO,EAAQ,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,MAAA,EAAO,EAAE;AAAA;AAAA;AAAA,EAGvN,IAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAY,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAE;AAAA,EACtL,GAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAW,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,KAAA,EAAM,EAAM,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,KAAA,EAAM,EAAM,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,KAAA,EAAM,EAAE;AAAA,EACpL,MAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAY,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAE;AAAA,EACtL,QAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAY,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,MAAA,EAAO,EAAE;AAAA,EACtL,WAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAI,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EACpL,MAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,EACrL,UAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAI,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EACpL,KAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAI,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAK,IAAA,EAAM,OAAA,EAAQ,EAAE;AAAA,EACpL,OAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAI,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAW,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAE;AAAA,EACpN,SAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAI,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAW,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAE;AAAA,EACpN,SAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAI,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAW,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAE;AAAA,EACpN,UAAA,EAAa,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,IAAA,EAAM,QAAA,EAAI,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI,EAAW,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAa,MAAA,EAAQ,QAAA,EAAa,IAAA,EAAM,QAAA,EAAI;AACpN,CAAA;AAiBO,SAAS,cAAA,CACd,GAAA,EACA,IAAA,GAAyD,EAAC,EAC/C;AACX,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,cAAA,EAAe;AACjD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,MAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,KAAM,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,MAAA,CAAA;AAC9F,EAAA,MAAM,KAAA,GAAQ,QAAA,KAAa,KAAA,GAAQ,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,GAAA,CAAI,aAAY,GAAI,GAAA,CAAA;AACpG,EAAA,OAAO,IAAA,CAAK,WAAW,EAAE,KAAA,EAAO,UAAU,IAAA,EAAK,GAAI,EAAE,KAAA,EAAM;AAC7D;;;AC9KO,SAAS,oBAAA,CACd,QAAA,EACA,IAAA,GAAgC,EAAC,EACC;AAClC,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,MAAMA,QAAyB,EAAC;AAChC,EAAA,IAAI,QAAA,CAAS,KAAKA,KAAAA,CAAK,KAAK,EAAE,IAAA,EAAM,OAAO,CAAA;AAC3C,EAAA,IAAI,SAAS,KAAA,EAAOA,KAAAA,CAAK,IAAA,CAAK,SAAS,KAAA,KAAU,UAAA,GAAa,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,IAAA,KAAS,EAAE,IAAA,EAAM,SAAS,CAAA;AACnH,EAAA,IAAI,QAAA,CAAS,KAAKA,KAAAA,CAAK,KAAK,EAAE,IAAA,EAAM,OAAO,CAAA;AAC3C,EAAA,MAAMD,IAAAA,GAAM,OAAO,QAAA,CAAS,GAAA,KAAQ,WAAW,QAAA,CAAS,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiBC,KAAAA,EAAM,IAAI,CAAA;AACxC,EAAA,OAAOD,IAAAA,KAAQ,SAAY,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,cAAA,CAAeA,IAAAA,EAAK,IAAI,CAAC,CAAA;AACvE;;;ACxBA,IAAM,SAAA,GAAkD;AAAA,EACtD,SAAA,EAAW,OAAA;AAAA,EAAS,UAAA,EAAY,OAAA;AAAA,EAChC,WAAA,EAAa,MAAA;AAAA,EAAQ,YAAA,EAAc,MAAA;AAAA,EACnC,OAAA,EAAS,KAAA;AAAA,EAAO,QAAA,EAAU,KAAA;AAAA,EAC1B,QAAA,EAAU,MAAA;AAAA,EAAQ,SAAA,EAAW;AAC/B,CAAA;AAGA,IAAM,OAAA,GAA4C;AAAA,EAChD,SAAA,EAAW,GAAA;AAAA,EAAK,KAAA,EAAO,GAAA;AAAA,EAAK,KAAA,EAAO,GAAA;AAAA,EAAK,WAAA,EAAa,GAAA;AAAA,EAAK,YAAA,EAAc,GAAA;AAAA,EAAK,SAAA,EAAW,IAAA;AAAA,EACxF,SAAA,EAAW,GAAA;AAAA,EAAK,KAAA,EAAO,GAAA;AAAA,EAAK,KAAA,EAAO,GAAA;AAAA,EAAK,MAAA,EAAQ,GAAA;AAAA,EAAK,KAAA,EAAO,GAAA;AAAA,EAAK,aAAA,EAAe,MAAA;AAAA,EAChF,QAAA,EAAU,MAAA;AAAA,EAAQ,EAAA,EAAI;AACxB,CAAA;AAQO,SAAS,eAAA,CAAgB,IAAA,EAAc,IAAA,GAAgC,EAAC,EAAc;AAC3F,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,IAAI,CAAA;AAC9B,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,EAAE,OAAO,GAAA,EAAI;AAC3C,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,EAAA,IAAI,GAAA,EAAK,OAAO,gBAAA,CAAiB,CAAC,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,CAAE,CAAC,CAAA;AACzD,EAAA,MAAM,OAAO,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,IAAK,aAAA,CAAc,KAAK,IAAI,CAAA;AACjE,EAAA,IAAI,MAAM,OAAO,cAAA,CAAe,IAAA,CAAK,CAAC,GAAI,IAAI,CAAA;AAC9C,EAAA,IAAI,IAAA,KAAS,aAAA,EAAe,OAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAI,CAAA;AAC5B,EAAA,OAAO,OAAA,KAAY,SAAY,EAAE,KAAA,EAAO,SAAQ,GAAI,cAAA,CAAe,MAAM,IAAI,CAAA;AAC/E;;;ACFO,IAAM,yBAAA,GAA4B;AAOlC,SAAS,mBAAA,CACd,CAAA,EACA,IAAA,GAA8B,EAAC,EACJ;AAC3B,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,CAAA,EAAG,IAAI,CAAA;AACzC,EAAA,IAAI,CAAC,CAAA,IAAK,CAAC,IAAA,EAAM,OAAO,MAAA;AACxB,EAAA,MAAM,MAAA,GAAA,CAAU,EAAE,MAAA,IAAU,IAAI,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,qBAAqB,CAAA,CAAE,QAAA,EAAU,IAAI,CAAA,IAAK,IAAG,CAAE,CAAA;AACnH,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;AAOO,SAAS,cAAA,CACd,CAAA,EACA,IAAA,GAA8B,EAAC,EACX;AACpB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,cAAA,EAAe;AACjD,EAAA,MAAM,MAAM,QAAA,KAAa,OAAA;AACzB,EAAA,MAAM,QAAQ,mBAAA,CAAoB,CAAA,IAAK,EAAE,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,KAAU,MAAK,EAAG,GAAA,GAAM,EAAE,QAAA,EAAS,GAAI,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAC3H,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,GAAA,GAAM,EAAA,GAAK,GAAG,CAAA;AAC/D,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,KAAK,GAAG,yBAAyB,CAAA,CAAE,GAAG,IAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAC7F;;;ACpDA,IAAM,SAAA,GAA2C;AAAA,EAC/C,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,MAAA;AAAA,EAAQ,OAAA,EAAS,MAAA;AAAA,EACpC,IAAA,EAAM,MAAA;AAAA,EAAQ,OAAA,EAAS,MAAA;AAAA,EACvB,GAAA,EAAK,KAAA;AAAA,EAAO,MAAA,EAAQ,KAAA;AAAA,EACpB,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAGA,IAAM,SAAA,GAAoC,EAAE,KAAA,EAAO,GAAA,EAAK,KAAK,QAAA,EAAS;AAEtE,SAAS,MAAM,QAAA,EAAkD;AAE/D,EAAA,MAAM,QAAQ,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAM,GAAG,CAAA,EAAG,GAAG,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AACvG,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,EAAI;AACtB,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,cAAA,CAAgB,CAAA;AAC/D,EAAA,MAAMC,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,WAAA,EAAa,CAAA;AACxC,IAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9E,IAAAA,KAAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,EACd;AACA,EAAA,OAAO,EAAE,KAAK,SAAA,CAAU,GAAA,CAAI,aAAa,CAAA,IAAK,GAAA,EAAK,IAAA,EAAAA,KAAAA,EAAK;AAC1D;AAKO,SAAS,IAAI,QAAA,EAA2B;AAC7C,EAAA,MAAM,EAAE,GAAA,EAAK,CAAA,EAAG,MAAAA,KAAAA,EAAK,GAAI,MAAM,QAAQ,CAAA;AACvC,EAAA,OAAO,OAAO,IAAA,CAAKA,KAAI,EAAE,MAAA,GAAS,CAAA,GAAI,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,MAAAA,KAAAA,EAAK,GAAI,EAAE,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA,EAAE;AAC9F;AAGO,SAAS,KAAK,QAAA,EAA+B;AAClD,EAAA,MAAM,EAAE,GAAA,EAAK,CAAA,EAAG,MAAAA,KAAAA,EAAK,GAAI,MAAM,QAAQ,CAAA;AACvC,EAAA,OAAO,OAAO,IAAA,CAAKA,KAAI,EAAE,MAAA,GAAS,CAAA,GAAI,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,MAAAA,KAAAA,EAAK,GAAI,EAAE,IAAA,EAAM,UAAA,EAAY,KAAK,CAAA,EAAE;AACxG;AAGO,SAAS,OAAA,GAAgB;AAC9B,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,YAAY,KAAA,EAAiD;AAC3E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,SAAiB,WAAA,CAAY,UAAA,CAAW,KAAK,CAAC,CAAA;AACnE,EAAA,OAAO,KAAA;AACT;AAEA,IAAMC,aAAwC,CAAC,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAQ,MAAM,CAAA;AAM7E,SAAS,aAAa,IAAA,EAA4C;AACvE,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAK,IAAA,CAAK,GAAA;AACxD,EAAA,MAAM,QAAA,GAAWA,WAAU,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,KAAM,UAAU,CAAA;AACtE,EAAA,MAAM,QAAA,GAAWA,WAAU,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,KAAM,IAAI,CAAA;AAChE,EAAA,MAAM,MAAM,CAAC,CAAA,EAAG,GAAG,QAAQ,CAAA,CAAE,KAAK,GAAG,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,KAAS,KAAA,GAAQ,SAAA,GAAY,SAAA;AAClD,EAAA,MAAM,QAAQ,CAAC,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,GAAG,KAAK,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACpF,EAAA,OAAO,SAAA,CAAU,KAAA,EAAO,CAAC,CAAA,GAAI,KAAA,GAAQ,IAAA;AACvC;AAEA,SAAS,SAAA,CAAU,OAAe,CAAA,EAAoB;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,IAAA,OAAO,IAAA,KAAS,SAAS,IAAA,CAAK,IAAA,KAAS,SAAS,IAAA,CAAK,IAAA,KAAS,UAAA,CAAA,IAAe,IAAA,CAAK,GAAA,KAAQ,CAAA;AAAA,EAC5F,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AC/EA,IAAM,aAAA,GAAgB,yDAAA;AAMf,SAAS,kBAAkB,IAAA,EAAsD;AACtF,EAAA,OAAQ,IAAA,EAAM,OAAA,CAAQ,aAAa,CAAA,IAA4B,IAAA;AACjE;AAGA,SAAS,cAAc,EAAA,EAAsB;AAC3C,EAAA,MAAM,EAAA,GAAK,iBAAiB,EAAE,CAAA;AAC9B,EAAA,MAAM,MAAM,CAAC,KAAA,KAA8B,UAAU,MAAA,IAAa,KAAA,KAAU,MAAM,KAAA,KAAU,MAAA;AAC5F,EAAA,OACE,GAAA,CAAI,GAAG,SAAS,CAAA,IAChB,IAAI,EAAA,CAAG,MAAM,KACb,GAAA,CAAI,EAAA,CAAG,cAAc,CAAA,IACrB,GAAA,CAAI,GAAG,WAAW,CAAA,IAClB,8BAA8B,IAAA,CAAK,EAAA,CAAG,WAAW,EAAE,CAAA;AAEvD;AAkBO,SAAS,UAAU,IAAA,EAA6C;AACrE,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,IAAI,CAAA,IAAK,QAAA,CAAS,IAAA;AACjD,EAAA,IAAI,IAAA,KAAS,QAAA,CAAS,IAAA,IAAQ,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAE;AACnF,EAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAK,IAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAI;AAChD;;;AC7CA,SAAS,UAAUD,KAAAA,EAAmC;AACpD,EAAA,IAAI,CAACA,OAAM,OAAO,CAAA;AAClB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAIA,KAAAA,CAAK,QAAQ,IAAA,EAAM,CAAA,EAAA;AACvB,EAAA,IAAIA,KAAAA,CAAK,SAAS,IAAA,EAAM,CAAA,EAAA;AACxB,EAAA,IAAIA,KAAAA,CAAK,SAAS,IAAA,EAAM,CAAA,EAAA;AACxB,EAAA,IAAIA,KAAAA,CAAK,QAAQ,IAAA,EAAM,CAAA,EAAA;AACvB,EAAA,IAAIA,KAAAA,CAAK,UAAU,IAAA,EAAM,CAAA,EAAA;AACzB,EAAA,OAAO,CAAA;AACT;AAcA,SAAS,WAAW,MAAA,EAAwC;AAC1D,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,gBAAgB,MAAM,CAAA;AACnC,EAAA,IAAI,IAAA,KAAS,MAAM,OAAO,CAAA;AAC1B,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AAAQ,MAAA,OAAO,IAAA,CAAK,kBAAkB,CAAA,GAAI,CAAA;AAAA,IAC/C,KAAK,YAAA;AAAc,MAAA,OAAO,CAAA;AAAA,IAC1B,KAAK,MAAA;AAAQ,MAAA,OAAO,CAAA;AAAA,IACpB,KAAK,WAAA;AAAa,MAAA,OAAO,CAAA;AAAA,IACzB,SAAS;AAGP,MAAA,OAAO,CAAA;AAAA,IACT;AAAA;AAEJ;AAEA,SAAS,aAAa,IAAA,EAA2C;AAC/D,EAAA,OAAO,QAAA,IAAY,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,MAAA;AAC1C;AAoBA,SAAS,UAAU,IAAA,EAAqC;AACtD,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,KAAS,QAAA,GAC1B,CAAC,EAAE,OAAA,EAAS,GAAA,EAAK,KAAA,EAAO,IAAA,EAAmB,CAAA,GAC3C,IAAA;AACJ,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAA,CAAQ,EAAE,OAAA,KAAY,GAAA,GAAM,IAAI,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,GAAA,GAAM,CAAA,GAAI,CAAA,CAAA;AAClE,IAAA,IAAI,IAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AAAA,EACxB;AACA,EAAA,OAAO,GAAA;AACT;AAcO,SAAS,YACd,IAAA,EAC2C;AAC3C,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,YAAA,CAAa,IAAI,CAAC,CAAA;AACvC,EAAA,MAAMA,KAAAA,GAAQ,MAAA,IAAU,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,MAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,UAAUA,KAAI,CAAA;AACxB,EAAA,MAAM,IAAI,SAAA,CAAW,OAAA,IAAW,IAAA,GAAO,IAAA,CAAK,QAAQ,MAAmC,CAAA;AAGvF,EAAA,MAAM,SACH,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,OAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,KAChE,KAAK,KAAA,KAAU,MAAA,IAAa,KAAK,KAAA,CAAM,MAAA,GAAS,IAC5C,CAAA,GAAI,CAAA;AACV,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACxB;;;ACtGO,IAAM,iBAAA,GAAoB;AAI1B,SAAS,iBAAA,CACd,IAAA,EACA,EAAA,EACA,SAAA,GAAoB,iBAAA,EACX;AACT,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,SAAS,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA,IAAK,SAAA;AAC7E;;;ACVO,IAAM,aAAA,GAAgB;AAItB,IAAM,mBAAA,GAAsB;AAI5B,IAAM,mBAAA,GAAsB;AAI5B,IAAM,gBAAA,GAAmB;;;ACezB,SAAS,UACd,IAAA,EAC4D;AAC5D,EAAA,OAAO;AAAA,IACL,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,IACvE,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,IACvE,GAAI,KAAK,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI;AAAC,GACnE;AACF;AAKO,SAAS,WAAA,CAAY,MAAkB,EAAA,EAAkE;AAC9G,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,QAAQ,EAAA,CAAG,MAAA;AAAA,IACX,QAAQ,EAAA,CAAG,MAAA;AAAA,IACX,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,GAAG,EAAA,CAAG,MAAA;AAAA,IACN,GAAG,EAAA,CAAG,MAAA;AAAA,IACN,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,SAAS,EAAA,CAAG;AAAA,GACd;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,eAAA;AACnB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,GAAG,MAAA,EAAQ,GAAG,SAAA,CAAU,IAAI,GAAG,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IAChG,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,aAAA;AAAA,MAAe,GAAG,MAAA;AAAA,MACxB,GAAG,SAAA,CAAU,KAAA,GAAQ,EAAE,UAAA,EAAY,KAAK,UAAA,EAAY,GAAG,KAAA,EAAM,GAAI,IAAI;AAAA;AACvE,GACF;AACF;AAKO,SAAS,gBAAgB,IAAA,EAAsE;AACpG,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,GAAG,UAAU,IAAI;AAAA,GACnB;AACA,EAAA,MAAME,GAAAA,GAAK,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,KAAK,OAAA,EAAQ;AAC1F,EAAA,OAAO;AAAA,IACL,WAAW,EAAE,IAAA,EAAM,aAAa,GAAGA,GAAAA,EAAI,GAAG,MAAA,EAAO;AAAA,IACjD,aAAa,EAAE,IAAA,EAAM,eAAe,GAAGA,GAAAA,EAAI,GAAG,MAAA;AAAO,GACvD;AACF;;;ACnDO,SAAS,YAAA,CACd,IAAA,EACA,EAAA,EACA,MAAA,EACA,GAAA,EACA,QAAA,EACA,QAAA,EACA,MAAA,GAA4B,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,qBAAoB,EACrE;AAChB,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,EAAM,EAAE,CAAA;AAChC,EAAA,MAAM,QAAQ,EAAE,CAAA,EAAG,GAAG,MAAA,EAAQ,CAAA,EAAG,GAAG,MAAA,EAAO;AAC3C,EAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAClB,EAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAEtB,EAAA,MAAM,IAAI,GAAA,EAAI;AACd,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,UAAU,IAAA,KAAS,IAAA,IACpB,IAAI,IAAA,CAAK,CAAA,GAAI,OAAO,KAAA,IACpB,IAAA,CAAK,MAAM,EAAA,CAAG,OAAA,GAAU,KAAK,OAAA,EAAS,EAAA,CAAG,UAAU,IAAA,CAAK,OAAO,IAAI,MAAA,CAAO,KAAA;AAC/E,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAA,CAAO,IAAA,GAAO,EAAE,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,OAAA,EAAS,GAAG,OAAA,EAAQ;AAC5D,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,QAAA,CAAS,cAAc,KAAK,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA;AAE5C,EAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;;;AC3BO,SAAS,mBAAA,CACd,OACA,QAAA,EACe;AACf,EAAA,IAAI,OAAA,GAAwD,IAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,CAAC,SAAA,KAA6B;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAY,SAAA,KAAc,MAAA,IAAa,OAAA,CAAQ,cAAc,SAAA,EAAY;AAC9E,IAAA,KAAA,CAAM,UAAA,CAAW,QAAQ,KAAK,CAAA;AAC9B,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAA,EAAO;AACP,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,MAAM;AACjC,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,IAAA,EAAK;AAAA,MACP,CAAA,EAAG,MAAM,QAAQ,CAAA;AACjB,MAAA,OAAA,GAAU,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,KAAA,EAAM;AAC9C,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,SAAA,KAAc,OAAA,EAAS,SAAA,KAAc,SAAA;AAAA,IAClD;AAAA,GACF;AACF;;;AC7CO,SAAS,mBAAmB,SAAA,EAAgD;AACjF,EAAA,MAAM,GAAA,GAAM,CAAC,GAAG,SAAS,CAAA;AACzB,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE,EAAG,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,EAAE;AAC3E,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAA,IAAQ,CAAA,CAAE,CAAA;AACV,IAAA,IAAA,IAAQ,CAAA,CAAE,CAAA;AAAA,EACZ;AACA,EAAA,MAAM,KAAK,GAAA,CAAI,CAAC,EAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA;AAC/B,EAAA,MAAM,KAAK,GAAA,CAAI,CAAC,EAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA;AAC/B,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAE,CAAA,EAAG,IAAA,GAAO,IAAI,MAAA,EAAQ,CAAA,EAAG,IAAA,GAAO,GAAA,CAAI,MAAA,EAAO;AAAA,IACvD,QAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,IACnC,OAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,GAAI,MAAO,IAAA,CAAK;AAAA,GAC3C;AACF;AA2BO,SAAS,uBAAA,CAAwB,KAAA,GAAsB,MAAM,gBAAA,EAAqC;AACvG,EAAA,IAAI,OAAA,GAA0B,IAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,SAAA,EAAW,QAAA,EAAU,GAAA,EAAK;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU;AAAA,UACR,SAAS,SAAA,CAAU,IAAA;AAAA,UAAM,QAAA,EAAU,EAAE,GAAG,QAAA,EAAS;AAAA,UAAG,QAAA,sBAAc,GAAA,EAAI;AAAA,UAAG,KAAA,EAAO,KAAA;AAAA,UAAO,SAAA,EAAW;AAAA,SACpG;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,UAAU,SAAA,CAAU,IAAA;AAAA,MAC9B;AACA,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,SAAA,EAAW;AAC/B,QAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,EAAE,GAAG,GAAG,CAAA;AAAA,MAClE;AAAA,IACF,CAAA;AAAA,IACA,KAAA,CAAM,WAAW,EAAA,EAAI;AACnB,MAAA,MAAM,IAAA,GAAO,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC5C,MAAA,IAAI,WAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,IAAI,IAAA,CAAK,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,KAAK,CAAC,CAAA,GAAI,KAAA,EAAM,UAAW,KAAA,GAAQ,IAAA;AAAA,IAC7F,CAAA;AAAA,IACA,MAAA,CAAO,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW;AAC/B,MAAA,MAAM,CAAA,GAAI,OAAA;AACV,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AAEf,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,CAAA,CAAE,SAAA,GAAY,SAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,CAAA,CAAE,QAAA,CAAS,CAAC,KAAK,KAAA,EAAM;AACxF,MAAA,OAAO,SAAS,CAAC,CAAA,CAAE,KAAA,IAAS,KAAA,GAAQ,EAAE,OAAA,GAAU,IAAA;AAAA,IAClD,CAAA;AAAA,IACA,OAAA,GAAU;AAAE,MAAA,OAAA,GAAU,IAAA;AAAA,IAAM;AAAA,GAC9B;AACF;;;ACjDO,SAAS,YAAY,CAAA,EAAmC;AAC7D,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAC1F;AAEO,SAAS,aAAa,CAAA,EAA4B;AACvD,EAAA,OAAO;AAAA,IACL,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,QAAQ,CAAA,CAAE,CAAA;AAAA,IACV,QAAQ,CAAA,CAAE,CAAA;AAAA,IACV,GAAG,YAAY,CAAC,CAAA;AAAA,IAChB,GAAG,UAAU,CAAC,CAAA;AAAA,IACd,GAAI,EAAE,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,CAAA,CAAE,eAAA,EAAgB,GAAI;AAAC,GAClF;AACF;AAEA,IAAM,EAAA,GAAK,CAAC,CAAA,EAAkB,KAAA,MAAkB;AAAA,EAC9C,WAAW,CAAA,CAAE,SAAA;AAAA,EAAW,GAAG,KAAA,CAAM,CAAA;AAAA,EAAG,GAAG,KAAA,CAAM,CAAA;AAAA,EAAG,SAAS,CAAA,CAAE,OAAA;AAAA,EAAS,SAAS,CAAA,CAAE,OAAA;AAAA,EAAS,GAAG,YAAY,CAAC;AAC1G,CAAA,CAAA;AAEO,SAAS,iBAAiB,CAAA,EAAkC;AACjE,EAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,QAAQ,CAAA,CAAE,MAAA,EAAQ,GAAG,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,QAAA,CAAS,CAAC,GAAG,GAAG,SAAA,CAAU,CAAC,CAAA,EAAE;AAC/F;AAEO,SAAS,gBAAA,CAAiB,GAAkB,KAAA,EAA0B;AAC3E,EAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,GAAG,EAAA,CAAG,CAAA,EAAG,KAAK,CAAA,EAAG,GAAG,QAAA,CAAS,CAAC,CAAA,EAAE;AAChE;AAEO,SAAS,cAAA,CAAe,GAAkB,KAAA,EAA0B;AACzE,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,GAAG,EAAA,CAAG,CAAA,EAAG,KAAK,CAAA,EAAE;AAC9C;;;ACqBA,SAAS,eAAA,CACP,OAAA,EACAF,KAAAA,EACA,IAAA,EACY;AACZ,EAAA,OAAO,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,GAAG,WAAA,CAAYA,KAAI,CAAA,EAAG,GAAG,IAAA,EAAK;AACtE;AAEA,IAAM,WAAA,GAAc,CAACH,KAAAA,KACnB,IAAI,IAAI,CAAC,GAAGA,KAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,CAAC,CAAA,KAAM,CAAC,IAAI,CAAA,CAAE,GAAG,CAAC,CAAC,CAAA;AAGjD,SAAS,YAAA,CACPA,KAAAA,EACA,SAAA,EACA,KAAA,EACoB;AACpB,EAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,CAAC,GAAG,WAAA,CAAYA,KAAI,CAAA,CAAE,MAAA,EAAO,EAAG,GAAG,KAAK,CAAC,CAAA;AACtE,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,UAAU,SAAA,CAAU,CAAA,CAAE,QAAQ,CAAA,EAAE;AACjD;AAGA,SAAS,aAAA,CAAc,GAAA,EAAuB,IAAA,EAAsB,QAAA,EAAoC;AACtG,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,IAAI,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACxC,EAAA,IAAI,WAAW,WAAA,EAAa,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAI,WAAW,CAAA;AAClE,EAAA,IAAI,WAAW,WAAA,EAAa;AAE5B,EAAA,GAAA,CAAI,QAAA,GAAW,IAAA;AACf,EAAA,IAAI,GAAA,CAAI,QAAA,EAAU,QAAA,CAAS,SAAA,GAAY,IAAI,QAAQ,CAAA;AACrD;AAGA,SAAS,aAAa,IAAA,EAAgC;AACpD,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,MAAc,IAAA,CAAK,WAAA,IAAc,IAAK,aAAA;AAAA,IACnD,KAAA,EAAO,MAAc,IAAA,CAAK,KAAA,IAAQ,IAAK,gBAAA;AAAA,IACvC,MAAA,EAAQ,MAAc,IAAA,CAAK,MAAA,IAAS,IAAK,iBAAA;AAAA,IACzC,aAAa,OAAO;AAAA,MAClB,KAAA,EAAO,IAAA,CAAK,aAAA,IAAgB,IAAK,mBAAA;AAAA,MACjC,KAAA,EAAO,IAAA,CAAK,aAAA,IAAgB,IAAK;AAAA,KACnC;AAAA,GACF;AACF;AAGA,SAAS,WAAW,KAAA,EAAsD;AACxE,EAAA,OAAO,CAAC,CAAA,KAAM;AACZ,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,EAAI;AACtB,IAAA,MAAM,IAAI,CAAA,CAAE,SAAA;AACZ,IAAA,OAAO,MAAM,MAAA,IAAa,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,MAAM,CAAA,GAAI,GAAA;AAAA,EACpD,CAAA;AACF;AAGO,SAAS,wBAAwB,IAAA,EAAmD;AACzF,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,GAAW,IAAI,SAAA,GAAY,CAAC,CAAA,KAAM,CAAA,EAAE,GAAI,IAAA;AAC7D,EAAA,MAAM,QAAQ,CAAC,CAAA,KAA4B,IAAA,CAAK,OAAA,GAAU,EAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAChH,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAE,MAAM,IAAA,EAAK;AAC3C,EAAA,MAAMA,KAAAA,uBAAW,GAAA,EAAkB;AACnC,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAO,QAAQ,WAAA,EAAY,GAAI,aAAa,IAAI,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,wBAAwB,KAAK,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,KAAA,EAAO,CAAC,OAAA,KAAY;AAAE,IAAA,QAAA,CAAS,cAAc,OAAO,CAAA;AAAA,EAAG,CAAC,CAAA;AACzF,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,GAAiB,OAAO,YAAA,CAAaA,KAAAA,EAAM,WAAW,KAAK,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA;AAMnC,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAA2B;AACrD,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,KAAA,MAAW,CAAA,IAAKA,KAAAA,CAAK,MAAA,EAAO,IAAK,QAAA,GAAW,IAAA;AAC5C,IAAA,MAAM,IAAI,QAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAYA,KAAI,CAAA,EAAG,EAAE,QAAA,EAAU,UAAA,CAAW,CAAC,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,SAAS,eAAA,CAAgBA,KAAAA,CAAK,IAAA,EAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,CAAA,EAAG;AACP,MAAA,MAAM,EAAA,GAAK,iBAAiB,CAAC,CAAA;AAC7B,MAAA,MAAM,MAAY,EAAE,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,IAAW,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,YAAA,CAAa,CAAC,CAAA,EAAE;AAC7F,MAAAA,KAAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,GAAG,CAAA;AAIzB,MAAA,IAAIA,KAAAA,CAAK,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,EAAE,GAAG,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA;AAC1D,MAAA,IAAA,CAAK,CAAA,CAAE,gBAAgB,OAAA,IAAW,CAAA,CAAE,gBAAgB,KAAA,KAAUA,KAAAA,CAAK,SAAS,CAAA,EAAG;AAC7E,QAAA,GAAA,CAAI,WAAW,CAAA,CAAE,WAAA;AACjB,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,WAAA,EAAa,EAAE,WAAA,EAAa,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM,WAAW,KAAA,CAAM,GAAA,EAAI,EAAG,QAAA,EAAU,aAAY,EAAE;AAAA,UACvH,MAAM;AAAE,YAAA,aAAA,CAAcA,MAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA,EAAG,MAAM,QAAQ,CAAA;AAAA,UAAG;AAAA,SAChE;AAAA,MACF;AACA,MAAA,IAAIA,KAAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAA;AAAA,IAC1C,CAAA;AAAA,IAEA,KAAK,CAAA,EAAG;AACN,MAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AAChC,MAAA,MAAM,KAAK,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AACxC,MAAA,IAAI,GAAA,MAAS,GAAA,GAAM,EAAA;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAE,SAAA,EAAW,EAAE,CAAA;AAE7B,MAAA,IAAI,GAAA,EAAK,YAAY,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG;AAC7D,QAAA,MAAM,QAAQ,GAAA,CAAI,QAAA;AAClB,QAAA,GAAA,CAAI,QAAA,GAAW,IAAA;AACf,QAAA,IAAA,CAAK,MAAA,CAAO,EAAE,SAAS,CAAA;AACvB,QAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,MACrB;AACA,MAAA,IAAIA,MAAK,IAAA,IAAQ,CAAA,IAAK,KAAK,kBAAA,CAAmBA,KAAAA,CAAK,IAAI,CAAA,EAAG;AACxD,QAAA,IAAA,CAAK,SAAS,eAAA,CAAgBA,KAAAA,CAAK,MAAM,CAAA,EAAG,QAAA,EAAU,CAAC,CAAA;AAAA,MACzD;AACA,MAAA,IAAA,CAAK,SAAS,gBAAA,CAAiB,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,QAAQ,CAAA,EAAG;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,EAAE,SAAS,CAAA;AACvB,MAAA,MAAM,SAASA,KAAAA,CAAK,IAAA;AACpB,MAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AAChC,MAAAA,KAAAA,CAAK,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA;AAEvB,MAAA,IAAI,MAAA,IAAU,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,MAAA,EAAQ,CAAA,EAAG,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA;AAC5E,MAAA,IAAI,MAAA,IAAU,CAAA,IAAKA,KAAAA,CAAK,IAAA,GAAO,CAAA,EAAG;AAEhC,QAAA,MAAM,UAAU,OAAA,CAAQ,MAAA;AAAA,UACtB,QAAA,CAAS,CAAC,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA,CAAE,QAAA;AAAA,UAAU,WAAW,CAAC,CAAA;AAAA,UAAG,WAAA;AAAY,SAClF;AACA,QAAA,IAAI,OAAA,KAAY,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,GAAG,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA;AAAA,MAC3F;AACA,MAAA,IAAA,CAAK,SAAS,cAAA,CAAe,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAIzC,MAAA,IAAI,CAAC,GAAA,EAAK,QAAA,EAAU,OAAO,EAAC;AAC5B,MAAA,MAAMK,GAAAA,GAAK,MAAM,CAAC,CAAA;AAClB,MAAA,MAAM,EAAA,GAAK;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,QAAS,SAAS,CAAA,CAAE,OAAA;AAAA,QAAS,QAAQA,GAAAA,CAAG,CAAA;AAAA,QAAG,QAAQA,GAAAA,CAAG,CAAA;AAAA,QAAG,GAAG,YAAY,CAAC;AAAA,OACxG;AACA,MAAA,OAAO,aAAa,GAAA,CAAI,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,MAAM,UAAA,CAAW,CAAC,CAAA,EAAG,CAAC,OAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,EAAG,QAAA,EAAU,aAAa,CAAA;AAAA,IACnH,CAAA;AAAA,IAEA,OAAO,SAAA,EAAW;AAChB,MAAA,MAAM,GAAA,GAAML,KAAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAC9B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,SAASA,KAAAA,CAAK,IAAA;AACpB,MAAAA,KAAAA,CAAK,OAAO,SAAS,CAAA;AACrB,MAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAErB,MAAA,IAAI,MAAA,IAAU,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,MAAA,EAAQ,GAAA,CAAI,IAAA,EAAM,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA;AACnF,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,GAAG,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA;AAAA,IAC9E,CAAA;AAAA,IAEA,QAAA,GAAW;AACT,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAKA,KAAAA,EAAM;AAC5B,QAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACnB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,QAAA,aAAA,CAAc,GAAA,EAAK,MAAM,QAAQ,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,SAAA,EAAW,MAAMA,KAAAA,CAAK,IAAA;AAAA,IACtB,YAAY,CAAC,SAAA,KAAcA,KAAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,GAAA;AAAA,IAChD,KAAA,GAAQ;AACN,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAAA,MAAK,KAAA,EAAM;AACX,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAAA,GACF;AACF;;;AC1QO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,sBAAA;AAAA,EAAwB,0BAAA;AAAA,EAC5E,iBAAA;AAAA,EAAmB,mBAAA;AAAA,EAAqB,iBAAA;AAAA,EAAmB,mBAAA;AAAA,EAAqB;AAClF,CAAA,CAAE,KAAK,GAAG;AAQH,SAAS,iBAAA,CAAkB,QAA4B,IAAA,EAAwB;AACpF,EAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,EAAU,OAAO,KAAA;AACzC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC/C,EAAA,OAAO,YAAY,IAAA,IAAQ,OAAA,KAAY,IAAA,IAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AACtE;;;ACEA,IAAM,QAAA,uBAAe,OAAA,EAA0B;AAE/C,SAAS,OAAO,OAAA,EAA2B;AACzC,EAAA,MAAM,MAAM,OAAA,CAAQ,aAAA;AACpB,EAAA,MAAM,MAAM,GAAA,CAAI,WAAA;AAChB,EAAA,MAAMA,KAAAA,uBAAW,GAAA,EAAqB;AACtC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAmB;AAC/B,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAAA,MAAK,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAA;AAAA,EACnC,CAAA;AACA,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAmB;AAAE,IAAAA,KAAAA,CAAK,MAAA,CAAQ,CAAA,CAAmB,SAAS,CAAA;AAAA,EAAG,CAAA;AAG7E,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAmB;AAC/B,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,IAAIA,KAAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,CAAE,OAAA,KAAY,CAAA,EAAGA,KAAAA,CAAK,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA;AAAA,EACvE,CAAA;AAEA,EAAA,MAAM,OAAO,MAAY;AAAE,IAAAA,MAAK,KAAA,EAAM;AAAA,EAAG,CAAA;AAGzC,EAAA,OAAA,CAAQ,gBAAA,CAAiB,aAAA,EAAe,IAAA,EAAM,IAAI,CAAA;AAClD,EAAA,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,EAAA,EAAI,IAAI,CAAA;AAC1C,EAAA,GAAA,CAAI,gBAAA,CAAiB,eAAA,EAAiB,EAAA,EAAI,IAAI,CAAA;AAC9C,EAAA,GAAA,CAAI,gBAAA,CAAiB,aAAA,EAAe,IAAA,EAAM,IAAI,CAAA;AAC9C,EAAA,GAAA,EAAK,gBAAA,CAAiB,QAAQ,IAAI,CAAA;AAClC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,IAAA,EAAAA,KAAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,OAAA,CAAQ,mBAAA,CAAoB,aAAA,EAAe,IAAA,EAAM,IAAI,CAAA;AACrD,MAAA,GAAA,CAAI,mBAAA,CAAoB,WAAA,EAAa,EAAA,EAAI,IAAI,CAAA;AAC7C,MAAA,GAAA,CAAI,mBAAA,CAAoB,eAAA,EAAiB,EAAA,EAAI,IAAI,CAAA;AACjD,MAAA,GAAA,CAAI,mBAAA,CAAoB,aAAA,EAAe,IAAA,EAAM,IAAI,CAAA;AACjD,MAAA,GAAA,EAAK,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAAA,IACvC;AAAA,GACF;AACF;AAMO,SAAS,aAAa,OAAA,EAAgC;AAC3D,EAAA,IAAI,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,OAAO,OAAO,CAAA;AACxB,IAAA,QAAA,CAAS,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,MAAA,GAAS,OAAA;AACf,EAAA,MAAA,CAAO,OAAA,IAAW,CAAA;AAClB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA;AAAA,IACzB,OAAA,GAAU;AACR,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAA,CAAO,OAAA,IAAW,CAAA;AAClB,MAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA,IAAI,SAAS,GAAA,CAAI,OAAO,MAAM,MAAA,EAAQ,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,IAC/D;AAAA,GACF;AACF;;;AChFO,SAAS,iBAAiB,MAAA,EAAqC;AACpE,EAAA,IAAI,CAAC,MAAA,IAAU,EAAE,MAAA,YAAkB,UAAU,OAAO,KAAA;AACpD,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,EAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,EAAY,OAAO,IAAA;AAClD,EAAA,IAAK,MAAA,CAAuB,mBAAmB,OAAO,IAAA;AACtD,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,YAAA,CAAa,iBAAiB,CAAA;AAChD,EAAA,OAAO,EAAA,KAAO,UAAU,EAAA,KAAO,EAAA;AACjC;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,QAAA;AAAA,EAChC,sBAAA;AAAA,EAAwB,sBAAA;AAAA,EAAwB,qBAAA;AAAA,EAChD,wBAAA;AAAA,EAA0B,qBAAA;AAAA,EAC1B,iBAAA;AAAA,EAAmB,eAAA;AAAA,EAAiB,mBAAA;AAAA,EAAqB,iBAAA;AAAA,EACzD,mBAAA;AAAA,EAAqB,cAAA;AAAA,EAAgB;AACvC,CAAA,CAAE,KAAK,IAAI,CAAA;AAOJ,SAAS,wBAAwB,CAAA,EAA2B;AACjE,EAAA,IAAI,EAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,GAAA,KAAQ,SAAS,OAAO,KAAA;AAC/C,EAAA,OAAO,EAAE,MAAA,YAAkB,OAAA,IAAW,CAAA,CAAE,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AACzE;AAEA,IAAM,iBAAA,mBAAoB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,WAAA,EAAa,WAAA,EAAa,YAAA,EAAc,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,UAAU,CAAC,CAAA;AAE1H,SAAS,cAAc,CAAA,EAA2B;AAChD,EAAA,IAAI,EAAE,EAAE,MAAA,YAAkB,OAAA,CAAA,IAAY,EAAE,MAAA,CAAO,OAAA,KAAY,UAAU,OAAO,KAAA;AAC5E,EAAA,IAAI,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,QAAQ,OAAO,KAAA;AAE/C,EAAA,OAAO,kBAAkB,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,IAAK,CAAA,CAAE,IAAI,MAAA,KAAW,CAAA;AAC1D;AAUO,SAAS,sBAAsB,CAAA,EAA2B;AAC/D,EAAA,OAAO,uBAAA,CAAwB,CAAC,CAAA,IAAK,aAAA,CAAc,CAAC,CAAA;AACtD","file":"index.js","sourcesContent":["/**\n * Declarative gesture taxonomy. Single source of truth for:\n * - which gestures hit-test (have a `.target` slot in the route string)\n * - which gestures carry an argument and what values are legal\n * - the default arg value (used when none is specified in a route)\n *\n * Reflection, matcher, and inspector UI all read this table. Adding a new\n * gesture name in one place updates every consumer.\n */\n\nexport type GestureName =\n | 'click'\n | 'pointerDown'\n | 'hover'\n | 'dblTap'\n | 'drag'\n | 'wheel'\n | 'pinch'\n | 'keyDown'\n | 'keyUp'\n | 'keyHeld'\n | 'contextMenu'\n | 'longPress'\n | 'multiTouch'\n | 'multiTouchTap'\n | 'drop'\n | 'carry'\n | 'paste';\n\n/**\n * Gesture kinds an affordance claim can bar, in the spec vocabulary bindings\n * are written in. `'pointer'` is one token because `pointerDown` / `click` /\n * `drag` are a single press protocol — at the event level the first two are\n * the same `kind: 'pointerdown'`, told apart only by `stage`.\n */\nexport type ClaimableGesture =\n | 'pointer'\n | 'doubleClick'\n | 'contextMenu'\n | 'longPress'\n | 'wheel'\n | 'pinch';\n\n/** Declares the argument a gesture carries: what it is called, which values\n * are legal, and what an omitted arg slot means. */\nexport interface GestureArgSpec {\n /** Display name for the arg in inspector chips (`direction`, `key`, `fingers`). */\n name: string;\n /** Acceptable values. `'free'` means any string (e.g. key names). */\n values: readonly string[] | 'free';\n /** Value an omitted arg slot takes. Must be in `values` unless\n * `values === 'free'`. Omit it to make an omitted slot mean the `'*'`\n * wildcard — match every value. */\n default?: string;\n}\n\n/** What the grammar knows about one gesture — the form of input itself, not\n * any action bound to it. */\nexport interface GestureDescriptor {\n name: GestureName;\n /** Does the route's `.target` slot apply? Targetless gestures (`wheel`,\n * `keyDown/Up`, `multiTouch`, `multiTouchTap`) elide it entirely in the v2 grammar. */\n hasTarget: boolean;\n /** Optional argument spec. Encoded as `gesture(value)` in the route string. */\n arg?: GestureArgSpec;\n}\n\n/** The gesture taxonomy: one descriptor per gesture the grammar recognizes.\n * Adding a gesture here is what makes it parseable, matchable and\n * inspectable. */\nexport const GESTURE_DESCRIPTORS: readonly GestureDescriptor[] = [\n { name: 'click', hasTarget: true },\n { name: 'pointerDown', hasTarget: true },\n { name: 'hover', hasTarget: true, arg: { name: 'motion', values: ['move', 'leave'], default: 'move' } },\n { name: 'dblTap', hasTarget: true },\n { name: 'drag', hasTarget: true },\n { name: 'wheel', hasTarget: true, arg: { name: 'direction', values: ['up', 'down', '*'], default: '*' } },\n { name: 'pinch', hasTarget: true, arg: { name: 'direction', values: ['in', 'out', '*'], default: '*' } },\n { name: 'keyDown', hasTarget: false, arg: { name: 'key', values: 'free' } },\n { name: 'keyUp', hasTarget: false, arg: { name: 'key', values: 'free' } },\n { name: 'keyHeld', hasTarget: false, arg: { name: 'key', values: 'free' } },\n { name: 'contextMenu', hasTarget: true },\n { name: 'longPress', hasTarget: true },\n { name: 'multiTouch', hasTarget: false, arg: { name: 'fingers', values: ['2', '3', '4'] } },\n { name: 'multiTouchTap', hasTarget: false, arg: { name: 'fingers', values: ['2', '3', '4'] } },\n // The arg is the MIME-glob filter. No default: a spec with no `types`\n // matches any payload, which is what an omitted arg slot means for a\n // `'free'` arg.\n { name: 'drop', hasTarget: false, arg: { name: 'types', values: 'free' } },\n { name: 'carry', hasTarget: true, arg: { name: 'types', values: 'free' } },\n { name: 'paste', hasTarget: false, arg: { name: 'types', values: 'free' } },\n];\n\nconst BY_NAME = new Map<string, GestureDescriptor>(\n GESTURE_DESCRIPTORS.map((d) => [d.name, d]),\n);\n\n/** Look up a gesture's descriptor. Throws on an unknown name — callers\n * holding an unvalidated string should gate on `isKnownGestureName` first. */\nexport function getGestureDescriptor(name: GestureName): GestureDescriptor {\n const d = BY_NAME.get(name);\n if (!d) throw new Error(`unknown gesture: ${name}`);\n return d;\n}\n\n/** Whether a string names a gesture the grammar recognizes. */\nexport function isKnownGestureName(name: string): name is GestureName {\n return BY_NAME.has(name);\n}\n","/** All valid keys for a modifier sub-table in a route entry. Canonical\n * order: mod → shift → alt (matches formatShortcut). */\nexport type ModifierCombo =\n | 'default'\n | 'mod' | 'shift' | 'alt'\n | 'mod+shift' | 'mod+alt' | 'shift+alt'\n | 'mod+shift+alt';\n\n/** Convenience: produce the canonical ModifierCombo from modifiers passed\n * in any order. Useful in computed property syntax:\n *\n * ```ts\n * 'rect': {\n * [mods('shift')]: addToSelection,\n * [mods('alt', 'shift')]: cloneAndAdd, // → 'shift+alt'\n * }\n * ```\n */\nexport function mods(\n ...keys: ReadonlyArray<'mod' | 'shift' | 'alt'>\n): ModifierCombo {\n if (keys.length === 0) return 'default';\n const set = new Set(keys);\n return [\n set.has('mod') && 'mod',\n set.has('shift') && 'shift',\n set.has('alt') && 'alt',\n ].filter(Boolean).join('+') as ModifierCombo;\n}\n","/**\n * Route-string grammar v3:\n *\n * route = phaseSlot WS gesture WS argSlot? WS targetSlot? WS modSlot?\n * phaseSlot = '[' phaseList ']'\n * phaseList = phaseAtom (WS ',' WS phaseAtom)*\n * phaseAtom = (channel ':')? phaseValue -- bare phaseValue ≡ '&:phaseValue'\n * channel = '&' | '*' | toolId -- '&' = the binding's own tool\n * phaseValue = 'initial' | 'engaged' | '*'\n * argSlot = '(' argValue ')' -- whitespace inside parens is significant\n * targetSlot = '=>' WS targetValue -- omitted slot defaults to '*' for hasTarget\n * modSlot = modAtom (WS modAtom)*\n * modAtom = sigil (modName | 'held')\n * sigil = '+' | '?' -- ! @ # $ % ^ & * reserved as id-prefix\n * modName = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta'\n *\n * `held` is a pressed button, read as a modifier is: `?held` a button may be\n * held, `+held` one must be, absent none may. Only `hover` takes it.\n *\n * The truly-loose form (any channel, any phase) is `[*:*]`.\n *\n * Examples:\n * [initial] click => empty +shift -- self idle\n * [engaged] wheel -- self mid-gesture\n * [rect:engaged] wheel -- when rect tool is mid-gesture\n * [*:engaged] keyDown(Delete) -- when any tool is mid-gesture\n * [initial,engaged] contextMenu => empty -- either self phase\n * [*] click => empty -- self, any phase\n */\nimport { getGestureDescriptor, isKnownGestureName, type GestureName } from './gestures';\nimport type { RoutePhase } from '../ui/phase';\n\n/** Channel reference for a phase atom. `'&'` = the binding's own tool;\n * `'*'` = any tool; otherwise a registered tool id. */\nexport type ChannelRef = '&' | '*' | string;\n\n/** One element of a phase list: a (channel, phase) pair. The default\n * channel (omitted in the shorthand) is `'&'`. `phase: '*'` means\n * \"any phase of the given channel\". */\nexport interface PhaseAtom {\n channel: ChannelRef;\n phase: RoutePhase | '*';\n}\n\n/** Reserved id-prefix sigils. Tool ids, action ids, channel names, target\n * kinds, and arg values may not start with any of these — keeps the\n * parser unambiguous and reserves single-char prefixes for future grammar\n * extensions. */\nexport const RESERVED_ID_PREFIXES: ReadonlySet<string> = new Set([\n '!', '@', '#', '$', '%', '^', '&', '*',\n]);\n\n/** Reserved bareword channel/id names. These are keywords in the phase\n * slot — a tool may not register with one of these as its id (collides\n * with the bare-phase shorthand). */\nexport const RESERVED_ID_NAMES: ReadonlySet<string> = new Set([\n 'initial', 'engaged',\n]);\n\n/** v3 modifier requirement on a single modifier key. Absent from a\n * `ParsedModifiers` map means \"must not be held\" (the strict default). */\nexport type ModRequirement = 'required' | 'optional';\n\n/** Canonical modifier names accepted in the modSlot, in canonical order. */\nexport const VALID_MOD_NAMES = ['mod', 'shift', 'alt', 'ctrl', 'meta'] as const;\n\n/** A single modifier name accepted in the modSlot. */\nexport type ModifierKey = (typeof VALID_MOD_NAMES)[number];\n\n/** Parsed-form modifiers — structured map; absent keys are implicitly\n * forbidden. Empty object = \"no modifiers held\". */\nexport type ParsedModifiers = Partial<Record<ModifierKey, ModRequirement>>;\n\n/** Reserved sigil characters. The parser rejects any of these with a\n * \"reserved for future use\" error so introducing them later is\n * non-breaking. `*` is NOT in this set — it's the universal wildcard. */\nexport const RESERVED_SIGILS: ReadonlySet<string> = new Set(['!', '@', '#', '$', '%', '^', '&']);\n\n/** Active (parseable) sigils today: `+` required, `?` optional. */\nexport const ACTIVE_SIGILS: ReadonlySet<string> = new Set(['+', '?']);\n\n/** Runtime membership test for {@link ModifierKey}, for validating a modifier\n * name that arrives as a plain string. */\nconst MOD_NAME_SET: ReadonlySet<string> = new Set(VALID_MOD_NAMES);\nexport { MOD_NAME_SET };\n\n/** v3 parsed-route shape. */\nexport interface ParsedRoute {\n /** One or more phase atoms (channel + phase). Empty array is invalid.\n * Bare-phase shorthand in the source string desugars to channel `'&'`,\n * so `[engaged]` parses to `[{ channel: '&', phase: 'engaged' }]`. */\n phases: readonly PhaseAtom[];\n gesture: GestureName;\n /** Resolved arg. For arg-bearing gestures, the descriptor's default\n * fills in when the slot is omitted (e.g. `wheel` → `arg: '*'`).\n * Undefined for gestures whose descriptor has no `arg`. */\n arg: string | undefined;\n /** For hasTarget gestures: target string with `'*'` as the wildcard\n * sentinel. Defaults to `'*'` when the slot is omitted. Undefined for\n * hasTarget=false gestures. */\n target: string | undefined;\n /** Structured modifier requirements; empty map = \"no modifiers held\". */\n modifiers: ParsedModifiers;\n /** Whether a pressed button may or must be held. Absent, none may. Only on\n * `hover`. */\n held?: ModRequirement;\n}\n\n/** Parse a route string into its slots, filling in the shorthand defaults the\n * grammar defines (bare phases mean channel `&`; an omitted arg or target\n * slot takes the gesture descriptor's default). Throws with the offending\n * input on anything the grammar does not accept, including sigils reserved\n * for later versions. */\nexport function parseRoute(input: string): ParsedRoute {\n // 1) Extract bracketed phaseSlot from the head.\n const trimmed = input.trim();\n if (!trimmed.startsWith('[')) {\n throw new Error(`invalid route (phase brackets required): ${input}`);\n }\n const closeIdx = trimmed.indexOf(']');\n if (closeIdx < 0) throw new Error(`invalid route (unclosed phase bracket): ${input}`);\n const phaseListRaw = trimmed.slice(1, closeIdx).trim();\n const phases = parsePhaseList(phaseListRaw, input);\n let rest = trimmed.slice(closeIdx + 1).trim();\n\n // 2) Pull off the gesture name (alphanumeric).\n const gestureMatch = /^([A-Za-z]+)/.exec(rest);\n if (!gestureMatch) throw new Error(`invalid route (no gesture name): ${input}`);\n const gestureName = gestureMatch[1]!;\n if (!isKnownGestureName(gestureName)) {\n throw new Error(`invalid route (unknown gesture \"${gestureName}\"): ${input}`);\n }\n rest = rest.slice(gestureMatch[0].length).trimStart();\n const desc = getGestureDescriptor(gestureName);\n\n // 3) Optional argSlot: `(...)`. Whitespace inside parens is significant.\n let arg: string | undefined;\n if (rest.startsWith('(')) {\n const closeArg = rest.indexOf(')');\n if (closeArg < 0) throw new Error(`invalid route (unbalanced arg parens): ${input}`);\n const argRaw = rest.slice(1, closeArg); // no trim — whitespace significant\n if (!desc.arg) throw new Error(`invalid route (${gestureName} has no arg): ${input}`);\n if (argRaw !== '*' && desc.arg.values !== 'free' && !desc.arg.values.includes(argRaw)) {\n throw new Error(`invalid route (\"${argRaw}\" not in ${desc.arg.values.join('|')}): ${input}`);\n }\n arg = argRaw;\n rest = rest.slice(closeArg + 1).trimStart();\n } else if (desc.arg) {\n arg = desc.arg.default ?? '*';\n }\n\n // 4) Optional targetSlot: `=> <target>`. Elided \"=> *\" defaults to '*' for hasTarget gestures.\n let target: string | undefined;\n if (rest.startsWith('=>')) {\n if (!desc.hasTarget) throw new Error(`invalid route (${gestureName} has no target): ${input}`);\n rest = rest.slice(2).trimStart();\n const tgtMatch = /^([^\\s+?!@#$%^&]+)/.exec(rest);\n if (!tgtMatch) throw new Error(`invalid route (missing target after \"=>\"): ${input}`);\n target = tgtMatch[1]!;\n rest = rest.slice(tgtMatch[0].length).trimStart();\n } else if (desc.hasTarget) {\n target = '*';\n }\n\n // 5) modSlot — zero or more sigil-prefixed atoms.\n const modifiers: ParsedModifiers = {};\n let held: ModRequirement | undefined;\n while (rest.length > 0) {\n const ch = rest[0]!;\n if (RESERVED_SIGILS.has(ch)) {\n throw new Error(`invalid route (\"${ch}\" is reserved for future use): ${input}`);\n }\n if (!ACTIVE_SIGILS.has(ch)) {\n throw new Error(`invalid route (unexpected \"${ch}\" at \"${rest}\"): ${input}`);\n }\n const sigil = ch;\n rest = rest.slice(1);\n const nameMatch = /^([a-z]+)/.exec(rest);\n if (!nameMatch) throw new Error(`invalid route (sigil \"${sigil}\" without modifier name): ${input}`);\n const name = nameMatch[1]!;\n if (name === HELD) {\n if (gestureName !== 'hover') throw new Error(`invalid route (${gestureName} takes no \"${HELD}\"): ${input}`);\n if (held !== undefined) throw new Error(`invalid route (duplicate \"${HELD}\"): ${input}`);\n held = sigil === '+' ? 'required' : 'optional';\n rest = rest.slice(nameMatch[0].length).trimStart();\n continue;\n }\n if (!MOD_NAME_SET.has(name)) {\n throw new Error(`invalid route (unknown modifier \"${name}\"): ${input}`);\n }\n if (modifiers[name as ModifierKey] !== undefined) {\n throw new Error(`invalid route (duplicate modifier \"${name}\"): ${input}`);\n }\n modifiers[name as ModifierKey] = sigil === '+' ? 'required' : 'optional';\n rest = rest.slice(nameMatch[0].length).trimStart();\n }\n\n return { phases, gesture: gestureName, arg, target, modifiers, ...(held ? { held } : {}) };\n}\n\n/** The modSlot atom for a pressed button. */\nconst HELD = 'held';\n\nfunction parsePhaseList(raw: string, input: string): readonly PhaseAtom[] {\n if (raw === '') throw new Error(`invalid route (empty phase list): ${input}`);\n const tokens = raw.split(',').map((p) => p.trim()).filter((p) => p.length > 0);\n if (tokens.length === 0) throw new Error(`invalid route (empty phase list): ${input}`);\n return tokens.map((t) => parsePhaseAtom(t, input));\n}\n\nconst VALID_PHASES: ReadonlySet<string> = new Set(['initial', 'engaged', '*']);\n\nfunction parsePhaseAtom(raw: string, input: string): PhaseAtom {\n // Split on the channel/phase separator. `parts.length === 1` is the\n // bare-phase shorthand (channel defaults to '&').\n const parts = raw.split(':');\n if (parts.length > 2) {\n throw new Error(`invalid route (phase atom \"${raw}\" has multiple \":\"): ${input}`);\n }\n if (parts.length === 1) {\n const phase = parts[0]!;\n if (!VALID_PHASES.has(phase)) {\n throw new Error(`invalid route (unknown phase \"${phase}\" in \"${raw}\"): ${input}`);\n }\n return { channel: '&', phase: phase as PhaseAtom['phase'] };\n }\n // parts.length === 2 — explicit channel:phase form.\n const channel = parts[0]!;\n const phase = parts[1]!;\n if (channel === '') {\n throw new Error(`invalid route (empty channel before \":\" in \"${raw}\"): ${input}`);\n }\n if (!VALID_PHASES.has(phase)) {\n throw new Error(`invalid route (unknown phase \"${phase}\" in \"${raw}\"): ${input}`);\n }\n if (channel !== '&' && channel !== '*') {\n if (RESERVED_ID_NAMES.has(channel)) {\n throw new Error(`invalid route (channel \"${channel}\" is a reserved phase keyword): ${input}`);\n }\n if (RESERVED_ID_PREFIXES.has(channel[0]!)) {\n throw new Error(`invalid route (channel \"${channel}\" starts with reserved sigil \"${channel[0]}\"): ${input}`);\n }\n }\n return { channel, phase: phase as PhaseAtom['phase'] };\n}\n\n/** Render a single phase atom in canonical shorthand form. `&` channel\n * is elided (\"`engaged`\", \"`*`\"); other channels use the explicit\n * `channel:phase` form (\"`rect:engaged`\", \"`*:*`\"). */\nexport function formatPhaseAtom(a: PhaseAtom): string {\n if (a.channel === '&') return a.phase;\n return `${a.channel}:${a.phase}`;\n}\n\n/** Visual-collapse pass: given a list of route strings, fold pairs that\n * differ ONLY in `shift` presence (one has `+shift`, the other doesn't,\n * everything else identical) into a single route with `?shift`.\n *\n * Preserves input order — the first member of each fold-pair holds the\n * position; the second is dropped. Does NOT fold other modifier\n * pairs (alt/ctrl/meta/mod) — those tend to carry meaning across the\n * same key.\n */\nexport function collapseShiftPairs(routes: readonly string[]): string[] {\n if (routes.length < 2) return [...routes];\n const parsed = routes.map((r) => ({ raw: r, p: parseRoute(r) }));\n const consumed = new Set<number>();\n const out: string[] = [];\n for (let i = 0; i < parsed.length; i++) {\n if (consumed.has(i)) continue;\n const a = parsed[i]!;\n // Look ahead for a twin: same gesture/arg/target/phases/mods-except-shift.\n let twinIndex = -1;\n for (let j = i + 1; j < parsed.length; j++) {\n if (consumed.has(j)) continue;\n const b = parsed[j]!;\n if (isShiftTwin(a.p, b.p)) { twinIndex = j; break; }\n }\n if (twinIndex < 0) { out.push(a.raw); continue; }\n consumed.add(twinIndex);\n // Emit the union with shift marked optional.\n const folded: ParsedRoute = {\n ...a.p,\n modifiers: { ...withoutShift(a.p.modifiers), shift: 'optional' },\n };\n out.push(formatRoute(folded));\n }\n return out;\n}\n\nfunction isShiftTwin(a: ParsedRoute, b: ParsedRoute): boolean {\n if (a.gesture !== b.gesture) return false;\n if (a.held !== b.held) return false;\n if (a.arg !== b.arg) return false;\n if (a.target !== b.target) return false;\n if (!samePhases(a.phases, b.phases)) return false;\n // Exactly one must have shift required; the other must lack shift.\n const aShift = a.modifiers.shift;\n const bShift = b.modifiers.shift;\n const aHas = aShift === 'required';\n const bHas = bShift === 'required';\n if (!(aHas !== bHas)) return false; // one and only one has shift\n if (aShift === 'optional' || bShift === 'optional') return false; // already optional\n // Every other modifier must match exactly.\n for (const name of VALID_MOD_NAMES) {\n if (name === 'shift') continue;\n if (a.modifiers[name] !== b.modifiers[name]) return false;\n }\n return true;\n}\n\nfunction samePhases(\n a: readonly PhaseAtom[],\n b: readonly PhaseAtom[],\n): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i]!.channel !== b[i]!.channel || a[i]!.phase !== b[i]!.phase) return false;\n }\n return true;\n}\n\nfunction withoutShift(m: ParsedModifiers): ParsedModifiers {\n const { shift: _shift, ...rest } = m;\n void _shift;\n return rest;\n}\n\nconst MOD_ORDER: readonly ModifierKey[] = ['mod', 'shift', 'alt', 'ctrl', 'meta'];\n\n/** Render a parsed route back to a canonical route string: shorthand where\n * the grammar has it, defaulted slots elided, modifiers in canonical order.\n * `parseRoute(formatRoute(r))` yields `r` again. */\nexport function formatRoute(r: ParsedRoute): string {\n const desc = getGestureDescriptor(r.gesture);\n\n // Phase slot — comma-separated atoms in source order; canonical\n // shorthand per atom (`&:engaged` → `engaged`, etc.).\n const phaseStr = `[${r.phases.map(formatPhaseAtom).join(',')}]`;\n\n let out = `${phaseStr} ${r.gesture}`;\n\n // Arg slot — elide the value an omitted slot would parse back to. A\n // descriptor with no declared default takes '*', same as the target slot.\n if (desc.arg && r.arg !== undefined && r.arg !== (desc.arg.default ?? '*')) {\n out += `(${r.arg})`;\n }\n\n // Target slot — elide \"*\" (wildcard default for hasTarget gestures).\n if (desc.hasTarget && r.target !== undefined && r.target !== '*') {\n out += ` => ${r.target}`;\n }\n\n // Mod atoms in canonical order, space-separated.\n for (const name of MOD_ORDER) {\n const req = r.modifiers[name];\n if (req === 'required') out += ` +${name}`;\n else if (req === 'optional') out += ` ?${name}`;\n }\n if (r.held === 'required') out += ` +${HELD}`;\n else if (r.held === 'optional') out += ` ?${HELD}`;\n\n return out;\n}\n","/**\n * Mini-grammar for the `arg` slot of `keyDown` / `keyUp` routes.\n *\n * keyRoute = key ('?' optionalMod)*\n * optionalMod = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta'\n *\n * `?shift` means \"shift may or may not be held; either fires this route.\"\n * Required modifiers still belong in the route's `:modifiers` slot — this\n * grammar only widens which events match, never narrows.\n */\nimport type { KeySpec, ModSpec } from '../ui/spec';\nimport { VALID_MOD_NAMES, type ModifierKey } from './routeGrammar';\n\n/** An optional modifier in a key route — the same set as the canonical\n * {@link ModifierKey}. */\nexport type OptionalMod = ModifierKey;\nconst OPTIONAL_SET = new Set<string>(VALID_MOD_NAMES);\n\n/** A key route split into the key itself and the modifiers whose state does\n * not affect the match. */\nexport interface ParsedKeyRoute {\n key: string;\n optionalMods: readonly OptionalMod[];\n}\n\n/** Parse the `arg` slot of a `keyDown` / `keyUp` route. Throws on an empty\n * key, an unrecognized optional modifier, or a repeated one. */\nexport function parseKeyRoute(input: string): ParsedKeyRoute {\n const [key, ...mods] = input.split('?');\n if (!key) throw new Error(`invalid key route (empty key): ${input}`);\n const seen = new Set<string>();\n for (const m of mods) {\n if (!OPTIONAL_SET.has(m)) throw new Error(`unknown optional modifier \"${m}\" in ${input}`);\n if (seen.has(m)) throw new Error(`duplicate optional modifier \"${m}\" in ${input}`);\n seen.add(m);\n }\n return { key, optionalMods: mods as OptionalMod[] };\n}\n\n/** Render a parsed key route back to its canonical source form. Round-trips\n * with `parseKeyRoute`. */\nexport function formatKeyRoute(r: ParsedKeyRoute): string {\n return r.optionalMods.length === 0 ? r.key : `${r.key}?${r.optionalMods.join('?')}`;\n}\n\n/** Build a runtime KeySpec from a parsed key route. Each optional modifier\n * becomes `mods.<name>: 'optional'`. The matcher's `matchModifiers`\n * honors `'optional'` uniformly across `mod`, `shift`, `alt`, `ctrl`,\n * and `meta`. */\nexport function keyRouteToSpec(r: ParsedKeyRoute): KeySpec {\n const mods: ModSpec = {};\n for (const m of r.optionalMods) mods[m] = 'optional';\n const spec: KeySpec = { kind: 'key', key: r.key };\n if (Object.keys(mods).length > 0) spec.mods = mods;\n return spec;\n}\n","/** Which external content a `drop` or `paste` spec's MIME globs let through. */\n\n/** MIME-glob match: `'image/*'` prefix-matches the major type; anything\n * else is an exact (case-insensitive) match; bare `'*'` or `'*\\/*'` matches all. */\nexport function mimeMatchesGlob(mime: string, glob: string): boolean {\n const m = mime.toLowerCase();\n const g = glob.toLowerCase();\n if (g === '*' || g === '*/*') return true;\n if (g.endsWith('/*')) return m.startsWith(g.slice(0, -1));\n return m === g;\n}\n\n/** The MIME of an item whose type is not known yet: a file hovering in an OS\n * drag, which some browsers do not name until it is dropped. */\nexport const UNKNOWN_MIME = '*/*';\n\n/** True if ANY item's MIME matches ANY of the `types` globs.\n * `types: []` (empty) ≡ omitted = match any. An item of\n * {@link UNKNOWN_MIME} passes every glob. */\nexport function matchIngestTypes(\n items: readonly { mime: string }[],\n types: string[] | undefined,\n): boolean {\n if (!types || types.length === 0) return true;\n return items.some((it) => it.mime === UNKNOWN_MIME || types.some((g) => mimeMatchesGlob(it.mime, g)));\n}\n","/** Target matching: a `TargetSpec` against what an event classified under its point. */\n\nimport type { TargetSpec, TargetPredicate } from './spec';\n\n/** Read a `.kind` string off an affordance hit, or `undefined` when the hit\n * is absent or shaped differently. */\nfunction affordanceKindOf(target: unknown): string | undefined {\n if (typeof target !== 'object' || target === null) return undefined;\n const k = (target as { kind?: unknown }).kind;\n return typeof k === 'string' ? k : undefined;\n}\n\n/**\n * A {@link TargetSpec} resolved to its form, with the parts each form encodes\n * in its string pulled out. This is the one enumeration of the target forms:\n * sites that act on it switch on `form` exhaustively rather than re-deriving\n * the prefixes.\n */\nexport type TargetSpecForm =\n | { form: 'body'; body: 'empty' | 'selected-body' | 'unselected-body' }\n | { form: 'kind'; kind: string; requireSelected: boolean }\n | { form: 'affordance'; kind: string }\n | { form: 'predicate'; kindOf: TargetPredicate };\n\nfunction hasPrefix<P extends string>(s: string, prefix: P): s is `${P}${string}` {\n return s.startsWith(prefix);\n}\n\n/**\n * Resolve a `TargetSpec` to its {@link TargetSpecForm}.\n *\n * `null` means the value is no form this build knows — junk from an untyped\n * consumer, or a spec authored against a newer kit. Every caller treats it as\n * no-match rather than a wildcard.\n */\nexport function parseTargetSpec(spec: TargetSpec): TargetSpecForm | null {\n if (typeof spec === 'object') {\n return spec !== null && typeof spec.kindOf === 'function'\n ? { form: 'predicate', kindOf: spec.kindOf }\n : null;\n }\n if (typeof spec !== 'string') return null;\n if (spec === 'empty' || spec === 'selected-body' || spec === 'unselected-body') {\n return { form: 'body', body: spec };\n }\n if (hasPrefix(spec, 'affordance:')) {\n return { form: 'affordance', kind: spec.slice('affordance:'.length) };\n }\n // `:selected` is only a suffix when it is the LAST segment — `kind:app:note`\n // names a kind that happens to contain a colon.\n if (hasPrefix(spec, 'kind:')) {\n const rest = spec.slice('kind:'.length);\n const requireSelected = rest.endsWith(':selected');\n return {\n form: 'kind',\n kind: requireSelected ? rest.slice(0, -':selected'.length) : rest,\n requireSelected,\n };\n }\n const _exhaustive: never = spec;\n void _exhaustive;\n return null;\n}\n\n/**\n * Match a target value + event against a TargetSpec.\n *\n * - `{ kindOf: predicate }` — calls the predicate with the affordance hit and\n * the `bodyTarget` string.\n * - `'empty'`, `'selected-body'`, `'unselected-body'` — compared against\n * `bodyTarget` on the event.\n * - `kind:<k>` — compared against `bodyKind`, the *semantic* kind of the node\n * body under the point (`'text'`, `'rect'`, an app's own `'app:note'`).\n * Selection-agnostic.\n * - `kind:<k>:selected` — the same, and additionally requires the body to be\n * in the current selection. Only the final `:selected` is a suffix, so a\n * kind may itself contain colons.\n * - `affordance:<k>` — exact match against the affordance hit's own `kind`.\n * Kit affordance kinds are `handle:<corner>`, `'rotate-handle'`,\n * `anchor:<i>`, `controlIn:<i>` / `controlOut:<i>`, and `layer:<id>` for a\n * registered layer's widget. The match is exact and includes any parameter,\n * so \"any anchor\" needs the `isAnchor` predicate rather than this form.\n * - `undefined` spec.target — any target is accepted.\n *\n * Every string form resolves to `false` when the field it reads is absent, so\n * an unwired `classifyTarget`/`affordanceAt` yields no-match rather than a\n * silent wildcard.\n */\nexport function matchTarget(\n target: unknown,\n specTarget: TargetSpec | undefined,\n bodyTarget?: string,\n bodyKind?: string,\n): boolean {\n if (specTarget === undefined) return true;\n const form = parseTargetSpec(specTarget);\n if (form === null) return false;\n\n switch (form.form) {\n // Receives the affordance hit plus the bodyTarget classification.\n case 'predicate':\n return form.kindOf(target, bodyTarget);\n\n // Resolved from the `classifyTarget` result packed into the event's\n // `bodyTarget`. Unwired classifyTarget → absent → no match.\n case 'body':\n return bodyTarget !== undefined && bodyTarget === form.body;\n\n case 'affordance':\n return affordanceKindOf(target) === form.kind;\n\n case 'kind':\n if (bodyKind === undefined || bodyKind !== form.kind) return false;\n return form.requireSelected ? bodyTarget === 'selected-body' : true;\n\n default: {\n // Exhaustiveness guard — new target forms are a compile error here.\n const _exhaustive: never = form;\n void _exhaustive;\n return false;\n }\n }\n}\n","/** Pure gesture matcher — no React, no state, no DOM. */\n\nimport type { CarrySpec, DropSpec, GestureSpec, ModSpec, PasteSpec, PhaseSpec } from './spec';\nimport type { InputEvent } from './inputEvent';\nimport type { PhaseAtom } from '../grammar/routeGrammar';\nimport { matchIngestTypes } from './ingestTypes';\nimport { matchTarget } from './matchTarget';\n\nexport { matchTarget, parseTargetSpec } from './matchTarget';\nexport type { TargetSpecForm } from './matchTarget';\n\n/** The modifier-state fields `matchModifiers` reads. Structural, so a DOM\n * `KeyboardEvent` or `PointerEvent` satisfies it directly. */\nexport type ModifiersEvent = { altKey: boolean; ctrlKey: boolean; metaKey: boolean; shiftKey: boolean };\n\ntype KeyRequirement = 'required' | 'forbidden' | 'optional';\n\nfunction resolveSpecValue(value: boolean | 'optional' | undefined): KeyRequirement {\n if (value === true) return 'required';\n if (value === 'optional') return 'optional';\n return 'forbidden';\n}\n\n/**\n * Strict modifier match.\n *\n * - Omitted or `false`: MUST NOT be held.\n * - `true`: MUST be held.\n * - `'optional'`: accepts either held or unheld.\n * - `mod` is platform-aware: matches `metaKey` on mac, `ctrlKey` elsewhere,\n * and the *other* platform key is forbidden. Callers should not combine\n * `mod` with `meta`/`ctrl`.\n */\nexport function matchModifiers(\n e: ModifiersEvent,\n mods: ModSpec | undefined,\n isMac: boolean,\n): boolean {\n // Start strict: every modifier is forbidden unless the spec opts in.\n let alt: KeyRequirement = 'forbidden';\n let ctrl: KeyRequirement = 'forbidden';\n let meta: KeyRequirement = 'forbidden';\n let shift: KeyRequirement = 'forbidden';\n\n if (mods) {\n alt = resolveSpecValue(mods.alt);\n shift = resolveSpecValue(mods.shift);\n\n // mod: platform-aware shorthand. Resolves to meta on mac, ctrl elsewhere.\n // The *other* platform key stays forbidden (handled by the strict default).\n if (mods.mod !== undefined) {\n const modReq = resolveSpecValue(mods.mod);\n if (isMac) meta = modReq;\n else ctrl = modReq;\n } else {\n meta = resolveSpecValue(mods.meta);\n ctrl = resolveSpecValue(mods.ctrl);\n }\n }\n\n return (\n checkKey(alt, e.altKey) &&\n checkKey(ctrl, e.ctrlKey) &&\n checkKey(meta, e.metaKey) &&\n checkKey(shift, e.shiftKey)\n );\n}\n\nfunction checkKey(req: KeyRequirement, held: boolean): boolean {\n if (req === 'required') return held;\n if (req === 'forbidden') return !held;\n return true;\n}\n\n/** Case-insensitive key match; supports string or string[] (any-of). */\nexport function matchKey(eventKey: string, specKey: string | string[]): boolean {\n const lower = eventKey.toLowerCase();\n if (Array.isArray(specKey)) {\n return specKey.some((k) => k.toLowerCase() === lower);\n }\n return specKey.toLowerCase() === lower;\n}\n\n/** A key event against a key spec: by `code` first when the spec names one,\n * then by `key`. Either is enough. */\nfunction matchKeyOrCode(\n e: { key: string; code?: string },\n spec: { key: string | string[]; code?: string | string[] },\n): boolean {\n if (spec.code !== undefined && e.code !== undefined && [spec.code].flat().includes(e.code)) return true;\n return matchKey(e.key, spec.key);\n}\n\n/** Per-tool gesture-lifecycle state at match time. `selfChannel` is the tool\n * id `'&'` resolves to — the tool that owns the binding being evaluated — or\n * `null` for a binding without an owning tool, in which case no `'&'` atom\n * can match. `engagedChannels` is the set of tool ids that currently have an\n * in-flight handle. */\nexport interface PhaseContext {\n selfChannel: string | null;\n engagedChannels: ReadonlySet<string>;\n}\n\n/** Normalize the `PhaseSpec` shorthand to an atom array.\n * Bare keywords desugar to a single `'&'`-channel atom. */\nfunction normalizePhase(spec: PhaseSpec): readonly PhaseAtom[] {\n if (typeof spec === 'string') {\n return [{ channel: '&', phase: spec }];\n }\n return spec;\n}\n\n/** True if the binding's `phase` spec is satisfied by the current\n * per-tool engagement state. Omitted spec → always true (no phase\n * constraint). Union semantics: a phase atom list matches when ANY\n * atom matches. */\nexport function matchPhase(spec: PhaseSpec | undefined, ctx: PhaseContext): boolean {\n if (spec === undefined) return true;\n const atoms = normalizePhase(spec);\n if (atoms.length === 0) return true;\n for (const a of atoms) {\n if (matchPhaseAtom(a, ctx)) return true;\n }\n return false;\n}\n\nfunction matchPhaseAtom(a: PhaseAtom, ctx: PhaseContext): boolean {\n if (a.channel === '*') {\n // Any-channel sentinel: 'engaged' matches when any channel is engaged;\n // 'initial' matches when none are; '*' matches both.\n if (a.phase === '*') return true;\n const anyEngaged = ctx.engagedChannels.size > 0;\n return a.phase === 'engaged' ? anyEngaged : !anyEngaged;\n }\n // Resolve '&' to the binding's owning tool. Without an owner, '&' atoms\n // can't match (correct: ambient actions don't have a \"self\").\n const id = a.channel === '&' ? ctx.selfChannel : a.channel;\n if (id == null) return false;\n if (a.phase === '*') return true;\n const isEngaged = ctx.engagedChannels.has(id);\n return a.phase === 'engaged' ? isEngaged : !isEngaged;\n}\n\n/**\n * Match a `drag` or `pointerDown` spec, both of which fire on pointerdown.\n *\n * One physical press is dispatched twice: eagerly at `stage: 'press'`, and\n * again from the buffer once the drag threshold releases it. Each kind takes\n * exactly one of the two.\n */\nfunction matchPress(\n e: InputEvent,\n spec: Extract<GestureSpec, { kind: 'drag' | 'pointerDown' }>,\n isMac: boolean,\n): boolean {\n if (e.kind !== 'pointerdown') return false;\n if (spec.kind === 'drag') {\n // Drag begins at pointerdown; the dispatcher promotes to drag after\n // threshold is crossed. Without this gate the eager dispatch would open\n // the press's drag handle a second time.\n if (e.stage === 'press') return false;\n } else if (e.stage !== 'press') {\n return false;\n }\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n // Pass the affordance hit as the `target` for `kindOf` predicates.\n // Pass `bodyTarget` for string-form TargetSpec values.\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n}\n\n/**\n * Match a single GestureSpec against an InputEvent.\n *\n * For `key-held`, only `phase: 'down'` returns true. The dispatcher tracks the\n * held state independently and handles `phase: 'up'` itself.\n */\nexport function matchSpec(\n e: InputEvent,\n spec: GestureSpec,\n isMac: boolean,\n phaseCtx?: PhaseContext,\n): boolean {\n // With no phase ctx nothing is engaged and the spec has no owner: an\n // any-channel `initial` matches, and an own-channel (`&`) atom cannot.\n if (spec.phase !== undefined) {\n const ctx: PhaseContext = phaseCtx ?? { selfChannel: null, engagedChannels: EMPTY_ENGAGED };\n if (!matchPhase(spec.phase, ctx)) return false;\n }\n\n switch (spec.kind) {\n case 'key': {\n if (e.kind !== 'key') return false;\n if (!matchKeyOrCode(e, spec)) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'key-held': {\n if (e.kind !== 'key-held') return false;\n if (e.phase !== 'down') return false; // only match the down phase\n if (!matchKeyOrCode(e, spec)) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'wheel': {\n if (e.kind !== 'wheel') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n const direction = spec.direction ?? '*';\n if (direction === 'up' && !(e.deltaY < 0)) return false;\n if (direction === 'down' && !(e.deltaY > 0)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'pinch': {\n if (e.kind !== 'pinch') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n const direction = spec.direction ?? '*';\n if (direction === 'out' && !(e.scale > 1)) return false;\n if (direction === 'in' && !(e.scale < 1)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'click': {\n if (e.kind !== 'click') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n // A `kindOf` predicate gets the affordance the press landed on — the\n // same value it would get on a drag — NOT the DOM target, which is what\n // lets `hit == null` mean \"not chrome\".\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'doubleClick': {\n if (e.kind !== 'doubleclick') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n // Each happens at a point, so its target is what the event classified\n // there: for a long-press, the affordance its press landed on.\n case 'contextMenu':\n case 'longPress': {\n if (e.kind !== 'contextmenu' && e.kind !== 'longpress') return false;\n if (e.kind !== spec.kind.toLowerCase()) return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'hover': {\n if (e.kind !== 'hover') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n if (!e.off && (e.held === true ? spec.held === undefined : spec.held === true)) return false;\n const on = !e.off && matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n if (spec.motion !== 'leave') return on;\n return !on && e.from !== undefined && matchTarget(e.from.affordance, spec.target, e.from.bodyTarget, e.from.bodyKind);\n }\n\n case 'drag':\n case 'pointerDown':\n return matchPress(e, spec, isMac);\n\n case 'multiTouch': {\n if (e.kind !== 'multitouch') return false;\n if (e.fingers !== spec.fingers) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'multiTouchTap': {\n if (e.kind !== 'multitouchtap') return false;\n if (e.fingers !== spec.fingers) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'drop':\n case 'carry':\n case 'paste':\n return matchArrival(e, spec, isMac);\n\n default: {\n // Exhaustiveness guard — new spec kinds are a compile error here.\n const _exhaustive: never = spec;\n void _exhaustive;\n return false;\n }\n }\n}\n\n/** Content arriving from off the surface: an OS drop, a paste, or a carry. A\n * carry starts as it comes over and, if nothing took it then, may still be\n * taken on release; its leave belongs to the handle in flight. A move with\n * none in flight is offered to a spec with a target, which waits for the\n * carry to reach it. */\nfunction matchArrival(e: InputEvent, spec: DropSpec | CarrySpec | PasteSpec, isMac: boolean): boolean {\n if (e.kind !== spec.kind) return false;\n if (e.kind === 'carry') {\n const target = 'target' in spec ? spec.target : undefined;\n if (e.stage === 'leave' || (e.stage === 'move' && target === undefined)) return false;\n if (!matchIngestTypes([{ mime: e.type }], spec.types)) return false;\n if (!matchTarget(e.affordance, target, e.bodyTarget, e.bodyKind)) return false;\n } else if (e.kind === 'drop' || e.kind === 'paste') {\n if (!matchIngestTypes(e.items, spec.types)) return false;\n }\n return matchModifiers(e, spec.mods, isMac);\n}\n\nconst EMPTY_ENGAGED: ReadonlySet<string> = new Set();\n","import type { GestureSpec } from '../ui/spec';\nimport type { GestureName } from './gestures';\n\ntype SpecKind = GestureSpec['kind'];\n\n/** `GestureSpec.kind` → route-grammar gesture name. `keyUp` has no spec\n * kind, so the reverse direction is not total. */\nconst SPEC_KIND_TO_GESTURE: Record<SpecKind, GestureName | undefined> = {\n key: 'keyDown',\n 'key-held': 'keyHeld',\n wheel: 'wheel',\n pinch: 'pinch',\n click: 'click',\n doubleClick: 'dblTap',\n contextMenu: 'contextMenu',\n longPress: 'longPress',\n drag: 'drag',\n pointerDown: 'pointerDown',\n hover: 'hover',\n multiTouch: 'multiTouch',\n multiTouchTap: 'multiTouchTap',\n drop: 'drop',\n carry: 'carry',\n paste: 'paste',\n};\n\nconst GESTURE_TO_SPEC_KIND = new Map<GestureName, SpecKind>(\n (Object.entries(SPEC_KIND_TO_GESTURE) as [SpecKind, GestureName | undefined][])\n .filter((e): e is [SpecKind, GestureName] => e[1] !== undefined)\n .map(([kind, gesture]) => [gesture, kind]),\n);\n\n/** The route-grammar gesture a `GestureSpec.kind` routes as, or `undefined`\n * for a kind the grammar has no name for. */\nexport function routeGestureForSpecKind(kind: SpecKind): GestureName | undefined {\n return SPEC_KIND_TO_GESTURE[kind];\n}\n\n/** The `GestureSpec.kind` a route-grammar gesture is written as, or\n * `undefined` for a gesture no spec can express. */\nexport function specKindForRouteGesture(gesture: GestureName): SpecKind | undefined {\n return GESTURE_TO_SPEC_KIND.get(gesture);\n}\n","import type { GestureSpec, ModSpec, PhaseSpec, TargetSpec } from '../ui/spec';\nimport { parseTargetSpec } from '../ui/match';\nimport { formatRoute, type ParsedRoute } from './routeGrammar';\nimport { parseKeyRoute } from './keyRouteGrammar';\nimport { specKindForRouteGesture } from './specKinds';\n\n/**\n * Build the `GestureSpec` a parsed route describes, so a route string can\n * drive `matchSpec` and `specificity` directly.\n *\n * Wildcards become omitted fields: a `*` target, direction or MIME list, and a\n * `[*:*]` phase slot. `[*]` is `[&:*]`, which an ambient binding never\n * matches, so it stays a phase atom. A `keyDown` / `keyHeld` arg is read as a\n * key route, so `keyDown(z?shift)` yields `mods.shift: 'optional'`; a drop, carry, or\n * paste arg is a `|`-separated MIME list.\n *\n * Throws on a route no spec can express: `keyUp`, a key or finger-count\n * wildcard, or a target that is not a `TargetSpec` form.\n */\nexport function routeToSpec(parsed: ParsedRoute): GestureSpec {\n const fail = (why: string): never => {\n throw new Error(`routeToSpec: ${why}: ${formatRoute(parsed)}`);\n };\n const arg = parsed.arg === '*' ? undefined : parsed.arg;\n\n const mods: ModSpec = {};\n for (const [name, req] of Object.entries(parsed.modifiers)) {\n mods[name as keyof ModSpec] = req === 'required' ? true : 'optional';\n }\n\n const common: { mods?: ModSpec; phase?: PhaseSpec } = {};\n const isUnconstrained = parsed.phases.length === 1\n && parsed.phases[0]!.channel === '*' && parsed.phases[0]!.phase === '*';\n if (!isUnconstrained) common.phase = parsed.phases;\n\n const withMods = <S extends GestureSpec>(spec: S): S => {\n const extra = spec.mods;\n const merged = { ...mods, ...extra };\n const out = { ...spec, ...common };\n if (Object.keys(merged).length > 0) out.mods = merged;\n return out;\n };\n\n let target: TargetSpec | undefined;\n if (parsed.target !== undefined && parsed.target !== '*') {\n if (parseTargetSpec(parsed.target as TargetSpec) === null) {\n fail(`\"${parsed.target}\" is not a target form`);\n }\n target = parsed.target as TargetSpec;\n }\n const t = target === undefined ? {} : { target };\n\n const kind = specKindForRouteGesture(parsed.gesture);\n switch (kind) {\n case undefined:\n return fail(`${parsed.gesture} has no GestureSpec kind`);\n case 'hover':\n return withMods({\n kind,\n ...(arg === 'leave' ? { motion: 'leave' as const } : {}),\n ...(parsed.held ? { held: parsed.held === 'required' ? (true as const) : ('optional' as const) } : {}),\n ...t,\n });\n case 'click':\n case 'pointerDown':\n case 'doubleClick':\n case 'drag':\n case 'contextMenu':\n case 'longPress':\n return withMods({ kind, ...t });\n case 'wheel':\n return withMods({ kind, ...(arg ? { direction: arg as 'up' | 'down' } : {}), ...t });\n case 'pinch':\n return withMods({ kind, ...(arg ? { direction: arg as 'in' | 'out' } : {}), ...t });\n case 'key':\n case 'key-held': {\n if (arg === undefined) return fail('a key spec needs a concrete key');\n const { key, optionalMods } = parseKeyRoute(arg);\n const optional: ModSpec = {};\n for (const m of optionalMods) optional[m] = 'optional';\n return withMods({ kind, key, ...(optionalMods.length > 0 ? { mods: optional } : {}) });\n }\n case 'multiTouch':\n case 'multiTouchTap':\n if (arg === undefined) return fail(`a ${kind} spec needs concrete fingers`);\n return withMods({ kind, fingers: Number(arg) });\n case 'carry':\n return withMods({ kind, ...(arg ? { types: arg.split('|') } : {}), ...t });\n case 'drop':\n case 'paste':\n return withMods({ kind, ...(arg ? { types: arg.split('|') } : {}) });\n }\n}\n","import { getGestureDescriptor, type GestureName } from './gestures';\nimport type { ParsedRoute, PhaseAtom, ParsedModifiers, ModifierKey } from './routeGrammar';\n\nconst MOD_NAMES: Record<ModifierKey, string> = {\n mod: 'Mod', shift: 'Shift', alt: 'Alt', ctrl: 'Ctrl', meta: 'Meta',\n};\nconst MOD_ORDER: readonly ModifierKey[] = ['mod', 'shift', 'alt', 'ctrl', 'meta'];\n\n/** Glossary for route-vocabulary terms surfaced by `describeRouteParts`.\n * Exposed so docs / inspector UIs can render the same definitions. */\nexport const ROUTE_TERMS = {\n idle: 'Not in the middle of a drag or other synchronous operation.',\n 'mid-gesture': 'In the middle of a drag or other synchronous operation.',\n} as const;\n\n/** Per-field explanations for the slots of a parsed route. Exposed so\n * inspector UIs / docs can describe what each setting in a route table\n * means without duplicating prose. */\nexport const ROUTE_FIELD_DEFINITIONS = {\n phases: 'Which lifecycle stage(s) a channel must be in for this route to fire. `initial` = the channel is idle; `engaged` = the channel is mid-gesture. The channel is the binding\\'s own tool (`&`), any tool (`*`), or a named tool id.',\n gesture: 'The class of input event that triggers this route — click, drag, double-tap, keyDown/keyUp, wheel, pinch, contextMenu, multiTouch, multiTouchTap, drop, or paste.',\n arg: 'Sub-class of the gesture. Direction for wheel (up / down / *) and pinch (in / out / *), key name for keyDown / keyUp, finger count for multiTouch / multiTouchTap, MIME glob for drop / paste. Other gestures have no arg slot.',\n target: 'Which hit-test result the gesture must land on. `*` matches any target; `empty` matches the empty canvas; otherwise the value names a specific hit-target kind.',\n modifiers: 'Modifier keys the user must hold (`+key`) or may optionally hold (`?key`) for this route to match. Unlisted modifiers must not be held.',\n} as const;\n\n/** The slots of a parsed route that `ROUTE_FIELD_DEFINITIONS` explains. */\nexport type RouteFieldName = keyof typeof ROUTE_FIELD_DEFINITIONS;\n\n/** The route-vocabulary terms `ROUTE_TERMS` defines. */\nexport type RouteTermLabel = keyof typeof ROUTE_TERMS;\n\n/** A part of a structured route description. `string` parts are plain prose;\n * `term` parts carry a glossary lookup so renderers can attach tooltips. */\nexport type RouteDescriptionPart =\n | string\n | { kind: 'term'; label: RouteTermLabel; definition: string };\n\nfunction term(label: RouteTermLabel): RouteDescriptionPart {\n return { kind: 'term', label, definition: ROUTE_TERMS[label] };\n}\n\nfunction joinAnd(parts: readonly string[]): string {\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0];\n if (parts.length === 2) return `${parts[0]} and ${parts[1]}`;\n return `${parts.slice(0, -1).join(', ')}, and ${parts[parts.length - 1]}`;\n}\n\nfunction partitionModifiers(mods: ParsedModifiers): { required: string[]; optional: string[] } {\n const required: string[] = [];\n const optional: string[] = [];\n for (const name of MOD_ORDER) {\n const req = mods[name];\n if (req === 'required') required.push(MOD_NAMES[name]);\n else if (req === 'optional') optional.push(MOD_NAMES[name]);\n }\n return { required, optional };\n}\n\n/** What a pointer leaves: the hover target, or with none the surface itself. */\nfunction leftClause(target: string | undefined): string {\n if (target === undefined || target === '*') return 'off the surface';\n return target === 'empty' ? 'off empty canvas' : `off a ${target}`;\n}\n\nfunction phaseAtomParts({ channel, phase }: PhaseAtom): RouteDescriptionPart[] {\n const subject = channel === '&' ? 'the tool'\n : channel === '*' ? 'any tool'\n : `the ${channel} tool`;\n if (phase === 'initial') return [`${subject} is `, term('idle')];\n if (phase === 'engaged') return [`${subject} is `, term('mid-gesture')];\n return [`${subject} is in any phase`];\n}\n\nfunction phasesParts(phases: readonly PhaseAtom[]): RouteDescriptionPart[] {\n if (phases.length === 1) return phaseAtomParts(phases[0]);\n const out: RouteDescriptionPart[] = [];\n phases.forEach((p, i) => {\n if (i > 0) out.push(' or ');\n out.push(...phaseAtomParts(p));\n });\n return out;\n}\n\nfunction targetClause(target: string | undefined, hasTarget: boolean): string {\n if (!hasTarget || target === undefined) return '';\n if (target === '*') return ' anywhere';\n if (target === 'empty') return ' on empty canvas';\n return ` on a ${target}`;\n}\n\nfunction carryOnto(target: string | undefined): string {\n if (target === undefined || target === '*') return 'onto the canvas';\n if (target === 'empty') return 'onto empty canvas';\n return `onto a ${target}`;\n}\n\n/** The gesture's arg, or undefined when it is the `'*'` wildcard — which\n * `parseRoute` fills in for every omitted slot, so prose must not print it. */\nfunction concreteArg(parsed: ParsedRoute): string | undefined {\n return parsed.arg === '*' ? undefined : parsed.arg;\n}\n\n/** One modifier reads as a compound verb (\"Shift-clicks\"); more read as a\n * held chord (\"holds Mod and Alt and drags\"). */\nfunction userDoes(required: readonly string[], verb: string): string {\n if (required.length === 0) return `the user ${verb}`;\n if (required.length === 1) return `the user ${required[0]}-${verb}`;\n return `the user holds ${joinAnd(required)} and ${verb}`;\n}\n\nfunction actionClause(parsed: ParsedRoute, required: readonly string[]): string {\n const desc = getGestureDescriptor(parsed.gesture as GestureName);\n const arg = concreteArg(parsed);\n const target = targetClause(parsed.target, desc.hasTarget);\n\n switch (parsed.gesture) {\n case 'keyDown':\n case 'keyUp':\n case 'keyHeld': {\n const verb = parsed.gesture === 'keyDown' ? 'presses'\n : parsed.gesture === 'keyUp' ? 'releases'\n : 'holds';\n const key = arg ?? 'any key';\n return required.length > 0\n ? `the user holds ${joinAnd(required)} and ${verb} ${key}`\n : `the user ${verb} ${key}`;\n }\n case 'wheel': {\n const direction = arg === 'up' ? ' up'\n : arg === 'down' ? ' down'\n : '';\n return userDoes(required, `scrolls${direction}${target}`);\n }\n case 'pinch': {\n const direction = arg === 'in' ? ' in'\n : arg === 'out' ? ' out'\n : '';\n return userDoes(required, `pinches${direction}${target}`);\n }\n case 'multiTouch':\n return userDoes(required, `touches with ${arg ?? 'multiple'} fingers`);\n case 'multiTouchTap':\n return userDoes(required, `taps with ${arg ?? 'multiple'} fingers`);\n case 'contextMenu':\n return userDoes(required, `opens the context menu${target}`);\n case 'longPress':\n return userDoes(required, `long-presses${target}`);\n case 'click':\n return userDoes(required, `clicks${target}`);\n case 'pointerDown':\n return userDoes(required, `presses${target}`);\n case 'hover': {\n const held = parsed.held === 'required' ? ' with a button held'\n : parsed.held === 'optional' ? ' whether or not a button is held'\n : '';\n const where = arg === 'leave' ? ` ${leftClause(parsed.target)}` : target;\n return userDoes(required, `moves the pointer${where}${held}`);\n }\n case 'dblTap':\n return userDoes(required, `double-taps${target}`);\n case 'drag':\n return userDoes(required, `drags${target}`);\n case 'drop':\n return userDoes(required, `drops ${arg ?? 'any'} content onto the canvas`);\n case 'carry':\n return userDoes(required, `carries ${arg ?? 'anything'} ${carryOnto(parsed.target)}`);\n case 'paste':\n return userDoes(required, `pastes ${arg ?? 'any'} content`);\n }\n}\n\n/** Sentence-shaping options for `describeRoute` and `describeRouteParts` —\n * set both false to embed the description inside a larger sentence. */\nexport interface DescribeRouteOptions {\n /** Capitalize the first letter of the result. Default true. */\n capitalize?: boolean;\n /** Trailing period. Default true. */\n period?: boolean;\n}\n\n/** Structured description of when a parsed route fires. Returns an array of\n * prose strings interspersed with `term` parts (e.g. `idle`, `mid-gesture`)\n * so React-based renderers can attach hover-definition tooltips. Use\n * `describeRoute()` for a plain-string version. */\nexport function describeRouteParts(\n parsed: ParsedRoute,\n opts: DescribeRouteOptions = {},\n): readonly RouteDescriptionPart[] {\n const { capitalize = true, period = true } = opts;\n const { required, optional } = partitionModifiers(parsed.modifiers);\n const action = actionClause(parsed, required);\n const optClause = optional.length > 0\n ? ` (${joinAnd(optional)} optional)`\n : '';\n\n const parts: RouteDescriptionPart[] = [];\n const head = `fires when ${action}, while `;\n parts.push(capitalize ? head.charAt(0).toUpperCase() + head.slice(1) : head);\n parts.push(...phasesParts(parsed.phases));\n if (optClause) parts.push(optClause);\n if (period) parts.push('.');\n return mergeAdjacentStrings(parts);\n}\n\n/** Plain-spoken English summary of when a parsed route fires. Intended for\n * developer-facing documentation. Term parts collapse to their label only\n * (e.g. `idle`); use `describeRouteParts()` if you want to expose the\n * glossary definitions in your renderer. */\nexport function describeRoute(parsed: ParsedRoute, opts: DescribeRouteOptions = {}): string {\n return describeRouteParts(parsed, opts)\n .map((p) => (typeof p === 'string' ? p : p.label))\n .join('');\n}\n\nfunction mergeAdjacentStrings(parts: readonly RouteDescriptionPart[]): RouteDescriptionPart[] {\n const out: RouteDescriptionPart[] = [];\n for (const p of parts) {\n const last = out[out.length - 1];\n if (typeof p === 'string' && typeof last === 'string') out[out.length - 1] = last + p;\n else out.push(p);\n }\n return out;\n}\n","import type { ModifierCombo } from './modifiers';\nimport type { ParsedModifiers, ModifierKey } from './routeGrammar';\n\n/** Translate the tool-authoring `ModifierCombo` enum (positional string,\n * e.g. `'mod+shift'`) to the v3 `ParsedModifiers` structured map\n * (every listed modifier becomes `'required'`; unlisted means\n * forbidden / absent). `'default'` yields `{}`. */\nexport function modifierComboToParsed(key: ModifierCombo): ParsedModifiers {\n if (key === 'default') return {};\n const out: ParsedModifiers = {};\n for (const part of key.split('+')) {\n out[part as ModifierKey] = 'required';\n }\n return out;\n}\n\n/** Stable canonical serialization of a ParsedModifiers map for use as a\n * hash key (conflicts dedup). Sorts mod names alphabetically and emits\n * `name=req` pairs joined by `&`. */\nexport function canonicalModifiers(mods: ParsedModifiers): string {\n return Object.entries(mods)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, req]) => `${name}=${req}`)\n .join('&');\n}\n","import type { PointerSampleStylus } from './inputEvent';\n\n/**\n * The stylus fields `src` carries, as a spread-able partial: a sample that\n * carries none of them adds no `undefined`-valued keys to what it is spread into.\n */\nexport function stylusOf(src: PointerSampleStylus): PointerSampleStylus {\n return {\n ...(typeof src.pressure === 'number' ? { pressure: src.pressure } : {}),\n ...(typeof src.tiltX === 'number' ? { tiltX: src.tiltX } : {}),\n ...(typeof src.tiltY === 'number' ? { tiltY: src.tiltY } : {}),\n };\n}\n","/** GestureSpec — describes the form of a user input event that can fire an action. */\n\n/** Optional modifier-key requirement for a gesture spec.\n *\n * Matching is strict: an omitted modifier field means the modifier MUST NOT\n * be held — a bare `{ kind: 'key', key: 'Escape' }` matches only unmodified\n * Escape, NOT Cmd+Escape. A `true` means the modifier MUST be held; `false`\n * is the same as omitted.\n *\n * `mod` is a platform-aware shorthand: matches `metaKey` on mac, `ctrlKey`\n * elsewhere.\n *\n * Every modifier additionally accepts `'optional'`, meaning \"held or not,\n * both acceptable\" — used by actions like nudge whose step size depends on\n * shift but whose firing does not.\n */\nexport type ModSpec = Partial<{\n alt: boolean | 'optional';\n ctrl: boolean | 'optional';\n meta: boolean | 'optional';\n mod: boolean | 'optional';\n shift: boolean | 'optional';\n}>;\n\n/** The predicate form of {@link TargetSpec}. `hit` is the affordance hit\n * under the pointer, for every gesture kind; `bodyTarget` is the optional\n * body-class string ('empty' | 'selected-body' | 'unselected-body') when\n * `classifyTarget` is wired. Build one with `hitPredicate` or\n * `bodyPredicate`, which make the declaration below. */\nexport interface TargetPredicate {\n (hit: unknown, bodyTarget?: string): boolean;\n /** Whether the predicate reads `hit`. An exclusive affordance claim bars\n * every binding whose target does not: `false` is a predicate that decides\n * from `bodyTarget` alone, and chrome over a body must not read as that body. */\n readsAffordance: boolean;\n}\n\n/** A {@link TargetPredicate} that reads the affordance hit, alone or with the\n * body class, so it stays in contention under an exclusive claim. */\nexport function hitPredicate(\n fn: (hit: unknown, bodyTarget?: string) => boolean,\n): TargetPredicate & { readsAffordance: true } {\n return Object.assign(\n (hit: unknown, bodyTarget?: string): boolean => fn(hit, bodyTarget),\n { readsAffordance: true as const },\n );\n}\n\n/** A {@link TargetPredicate} that decides from the body class alone, so an\n * exclusive affordance claim bars it. */\nexport function bodyPredicate(\n fn: (bodyTarget: string | undefined) => boolean,\n): TargetPredicate & { readsAffordance: false } {\n return Object.assign(\n (_hit: unknown, bodyTarget?: string): boolean => fn(bodyTarget),\n { readsAffordance: false as const },\n );\n}\n\n/** Target selector for click and drag gesture specs. Consumers can pass\n * `{ kindOf: predicate }` to classify hits themselves.\n *\n * Adding a form here is a compile error in `parseTargetSpec` until\n * `TargetSpecForm` grows a matching variant — which is in turn a compile\n * error at every site that switches on one. */\nexport type TargetSpec =\n | 'empty'\n | 'selected-body'\n | 'unselected-body'\n | `kind:${string}`\n | `kind:${string}:selected`\n | `affordance:${string}`\n | { kindOf: TargetPredicate };\n\n/** Phase qualifier on a gesture spec. Restricts when the spec matches based\n * on per-tool gesture-lifecycle state. When omitted, matches in any phase.\n *\n * Shorthand forms gate on the binding's own tool:\n * `'engaged'` → `[{ channel: '&', phase: 'engaged' }]` // self mid-gesture\n * `'initial'` → `[{ channel: '&', phase: 'initial' }]` // self idle\n * `'*'` → `[{ channel: '&', phase: '*' }]` // either self phase\n *\n * Array form for explicit channel:phase atoms — e.g. `[{ channel: 'rect',\n * phase: 'engaged' }]` for \"when the rect tool is mid-gesture, regardless of\n * which scope I'm in.\" */\nexport type PhaseSpec = 'initial' | 'engaged' | '*' | readonly import('../grammar/routeGrammar').PhaseAtom[];\n\n/** Single-keystroke gesture (keydown). */\nexport interface KeySpec {\n kind: 'key';\n /** A single key, or an array of acceptable keys (case-insensitive match). */\n key: string | string[];\n /** The physical key, as `KeyboardEvent.code` (`'BracketRight'`), or several.\n * Tried before `key`, and either matching is enough: the binding then holds\n * on that key whatever a layout or a held modifier makes it type, and still\n * on any key that types `key`. `key` is what a route names the binding by. */\n code?: string | string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Key-held gesture (keydown opens, keyup closes). Drives \"hold space for\n * hand tool\"-style interactions. */\nexport interface KeyHeldSpec {\n kind: 'key-held';\n /** A single key, or an array of acceptable keys (case-insensitive match). */\n key: string | string[];\n /** The physical key or keys, as on {@link KeySpec.code}. */\n code?: string | string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Wheel-event gesture. `direction` filters by deltaY sign: `'up'` matches\n * only deltaY < 0, `'down'` only deltaY > 0, and the default `'*'` either. */\nexport interface WheelSpec {\n kind: 'wheel';\n direction?: 'up' | 'down' | '*';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Pinch reported as a scale factor about a focal point (WebKit\n * `gesturechange`). `direction` filters by the sample's scale: `'out'` is\n * scale > 1, `'in'` is scale < 1; default `'*'`. A touchscreen pinch is\n * {@link MultiTouchSpec}, not this. */\nexport interface PinchSpec {\n kind: 'pinch';\n direction?: 'in' | 'out' | '*';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Click gesture (pointerdown + pointerup without movement past the\n * threshold). */\nexport interface ClickSpec {\n kind: 'click';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Double-click: two `click` events within 600ms and 8px of each other.\n * Synthesized by `useGestureDispatcher`; emitted AFTER the second `click`. */\nexport interface DoubleClickSpec {\n kind: 'doubleClick';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Right-click (contextmenu) gesture. The dispatcher calls\n * `preventDefault()` on the underlying DOM event so the native menu\n * doesn't appear — tools/actions fully own the right-click UX. */\nexport interface ContextMenuSpec {\n kind: 'contextMenu';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Drag gesture (pointerdown + pointermove past the threshold). */\nexport interface DragSpec {\n kind: 'drag';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * Bare pointer press, matched at down time — before the dispatcher knows\n * whether the gesture will become a click or a drag. Reach for this only when\n * the effect must be visible while the button is still held; anything that\n * can wait for the release belongs on a `click` spec, which does not fire on\n * a press that turns into a drag.\n *\n * A matching binding does NOT own the gesture: the same press goes on to open\n * a drag or synthesize a click as usual. Bind an immediate action here, not an\n * ongoing one.\n */\nexport interface PointerDownSpec {\n kind: 'pointerDown';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * The pointer moving over the surface with no button pressed. Fires on every\n * such move; a held pointer's moves belong to its drag and fire nothing here,\n * unless `held` says otherwise.\n *\n * With `motion: 'leave'` it fires instead when the pointer passes out of what\n * the binding targets: onto something its `target` does not match, or off the\n * surface. With no `target` that is the whole surface. Its params are the\n * move's that took the pointer out, or the last move's before it left the surface.\n *\n * A hover binding claims nothing. Every live binding that matches the move\n * runs, not only the best one, and the move still reaches the hover-cursor\n * pump. There is no press to own, so bind an immediate action, not an ongoing\n * one. Its params carry `worldX` / `worldY`, `clientX` / `clientY`,\n * `affordance`, `bodyTarget`, `mods`, and `held`.\n */\nexport interface HoverSpec {\n kind: 'hover';\n motion?: 'move' | 'leave';\n /** Whether a pressed button may (`'optional'`) or must (`true`) be held, as\n * `mods` says of a modifier; omitted, a held pointer's moves are not hovers.\n * Such a binding still claims nothing, so the drag keeps its moves. Leaving\n * the surface is a leave whether or not a button is held. */\n held?: true | 'optional';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * Press held past the long-press threshold without crossing the drag\n * threshold. Synthesized by `useGestureDispatcher` from the pointer stream.\n * Fires for `touch` and `pen` pointers only: a mouse held still is an\n * ordinary slow click.\n *\n * When a long-press matches no binding, the dispatcher re-dispatches it as a\n * `contextmenu` event, so `contextMenu` bindings work under a finger.\n */\nexport interface LongPressSpec {\n kind: 'longPress';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Multi-touch gesture. `fingers` is the required touch count. */\nexport interface MultiTouchSpec {\n kind: 'multiTouch';\n fingers: number;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Multi-touch tap gesture — fires when N fingers touch down then release\n * together without movement past the tap threshold, sooner than a long-press\n * would fire. Synthesized by the dispatcher from the underlying multitouch\n * tracking. */\nexport interface MultiTouchTapSpec {\n kind: 'multiTouchTap';\n fingers: number;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** OS drag-and-drop of external content onto the canvas. `types` filters by\n * MIME glob (`'image/*'`, `'text/plain'`); the spec matches when ANY item's\n * MIME matches ANY glob. Omitted or empty = matches any drop. */\nexport interface DropSpec {\n kind: 'drop';\n types?: string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * A press that began elsewhere on the page, carried over the canvas: a palette\n * item dragged in, a row dragged out of a list. The in-app sibling of\n * {@link DropSpec}, which is the OS's drag. A carry is begun with `startCarry`.\n * `types` filters by the payload's `type`, as globs; omitted or empty matches\n * any carry.\n *\n * An ongoing action bound here starts when the carry comes over the surface:\n * its moves update it, the release commits it, and leaving the surface or\n * canceling the press cancels it. An immediate action fires once, on the\n * release.\n *\n * `target` is matched against what is under the carry. With one, an ongoing\n * action starts on the first step that is over its target, as the carry comes\n * over or as it moves on, and an immediate action fires only on a release over it.\n */\nexport interface CarrySpec {\n kind: 'carry';\n types?: string[];\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** System-clipboard paste of external content. Same `types` semantics as\n * {@link DropSpec} — omitted or empty = matches any paste. */\nexport interface PasteSpec {\n kind: 'paste';\n types?: string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** The full union of supported gesture spec kinds. */\nexport type GestureSpec =\n | KeySpec\n | KeyHeldSpec\n | WheelSpec\n | PinchSpec\n | ClickSpec\n | DoubleClickSpec\n | ContextMenuSpec\n | DragSpec\n | PointerDownSpec\n | HoverSpec\n | LongPressSpec\n | MultiTouchSpec\n | MultiTouchTapSpec\n | DropSpec\n | CarrySpec\n | PasteSpec;\n","/**\n * Whether this is an Apple platform, where `mod` means the Command key and\n * not Ctrl. iPhone and iPad count: with a keyboard attached their shortcuts\n * are Command shortcuts. False where there is no `navigator`.\n *\n * Pass the answer to {@link matchModifiers} / {@link matchSpec} as `isMac`,\n * and read it wherever a `mod` shortcut is drawn, so a label names the key\n * the matcher listens for.\n */\nexport function isApplePlatform(): boolean {\n if (typeof navigator === 'undefined' || !navigator) return false;\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n // `||`, not `??`: jsdom and some embedders report an empty-string platform.\n const raw = nav.userAgentData?.platform || nav.platform || nav.userAgent || '';\n return /mac|iphone|ipad|ipod/i.test(raw);\n}\n","import { isApplePlatform } from './platform';\n\n/** One key of a shortcut as a keyboard prints it. */\nexport interface KeyLegend {\n /** Glyph drawn for the key (modifier or key). */\n label: string;\n /** When true, the key may be held but is not required to trigger the action\n * (e.g. an optional modifier). Defaults to false. */\n optional?: boolean;\n}\n\n/** Logical modifier name. Matches the kit's `ModifierKey` in shape — kept as a\n * local type so `weasel-ui` stays independent of `@weasel-js/core`. */\nexport type LogicalMod = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta';\n\n/** Detected (or overridden) platform. `'mod'` resolves to ⌘ on macOS,\n * Ctrl on Windows / Linux. */\nexport type Platform = 'macos' | 'windows' | 'linux';\n\n/** Visual form of a modifier or named-key label.\n *\n * - `'auto'` (default): the per-entry, per-platform default — whatever\n * label is actually printed on the physical key. macOS keys show the\n * Apple glyphs (⌘ ⌥ ⌃ ⇧ ⎋ ↵ ⇥). Windows keys mostly show text\n * (Ctrl, Alt, Shift) BUT the Win key shows its logo (⊞) and the\n * context-menu key shows ▤. Linux mirrors Windows with Super (⊞).\n * - `'symbol'` forces a glyph wherever the key has one: Apple's on macOS,\n * ISO/IEC 9995-7's elsewhere (⎈ Ctrl, ⎇ Alt, ⎋ Esc). A key with no\n * symbol still falls back to text.\n * - `'text'` always spells the label out (Cmd / Option / Esc / Enter). */\nexport type LegendStyle = 'auto' | 'symbol' | 'text';\n\n/** A modifier to render, named platform-independently. */\nexport interface LogicalModSpec {\n name: LogicalMod;\n /** Marks this modifier as optional (may be held but isn't required).\n * Forwarded as the resulting `KeyLegend.optional`. */\n optional?: boolean;\n}\n\n/** Options for {@link keySpecsFromMods}. */\nexport interface KeySpecsFromModsOptions {\n /** Override OS detection. Defaults to {@link detectPlatform}. */\n platform?: Platform;\n /** Defaults to `'auto'`. Pass `'symbol'` or `'text'` to force a specific\n * style regardless of platform. */\n legend?: LegendStyle;\n /** Labels that replace the platform and legend tables', by a modifier's\n * logical name (`mod`, `shift`, `alt`, `ctrl`, `meta`) or a key's\n * `KeyboardEvent.key` (`Escape`, `Home`, `z`): a whole keyboard's worth\n * for a layout, a locale, or a keyboard of one's own. */\n labels?: KeyLabels;\n}\n\n/** Key labels by modifier name or `KeyboardEvent.key`. See {@link KeySpecsFromModsOptions.labels}. */\nexport type KeyLabels = Readonly<Record<string, string>>;\n\nconst MOD_BY_PLATFORM: Record<LogicalMod, Record<Platform, Record<LegendStyle, string>>> = {\n mod: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n },\n shift: {\n macos: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n windows: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n linux: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n },\n // Off macOS the symbols are ISO/IEC 9995-7's: ⎈ for Control, ⎇ for Alt.\n alt: {\n macos: { auto: '⌥', symbol: '⌥', text: 'Option' },\n windows: { auto: 'Alt', symbol: '⎇', text: 'Alt' },\n linux: { auto: 'Alt', symbol: '⎇', text: 'Alt' },\n },\n ctrl: {\n macos: { auto: '⌃', symbol: '⌃', text: 'Control' },\n windows: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n },\n // Windows/Linux Meta has a recognized symbol on the physical key (⊞ Win\n // logo / Super logo), so `auto` shows it. Use `text` for Win / Super.\n meta: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: '⊞', symbol: '⊞', text: 'Win' },\n linux: { auto: '⊞', symbol: '⊞', text: 'Super' },\n },\n};\n\n/** Every label {@link keySpecsFromMods} can produce, on any platform and legend. */\nexport const MODIFIER_LABELS: ReadonlySet<string> = new Set(\n Object.values(MOD_BY_PLATFORM).flatMap((byPlatform) =>\n Object.values(byPlatform).flatMap((byLegend) => Object.values(byLegend)),\n ),\n);\n\n/** The platform whose key legends to draw. Whether `mod` is ⌘ comes from\n * `isApplePlatform`, the same read the dispatcher\n * matches `mod` with, so a keycap names the key that fires. With no\n * `navigator` (a server render) it answers `'macos'`, the kit's docs\n * convention; an unrecognized browser reads as `'linux'`. */\nexport function detectPlatform(): Platform {\n if (typeof navigator === 'undefined' || !navigator) return 'macos';\n if (isApplePlatform()) return 'macos';\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n const raw = nav.userAgentData?.platform || nav.platform || nav.userAgent || '';\n // `\\b`: jsdom names its host OS in the user agent, and \"darwin\" ends in \"win\".\n return /\\bwin/i.test(raw) ? 'windows' : 'linux';\n}\n\n/**\n * Map a list of **logical** modifiers (`'mod'`, `'shift'`, …) to **visual**\n * `KeyLegend`s appropriate for the current platform — `'mod'` means \"Cmd on\n * Mac, Ctrl on Win/Linux\".\n *\n * ```ts\n * <KeySequence\n * keys={keySpecsFromMods([{ name: 'mod' }, { name: 'shift', optional: true }])}\n * />\n * ```\n */\nexport function keySpecsFromMods(\n mods: readonly LogicalModSpec[],\n opts: KeySpecsFromModsOptions = {},\n): readonly KeyLegend[] {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n return mods.map((m) => {\n const label = opts.labels?.[m.name] ?? MOD_BY_PLATFORM[m.name][platform][legend];\n return m.optional ? { label, optional: true } : { label };\n });\n}\n\n/** Per-platform × per-legend table for named, non-modifier keys. `auto`\n * is whatever's printed on the physical key for that platform. Arrows\n * are universal symbols on every platform. */\nconst NAMED_KEY: Record<string, Record<Platform, Record<LegendStyle, string>>> = {\n Escape: { macos: { auto: '⎋', symbol: '⎋', text: 'Esc' }, windows: { auto: 'Esc', symbol: '⎋', text: 'Esc' }, linux: { auto: 'Esc', symbol: '⎋', text: 'Esc' } },\n Enter: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: '↵', text: 'Enter' }, linux: { auto: 'Enter', symbol: '↵', text: 'Enter' } },\n Return: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: '↵', text: 'Enter' }, linux: { auto: 'Enter', symbol: '↵', text: 'Enter' } },\n Tab: { macos: { auto: '⇥', symbol: '⇥', text: 'Tab' }, windows: { auto: 'Tab', symbol: '⇥', text: 'Tab' }, linux: { auto: 'Tab', symbol: '⇥', text: 'Tab' } },\n Space: { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: '␣', text: 'Space' }, linux: { auto: 'Space', symbol: '␣', text: 'Space' } },\n ' ': { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: '␣', text: 'Space' }, linux: { auto: 'Space', symbol: '␣', text: 'Space' } },\n Backspace: { macos: { auto: '⌫', symbol: '⌫', text: 'Backspace' }, windows: { auto: 'Backspace', symbol: '⟵', text: 'Backspace' }, linux: { auto: 'Backspace', symbol: '⟵', text: 'Backspace' } },\n Delete: { macos: { auto: '⌦', symbol: '⌦', text: 'Delete' }, windows: { auto: 'Delete', symbol: '⌦', text: 'Delete' }, linux: { auto: 'Delete', symbol: '⌦', text: 'Delete' } },\n // Context-menu key (the right-Ctrl-area key on Windows / Linux keyboards\n // with a ▤ icon). Mac has no equivalent; falls back to text 'Menu'.\n ContextMenu: { macos: { auto: 'Menu', symbol: 'Menu', text: 'Menu' }, windows: { auto: '▤', symbol: '▤', text: 'Menu' }, linux: { auto: '▤', symbol: '▤', text: 'Menu' } },\n // Symbol mode only: Apple's arrows for Home, End, and the page keys, and\n // ISO/IEC 9995-7's symbols for the rest.\n Home: { macos: { auto: 'Home', symbol: '↖', text: 'Home' }, windows: { auto: 'Home', symbol: '↖', text: 'Home' }, linux: { auto: 'Home', symbol: '↖', text: 'Home' } },\n End: { macos: { auto: 'End', symbol: '↘', text: 'End' }, windows: { auto: 'End', symbol: '↘', text: 'End' }, linux: { auto: 'End', symbol: '↘', text: 'End' } },\n PageUp: { macos: { auto: 'PgUp', symbol: '⇞', text: 'PgUp' }, windows: { auto: 'PgUp', symbol: '⇞', text: 'PgUp' }, linux: { auto: 'PgUp', symbol: '⇞', text: 'PgUp' } },\n PageDown: { macos: { auto: 'PgDn', symbol: '⇟', text: 'PgDn' }, windows: { auto: 'PgDn', symbol: '⇟', text: 'PgDn' }, linux: { auto: 'PgDn', symbol: '⇟', text: 'PgDn' } },\n PrintScreen: { macos: { auto: 'PrtSc', symbol: '⎙', text: 'PrtSc' }, windows: { auto: 'PrtSc', symbol: '⎙', text: 'PrtSc' }, linux: { auto: 'PrtSc', symbol: '⎙', text: 'PrtSc' } },\n Insert: { macos: { auto: 'Ins', symbol: '⎀', text: 'Insert' }, windows: { auto: 'Ins', symbol: '⎀', text: 'Insert' }, linux: { auto: 'Ins', symbol: '⎀', text: 'Insert' } },\n ScrollLock: { macos: { auto: 'ScrLk', symbol: '⇳', text: 'ScrLk' }, windows: { auto: 'ScrLk', symbol: '⇳', text: 'ScrLk' }, linux: { auto: 'ScrLk', symbol: '⇳', text: 'ScrLk' } },\n Pause: { macos: { auto: 'Pause', symbol: '⎉', text: 'Pause' }, windows: { auto: 'Pause', symbol: '⎉', text: 'Pause' }, linux: { auto: 'Pause', symbol: '⎉', text: 'Pause' } },\n ArrowUp: { macos: { auto: '↑', symbol: '↑', text: '↑' }, windows: { auto: '↑', symbol: '↑', text: '↑' }, linux: { auto: '↑', symbol: '↑', text: '↑' } },\n ArrowDown: { macos: { auto: '↓', symbol: '↓', text: '↓' }, windows: { auto: '↓', symbol: '↓', text: '↓' }, linux: { auto: '↓', symbol: '↓', text: '↓' } },\n ArrowLeft: { macos: { auto: '←', symbol: '←', text: '←' }, windows: { auto: '←', symbol: '←', text: '←' }, linux: { auto: '←', symbol: '←', text: '←' } },\n ArrowRight: { macos: { auto: '→', symbol: '→', text: '→' }, windows: { auto: '→', symbol: '→', text: '→' }, linux: { auto: '→', symbol: '→', text: '→' } },\n};\n\n/**\n * Render a raw `KeyboardEvent.key` value as a platform-appropriate\n * `KeyLegend`. Named non-modifier keys (Esc, Enter, Tab, Space, Backspace,\n * Delete, arrows) get the platform's conventional form. Letter / digit /\n * other keys pass through upper-cased.\n *\n * ```ts\n * keySpecFromKey('Escape', { platform: 'macos' }) // { label: '⎋' }\n * keySpecFromKey('Escape', { platform: 'windows' }) // { label: 'Esc' }\n * keySpecFromKey('p') // { label: 'P' }\n * ```\n *\n * Symbol mode off macOS draws ISO/IEC 9995-7's symbols where the key\n * has one, though Windows and Linux keyboards print the text form.\n */\nexport function keySpecFromKey(\n raw: string,\n opts: KeySpecsFromModsOptions & { optional?: boolean } = {},\n): KeyLegend {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n const entry = NAMED_KEY[raw];\n const override = opts.labels?.[raw] ?? (raw.length === 1 ? opts.labels?.[raw.toUpperCase()] : undefined);\n const label = override ?? (entry ? entry[platform][legend] : raw.length === 1 ? raw.toUpperCase() : raw);\n return opts.optional ? { label, optional: true } : { label };\n}\n","import type { ShortcutInput } from './formatShortcut';\nimport { keySpecFromKey, keySpecsFromMods, type KeyLegend, type KeySpecsFromModsOptions, type LogicalModSpec } from './keySpecsFromMods';\n\n/**\n * A shortcut as key legends, one per key, as `@weasel-js/ui`'s `KeySequence` draws them: mod, shift, alt, then the\n * key, each in the platform's own legend (`⌘` on macOS, `Ctrl` elsewhere).\n * Only the key itself: `formatShortcutParts` adds the keymaps that lead to it. `shift: 'optional'`\n * becomes an optional key; a key list\n * renders its first key. Returns `undefined` for no shortcut.\n *\n * ```tsx\n * <KeySequence keys={keySpecsFromShortcut({ key: 'z', mod: true, shift: true })} />\n * ```\n */\nexport function keySpecsFromShortcut(\n shortcut: ShortcutInput | undefined,\n opts: KeySpecsFromModsOptions = {},\n): readonly KeyLegend[] | undefined {\n if (!shortcut) return undefined;\n const mods: LogicalModSpec[] = [];\n if (shortcut.mod) mods.push({ name: 'mod' });\n if (shortcut.shift) mods.push(shortcut.shift === 'optional' ? { name: 'shift', optional: true } : { name: 'shift' });\n if (shortcut.alt) mods.push({ name: 'alt' });\n const key = typeof shortcut.key === 'string' ? shortcut.key : shortcut.key[0];\n const keys = keySpecsFromMods(mods, opts);\n return key === undefined ? keys : [...keys, keySpecFromKey(key, opts)];\n}\n","import { keySpecFromKey, keySpecsFromMods, type KeyLegend, type KeySpecsFromModsOptions, type LogicalMod } from './keySpecsFromMods';\n\nconst MOD_CODES: Readonly<Record<string, LogicalMod>> = {\n ShiftLeft: 'shift', ShiftRight: 'shift',\n ControlLeft: 'ctrl', ControlRight: 'ctrl',\n AltLeft: 'alt', AltRight: 'alt',\n MetaLeft: 'meta', MetaRight: 'meta',\n};\n\n/** What a US keyboard prints on keys `KeyboardEvent.code` names by position rather than by character. */\nconst PRINTED: Readonly<Record<string, string>> = {\n Backquote: '`', Minus: '-', Equal: '=', BracketLeft: '[', BracketRight: ']', Backslash: '\\\\',\n Semicolon: ';', Quote: \"'\", Comma: ',', Period: '.', Slash: '/', IntlBackslash: '§',\n CapsLock: 'Caps', Fn: 'fn',\n};\n\n/**\n * The legend of the physical key a `KeyboardEvent.code` names (`KeyA`, `ShiftLeft`, `ArrowUp`), as\n * {@link keySpecFromKey} prints that key on the platform: `MetaLeft` is `⌘` on macOS and `⊞` on\n * Windows. Letters and punctuation print as a US keyboard prints them. `opts.labels` answers by code\n * first, then as it does for {@link keySpecFromKey} and {@link keySpecsFromMods}.\n */\nexport function keySpecFromCode(code: string, opts: KeySpecsFromModsOptions = {}): KeyLegend {\n const own = opts.labels?.[code];\n if (own !== undefined) return { label: own };\n const mod = MOD_CODES[code];\n if (mod) return keySpecsFromMods([{ name: mod }], opts)[0]!;\n const char = /^Key([A-Z])$/.exec(code) ?? /^Digit(\\d)$/.exec(code);\n if (char) return keySpecFromKey(char[1]!, opts);\n if (code === 'NumpadEnter') return keySpecFromKey('Enter', opts);\n const printed = PRINTED[code];\n return printed !== undefined ? { label: printed } : keySpecFromKey(code, opts);\n}\n","import type { MenuShortcut } from '@weasel-js/menu';\nimport { keySpecsFromShortcut } from './keySpecsFromShortcut';\nimport { detectPlatform, type KeyLegend, type LegendStyle, type Platform } from './keySpecsFromMods';\n\n/** A keyboard shortcut as the formatters read it: `@weasel-js/menu`'s `MenuShortcut`. */\nexport type ShortcutInput = MenuShortcut;\n\n/** Options for {@link formatShortcut} and {@link formatShortcutParts}. */\nexport interface FormatShortcutOptions {\n /** Defaults to the detected platform. */\n platform?: Platform;\n /** {@link formatShortcutParts} only; {@link formatShortcut} picks its own. Defaults to `'auto'`. */\n legend?: LegendStyle;\n}\n\n/** One keymap on the way to a key: its label, and the chips of the leader that opens it. */\nexport interface ShortcutLeaderStep {\n label: string;\n keys: readonly KeyLegend[];\n}\n\n/** A shortcut as display chips: {@link formatShortcutParts}'s result. */\nexport interface ShortcutParts {\n /** The keymaps leading to the key, outermost first; empty for a key outside any keymap. */\n leader: readonly ShortcutLeaderStep[];\n /** The key's own chips: the modifiers, then the key. */\n keys: readonly KeyLegend[];\n}\n\n/** What {@link formatShortcut} writes after each leader step's label: `Loupe ▸ 2`. */\nexport const SHORTCUT_LEADER_SEPARATOR = ' ▸ ';\n\n/** Format a shortcut as display chips, one per key: the modifiers, then the\n * key, each as the platform's keyboard prints it, so `mod` is `⌘` on macOS\n * and `Ctrl` elsewhere, after the keymaps that lead to it (`Loupe ▸ 2`).\n * UIs that want a boxed per-key look render each chip in its own element.\n * `shift: 'optional'` gives an optional chip. */\nexport function formatShortcutParts(\n b: ShortcutInput | undefined,\n opts: FormatShortcutOptions = {},\n): ShortcutParts | undefined {\n const keys = keySpecsFromShortcut(b, opts);\n if (!b || !keys) return undefined;\n const leader = (b.leader ?? []).map((l) => ({ label: l.label, keys: keySpecsFromShortcut(l.shortcut, opts) ?? [] }));\n return { leader, keys };\n}\n\n/** Format a shortcut as a single display string. Order: mod, shift, alt,\n * key, after each keymap that leads to it (`Loupe ▸ ⌘2`). On macOS the glyphs run together (`⌘⇧Z`); elsewhere the keys are\n * spelled out and joined with `+` (`Ctrl+Shift+Z`). Returns `undefined` for\n * `undefined` input so callers can `??` a fallback. When `key` is an array,\n * the first element is used. `shift: 'optional'` is treated as falsy. */\nexport function formatShortcut(\n b: ShortcutInput | undefined,\n opts: FormatShortcutOptions = {},\n): string | undefined {\n const platform = opts.platform ?? detectPlatform();\n const mac = platform === 'macos';\n const parts = formatShortcutParts(b && { ...b, shift: b.shift === true }, mac ? { platform } : { platform, legend: 'text' });\n if (!parts) return undefined;\n const keys = parts.keys.map((k) => k.label).join(mac ? '' : '+');\n return [...parts.leader.map((l) => `${l.label}${SHORTCUT_LEADER_SEPARATOR}`), keys].join('');\n}\n","/**\n * Sugar for writing a key binding without the route grammar: `key('Mod+K')`,\n * `held('Space')`, `unbound()`. `bindingSpec` reads what a binding override\n * takes, and `keySpecRoute` writes a key spec back as the route string a host\n * persists.\n */\nimport { parseRoute } from '../grammar/routeGrammar';\nimport { routeToSpec } from '../grammar/routeToSpec';\nimport type { GestureSpec, KeyHeldSpec, KeySpec, ModSpec } from './spec';\n\nconst MODIFIERS: Record<string, keyof ModSpec> = {\n meta: 'meta', cmd: 'meta', command: 'meta',\n ctrl: 'ctrl', control: 'ctrl',\n alt: 'alt', option: 'alt',\n shift: 'shift',\n mod: 'mod',\n};\n\n/** Key names whose `KeyboardEvent.key` is spelled otherwise. */\nconst KEY_NAMES: Record<string, string> = { space: ' ', esc: 'Escape' };\n\nfunction parse(shortcut: string): { key: string; mods: ModSpec } {\n // A trailing '+' is the plus key: 'Mod++'.\n const parts = shortcut.endsWith('++') ? [...shortcut.slice(0, -2).split('+'), '+'] : shortcut.split('+');\n const raw = parts.pop();\n if (!raw) throw new Error(`shortcut \"${shortcut}\" names no key`);\n const mods: ModSpec = {};\n for (const part of parts) {\n const mod = MODIFIERS[part.toLowerCase()];\n if (!mod) throw new Error(`shortcut \"${shortcut}\": unknown modifier \"${part}\"`);\n mods[mod] = true;\n }\n return { key: KEY_NAMES[raw.toLowerCase()] ?? raw, mods };\n}\n\n/** A keystroke in the `Mod+Shift+K` form. Modifiers are case-insensitive:\n * `Meta`/`Cmd`/`Command`, `Ctrl`/`Control`, `Alt`/`Option`, `Shift`, and\n * `Mod` for Cmd on Apple platforms and Ctrl elsewhere. */\nexport function key(shortcut: string): KeySpec {\n const { key: k, mods } = parse(shortcut);\n return Object.keys(mods).length > 0 ? { kind: 'key', key: k, mods } : { kind: 'key', key: k };\n}\n\n/** The same keystroke held down, as a `key-held` spec. */\nexport function held(shortcut: string): KeyHeldSpec {\n const { key: k, mods } = parse(shortcut);\n return Object.keys(mods).length > 0 ? { kind: 'key-held', key: k, mods } : { kind: 'key-held', key: k };\n}\n\n/** A binding override that removes the binding. */\nexport function unbound(): null {\n return null;\n}\n\n/** What a binding override is written as: a route string, a spec, or `null` to unbind. */\nexport type BindingOverrideInput = string | GestureSpec | null;\n\n/** Read a binding override into the spec it names, or `null`. */\nexport function bindingSpec(input: BindingOverrideInput): GestureSpec | null {\n if (typeof input === 'string') return routeToSpec(parseRoute(input));\n return input;\n}\n\nconst MOD_ORDER: readonly (keyof ModSpec)[] = ['mod', 'shift', 'alt', 'ctrl', 'meta'];\n\n/** A key spec as its route string — what `bindingSpec` reads back to an\n * equal spec — or `null` for a key the route grammar cannot spell (`?`,\n * `)`, `*`). A spec is plain JSON, so store that one as it is. A key list is\n * written as its first key. */\nexport function keySpecRoute(spec: KeySpec | KeyHeldSpec): string | null {\n const k = Array.isArray(spec.key) ? spec.key[0]! : spec.key;\n const optional = MOD_ORDER.filter((m) => spec.mods?.[m] === 'optional');\n const required = MOD_ORDER.filter((m) => spec.mods?.[m] === true);\n const arg = [k, ...optional].join('?');\n const gesture = spec.kind === 'key' ? 'keyDown' : 'keyHeld';\n const route = [`[*:*] ${gesture}(${arg})`, ...required.map((m) => `+${m}`)].join(' ');\n return spellsKey(route, k) ? route : null;\n}\n\nfunction spellsKey(route: string, k: string): boolean {\n try {\n const back = bindingSpec(route);\n return back !== null && (back.kind === 'key' || back.kind === 'key-held') && back.key === k;\n } catch {\n return false;\n }\n}\n","/**\n * Elements an overlay may portal into: anything a theme has been stamped on\n * (`applyTheme` / `<ThemeProvider>` write both attributes), plus anything\n * opting in with `data-wzl-portal-host`. The opt-in exists for a styling root\n * that sits *below* the themed element — labkit's `.lk-root` carries element\n * defaults the themed wrapper does not.\n */\nconst HOST_SELECTOR = '[data-wzl-portal-host],[data-wzl-theme],[data-wzl-mode]';\n\n/**\n * The nearest element `from` sits inside that can host a portalled overlay,\n * or `null` when there is none and the body is the only answer.\n */\nexport function nearestPortalHost(from: Element | null | undefined): HTMLElement | null {\n return (from?.closest(HOST_SELECTOR) as HTMLElement | null) ?? null;\n}\n\n/** Whether `el` is the containing block of its fixed-position descendants rather than the viewport. */\nfunction containsFixed(el: Element): boolean {\n const cs = getComputedStyle(el);\n const set = (value: string | undefined) => value !== undefined && value !== '' && value !== 'none';\n return (\n set(cs.transform) ||\n set(cs.filter) ||\n set(cs.backdropFilter) ||\n set(cs.perspective) ||\n /paint|layout|strict|content/.test(cs.contain ?? '')\n );\n}\n\n/**\n * Where a `position: fixed` element following the pointer mounts: `host`, and\n * the client-space point its `left: 0; top: 0` lands on.\n */\nexport interface FixedSeat {\n host: HTMLElement;\n left: number;\n top: number;\n}\n\n/**\n * The seat for something drawn at a client-space point on behalf of `from`, a\n * drag ghost above all: the nearest portal host, so it resolves the theme\n * `from` is drawn in, or the body. Subtract `left` and `top` from the client\n * point to place it.\n */\nexport function fixedSeat(from: Element | null | undefined): FixedSeat {\n const host = nearestPortalHost(from) ?? document.body;\n if (host === document.body || !containsFixed(host)) return { host, left: 0, top: 0 };\n const rect = host.getBoundingClientRect();\n return { host, left: rect.left, top: rect.top };\n}\n","import { parseTargetSpec } from './match';\nimport type { GestureSpec, ModSpec, PhaseSpec, TargetSpec } from './spec';\nimport type { PhaseAtom } from '../grammar/routeGrammar';\n\n/** Count modifier keys declared as `required` (`true`). `'optional'`,\n * `false`, and `undefined` do NOT discriminate — they don't count. */\nfunction modsCount(mods: ModSpec | undefined): number {\n if (!mods) return 0;\n let n = 0;\n if (mods.alt === true) n++;\n if (mods.ctrl === true) n++;\n if (mods.meta === true) n++;\n if (mods.mod === true) n++;\n if (mods.shift === true) n++;\n return n;\n}\n\n/**\n * Rank a `TargetSpec` by how much it narrows. Graduated so a target that\n * names a specific thing outranks one that only names a class of things:\n *\n * 3 — `kind:<k>:selected`: this kind AND in the selection\n * 2 — `kind:<k>` / `affordance:<k>`: one named kind\n * 1 — `'empty'` / `'selected-body'` / `'unselected-body'` / `{ kindOf }`\n * 0 — no target\n *\n * A predicate stays at 1 because its narrowness is unknowable statically —\n * `hit == null` and `isRotateHandle` are the same shape here.\n */\nfunction targetRank(target: TargetSpec | undefined): number {\n if (target === undefined) return 0;\n const form = parseTargetSpec(target);\n if (form === null) return 1;\n switch (form.form) {\n case 'kind': return form.requireSelected ? 3 : 2;\n case 'affordance': return 2;\n case 'body': return 1;\n case 'predicate': return 1;\n default: {\n const _exhaustive: never = form;\n void _exhaustive;\n return 1;\n }\n }\n}\n\nfunction specTargetOf(spec: GestureSpec): TargetSpec | undefined {\n return 'target' in spec ? spec.target : undefined;\n}\n\n/**\n * Rank a `PhaseSpec` by how much it narrows, on the same graduated principle\n * as `targetRank`. A phase atom constrains two axes — which channel, and its\n * lifecycle state — and each may be wildcarded:\n *\n * 2 — both concrete: `{ channel: '&' | '<toolId>', phase: 'initial' }`,\n * which is also what the bare-keyword shorthand desugars to\n * 1 — one axis wildcarded: `{ channel: '*', phase: 'engaged' }`\n * 0 — `{ channel: '*', phase: '*' }`, or no `phase` field at all\n *\n * The `*:*` case scoring 0 is the point: it matches everything `matchPhase`\n * would have matched with no spec, so grading it above an undeclared phase\n * would let a binding buy precedence with a constraint that constrains\n * nothing — CSS's `:where()` problem.\n *\n * An atom list is a union (`matchPhase` returns true when ANY atom matches),\n * so the list is as broad as its broadest atom and takes the **minimum**.\n */\nfunction phaseRank(spec: PhaseSpec | undefined): number {\n if (spec === undefined) return 0;\n const atoms = typeof spec === 'string'\n ? [{ channel: '&', phase: spec } as PhaseAtom]\n : spec;\n if (atoms.length === 0) return 0;\n let min = 2;\n for (const a of atoms) {\n const rank = (a.channel === '*' ? 0 : 1) + (a.phase === '*' ? 0 : 1);\n if (rank < min) min = rank;\n }\n return min;\n}\n\n/** CSS-style specificity tuple for a GestureSpec. Higher tuple wins under\n * lexicographic compare. Dimensions, in order of precedence:\n *\n * [0] target — how much the spec's target narrows; see `targetRank`.\n * [1] mods — count of required modifier keys (shift/alt/ctrl/meta/mod).\n * `'optional'` does NOT count.\n * [2] phase — how much the spec's `phase` narrows; see `phaseRank`.\n * [3] exact — per-kind tiebreak: 2 for a drop/carry/paste spec with a\n * non-empty `types` MIME filter, else 1.\n *\n * Identical tuples fall back to registration order in the matcher's\n * stable sort. */\nexport function specificity(\n spec: GestureSpec,\n): readonly [number, number, number, number] {\n const t = targetRank(specTargetOf(spec));\n const mods = ('mods' in spec ? spec.mods : undefined) as ModSpec | undefined;\n const m = modsCount(mods);\n const p = phaseRank(('phase' in spec ? spec.phase : undefined) as PhaseSpec | undefined);\n // A consumer's `types: ['text/csv']` binding should win over the kit's\n // catch-all ingest binding.\n const typed =\n (spec.kind === 'drop' || spec.kind === 'carry' || spec.kind === 'paste') &&\n spec.types !== undefined && spec.types.length > 0\n ? 2 : 1;\n return [t, m, p, typed];\n}\n","/**\n * How far, in CSS pixels, a press must travel before it is a drag rather than\n * a click. `drag` specs match only past it: the pointer recognizer holds a\n * pointerdown back until the pointer crosses it, so a press-and-release that\n * stays under it never opens a drag.\n */\nexport const DRAG_THRESHOLD_PX = 4;\n\n/** Whether a pointer that went down at `from` has travelled far enough, by\n * `to`, to be a drag. Both points are client coordinates. */\nexport function pastDragThreshold(\n from: { clientX: number; clientY: number },\n to: { clientX: number; clientY: number },\n threshold: number = DRAG_THRESHOLD_PX,\n): boolean {\n return Math.hypot(to.clientX - from.clientX, to.clientY - from.clientY) >= threshold;\n}\n","/**\n * The times and distances that tell one pointer gesture from another. The\n * drag threshold sits with its helper in `ui/dragThreshold.ts`.\n */\n\n/** How long a touch or pen press is held before it fires `longPress`, in ms. */\nexport const LONG_PRESS_MS = 500;\n\n/** The longest gap between two clicks that still makes a double click, in ms:\n * the upper end of OS double-click settings. */\nexport const DOUBLE_CLICK_MAX_MS = 600;\n\n/** How far apart, in CSS pixels, two clicks may land and still make a double\n * click: the drift of a real mouse or trackpad between them. */\nexport const DOUBLE_CLICK_MAX_PX = 8;\n\n/** How far, in CSS pixels, a finger or the centroid of a multitouch gesture\n * may travel before the gesture stops being a tap. */\nexport const TAP_THRESHOLD_PX = 8;\n","/**\n * What the recognizer remembers of a press, and the events a release or a\n * hold on it synthesizes.\n */\nimport type { BodyKind, BodyTarget, DoubleClickBody, EventModifiers, InputEvent } from '../ui/inputEvent';\n\n/** Press-time state replayed onto a synthesized click, long-press or\n * contextmenu, whose matchers resolve targets against it. */\nexport interface PressFacts extends EventModifiers {\n target: unknown;\n clientX: number;\n clientY: number;\n /** World-space press point, forwarded onto the synthesized click as\n * `pressX`/`pressY` — see `ClickEvent`. */\n worldX: number;\n worldY: number;\n affordance?: unknown;\n bodyTarget?: BodyTarget;\n bodyKind?: BodyKind;\n /** Replayed onto the double click in place of `bodyTarget` and `bodyKind`. */\n doubleClickBody?: DoubleClickBody;\n}\n\n/** Where and how a press was released, for the click it turned out to be. */\nexport interface ReleaseFacts extends EventModifiers {\n target: unknown;\n clientX: number;\n clientY: number;\n worldX: number;\n worldY: number;\n}\n\n/** What a press landed on, as a spread-able partial with no `undefined`-valued keys. */\nexport function pressedOn(\n down: Pick<PressFacts, 'affordance' | 'bodyTarget' | 'bodyKind'>,\n): Pick<PressFacts, 'affordance' | 'bodyTarget' | 'bodyKind'> {\n return {\n ...(down.affordance !== undefined ? { affordance: down.affordance } : {}),\n ...(down.bodyTarget !== undefined ? { bodyTarget: down.bodyTarget } : {}),\n ...(down.bodyKind !== undefined ? { bodyKind: down.bodyKind } : {}),\n };\n}\n\n/** A press released where it went down, as a click, and as the double click\n * it is when it follows another closely. Both happen at the release, with the\n * release's modifiers, on what the press landed on. */\nexport function clickEvents(down: PressFacts, up: ReleaseFacts): { click: InputEvent; doubleclick: InputEvent } {\n const shared = {\n target: up.target,\n altKey: up.altKey,\n ctrlKey: up.ctrlKey,\n metaKey: up.metaKey,\n shiftKey: up.shiftKey,\n x: up.worldX,\n y: up.worldY,\n clientX: up.clientX,\n clientY: up.clientY,\n };\n const named = down.doubleClickBody;\n return {\n click: { kind: 'click', ...shared, ...pressedOn(down), pressX: down.worldX, pressY: down.worldY },\n doubleclick: {\n kind: 'doubleclick', ...shared,\n ...pressedOn(named ? { affordance: down.affordance, ...named } : down),\n },\n };\n}\n\n/** A held press as a long-press, and as the contextmenu it falls back to when\n * the long-press matches nothing. The fallback is what makes existing\n * `contextMenu` bindings reachable by touch with no consumer change. */\nexport function longPressEvents(down: PressFacts): { longpress: InputEvent; contextmenu: InputEvent } {\n const shared = {\n target: down.target,\n altKey: down.altKey,\n ctrlKey: down.ctrlKey,\n metaKey: down.metaKey,\n shiftKey: down.shiftKey,\n ...pressedOn(down),\n };\n const at = { x: down.worldX, y: down.worldY, clientX: down.clientX, clientY: down.clientY };\n return {\n longpress: { kind: 'longpress', ...at, ...shared },\n contextmenu: { kind: 'contextmenu', ...at, ...shared },\n };\n}\n","/** A press released in place: its click, and the double click a second one makes. */\nimport type { InputEvent } from '../ui/inputEvent';\nimport type { Point } from './multiTouch';\nimport { clickEvents, type PressFacts, type ReleaseFacts } from './pressFacts';\nimport { DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX } from './thresholds';\n\n/**\n * The click a double click would follow. Held by the host rather than the\n * recognizer when it has to outlive one: a host that rebuilds its recognizer\n * between two clicks would otherwise drop the double click.\n */\nexport interface ClickMemory {\n last: { t: number; clientX: number; clientY: number } | null;\n}\n\n/** Told of clicks without competing for them, as a binding would. */\nexport interface ClickObserver {\n /** After the click was dispatched, so whatever its binding changed is readable. */\n click?(world: Point): void;\n /** Before the double click is dispatched, whichever binding then handles it. */\n doubleClick?(world: Point): void;\n}\n\n/** What a release composed. `doubleClick` is absent unless one was dispatched. */\nexport interface ReleaseOutcome {\n doubleClick?: 'handled' | 'unhandled';\n}\n\n/** How close in time and place two clicks land to make a double click. */\nexport interface DoubleClickLimits {\n maxMs: number;\n maxPx: number;\n}\n\nexport function composeClick(\n down: PressFacts,\n up: ReleaseFacts,\n clicks: ClickMemory,\n now: () => number,\n dispatch: (ev: InputEvent) => 'handled' | 'unhandled',\n observer: ClickObserver,\n limits: DoubleClickLimits = { maxMs: DOUBLE_CLICK_MAX_MS, maxPx: DOUBLE_CLICK_MAX_PX },\n): ReleaseOutcome {\n const evs = clickEvents(down, up);\n const world = { x: up.worldX, y: up.worldY };\n dispatch(evs.click);\n observer.click?.(world);\n\n const t = now();\n const prev = clicks.last;\n const follows = prev !== null\n && t - prev.t < limits.maxMs\n && Math.hypot(up.clientX - prev.clientX, up.clientY - prev.clientY) < limits.maxPx;\n if (!follows) {\n clicks.last = { t, clientX: up.clientX, clientY: up.clientY };\n return {};\n }\n observer.doubleClick?.(world);\n const doubleClick = dispatch(evs.doubleclick);\n // Start over, so a third click composes nothing with the second.\n clicks.last = null;\n return { doubleClick };\n}\n","/** The one press being timed toward a long-press. */\nimport type { PressFacts } from './pressFacts';\n\n/** A clock and a timer, so a host or a test supplies its own. */\nexport interface RecognizerClock {\n now(): number;\n setTimer(fn: () => void, ms: number): unknown;\n clearTimer(timer: unknown): void;\n}\n\n/** A press held toward a long-press. */\nexport interface HeldPress {\n pointerId: number;\n /** A mouse never arms one. */\n pointerType: 'touch' | 'pen';\n press: PressFacts;\n /** `RecognizerClock.now()` when the hold started. */\n startedAt: number;\n /** How long the hold must last before the long-press fires, in ms. */\n duration: number;\n}\n\nexport interface LongPressHold {\n /** Start timing `press`; `fire` runs if it is still pending when its duration is up. */\n arm(press: HeldPress, fire: () => void): void;\n pendingFor(pointerId: number): boolean;\n /** Stop timing the pending press: any, or only `pointerId`'s. */\n cancel(pointerId?: number): void;\n}\n\n/**\n * One slot, not one per pointer: only a lone pointer arms a hold, and a second\n * one landing cancels it. `onChange` hears the pending press, and `null` when\n * it fires or is abandoned.\n */\nexport function createLongPressHold(\n clock: RecognizerClock,\n onChange: (pending: HeldPress | null) => void,\n): LongPressHold {\n let pending: { pointerId: number; timer: unknown } | null = null;\n\n const cancel = (pointerId?: number): void => {\n if (!pending || (pointerId !== undefined && pending.pointerId !== pointerId)) return;\n clock.clearTimer(pending.timer);\n pending = null;\n onChange(null);\n };\n\n return {\n arm(press, fire) {\n cancel();\n const timer = clock.setTimer(() => {\n pending = null;\n onChange(null);\n fire();\n }, press.duration);\n pending = { pointerId: press.pointerId, timer };\n onChange(press);\n },\n pendingFor: (pointerId) => pending?.pointerId === pointerId,\n cancel,\n };\n}\n","/** Two or more pointers down at once: their geometry, and whether the episode was a tap. */\nimport { TAP_THRESHOLD_PX } from './thresholds';\n\n/** A position in whatever space the recognizer's `positionOf` reports. */\nexport interface Point { x: number; y: number }\n\n/** Where two or more pointers sit: what `multiTouchGeometry` reads from their positions. */\nexport interface MultiTouchGeometry {\n centroid: Point;\n /** Distance between the first two pointers. */\n spread: number;\n /** Direction from the first pointer to the second, in degrees in (-180, 180],\n * growing clockwise on screen. */\n angle: number;\n}\n\n/** Every pointer's centroid, and the first two's spread and angle. All zero with fewer than 2 pointers. */\nexport function multiTouchGeometry(positions: Iterable<Point>): MultiTouchGeometry {\n const pts = [...positions];\n if (pts.length < 2) return { centroid: { x: 0, y: 0 }, spread: 0, angle: 0 };\n let sumX = 0;\n let sumY = 0;\n for (const p of pts) {\n sumX += p.x;\n sumY += p.y;\n }\n const dx = pts[1]!.x - pts[0]!.x;\n const dy = pts[1]!.y - pts[0]!.y;\n return {\n centroid: { x: sumX / pts.length, y: sumY / pts.length },\n spread: Math.sqrt(dx * dx + dy * dy),\n angle: (Math.atan2(dy, dx) * 180) / Math.PI,\n };\n}\n\ninterface Episode {\n /** The most fingers down at once. */\n fingers: number;\n centroid: Point;\n /** Where each finger was when it joined: a pinch about a still center moves\n * every finger and no centroid. */\n joinedAt: Map<number, Point>;\n moved: boolean;\n startedAt: number;\n}\n\nexport interface MultiTouchEpisode {\n /** A finger landed with at least two now down. `positions` is every held pointer's. */\n join(positions: ReadonlyMap<number, Point>, centroid: Point, now: number): void;\n moved(pointerId: number, to: Point): void;\n /**\n * The hand dropped below two fingers, its centroid last at `centroid`. The\n * peak finger count when the episode was a tap: brief, and nothing moved.\n */\n finish(centroid: Point, now: number, maxHoldMs: number): number | null;\n /** End the episode with no tap. */\n abandon(): void;\n}\n\n/** `tapPx` is how far a finger or the centroid may travel and still tap, read as each is measured. */\nexport function createMultiTouchEpisode(tapPx: () => number = () => TAP_THRESHOLD_PX): MultiTouchEpisode {\n let episode: Episode | null = null;\n return {\n join(positions, centroid, now) {\n if (!episode) {\n episode = {\n fingers: positions.size, centroid: { ...centroid }, joinedAt: new Map(), moved: false, startedAt: now,\n };\n } else {\n episode.fingers = positions.size;\n }\n for (const [id, p] of positions) {\n if (!episode.joinedAt.has(id)) episode.joinedAt.set(id, { ...p });\n }\n },\n moved(pointerId, to) {\n const from = episode?.joinedAt.get(pointerId);\n if (episode && from && Math.hypot(to.x - from.x, to.y - from.y) > tapPx()) episode.moved = true;\n },\n finish(centroid, now, maxHoldMs) {\n const e = episode;\n episode = null;\n if (!e) return null;\n // A hold as long as a long-press is not a tap, for two fingers as for one.\n const brief = now - e.startedAt < maxHoldMs;\n const still = Math.hypot(centroid.x - e.centroid.x, centroid.y - e.centroid.y) <= tapPx();\n return brief && !e.moved && still ? e.fingers : null;\n },\n abandon() { episode = null; },\n };\n}\n","/**\n * What a host feeds the pointer recognizer, one per pointer event, and the\n * pump events each becomes.\n */\nimport type {\n BodyKind, BodyTarget, DoubleClickBody, EventModifiers, InputEvent, PointerDownEvent, PointerSampleStylus,\n} from '../ui/inputEvent';\nimport { stylusOf } from '../ui/stylus';\nimport type { Point } from './multiTouch';\nimport { pressedOn, type PressFacts } from './pressFacts';\n\n/** One pointer event, in client space. */\nexport interface PointerSample extends EventModifiers, PointerSampleStylus {\n pointerId: number;\n clientX: number;\n clientY: number;\n /** What the originating event was aimed at. */\n target?: unknown;\n /**\n * When the input happened, on the recognizer clock's timeline: a DOM event's\n * `timeStamp` beside `performance.now()`. The windows between two inputs are\n * measured on it, so a long task that delays an event's handling does not\n * widen them. Read as the clock's `now()` when absent, 0, or ahead of it.\n */\n timeStamp?: number;\n}\n\n/** A pointer going down, with what the host found under it. */\nexport interface PressSample extends PointerSample {\n /** The world point the host hit-tested at. */\n x: number;\n y: number;\n /** `PointerEvent.pointerType`. Only `'touch'` and `'pen'` arm a long-press. */\n pointerType: string;\n affordance?: unknown;\n bodyTarget?: BodyTarget;\n bodyKind?: BodyKind;\n /** What a double click this press completes lands on, where not the body hit. */\n doubleClickBody?: DoubleClickBody;\n}\n\nexport function modifiersOf(e: EventModifiers): EventModifiers {\n return { altKey: e.altKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, shiftKey: e.shiftKey };\n}\n\nexport function pressFactsOf(s: PressSample): PressFacts {\n return {\n target: s.target,\n clientX: s.clientX,\n clientY: s.clientY,\n worldX: s.x,\n worldY: s.y,\n ...modifiersOf(s),\n ...pressedOn(s),\n ...(s.doubleClickBody !== undefined ? { doubleClickBody: s.doubleClickBody } : {}),\n };\n}\n\nconst at = (s: PointerSample, world: Point) => ({\n pointerId: s.pointerId, x: world.x, y: world.y, clientX: s.clientX, clientY: s.clientY, ...modifiersOf(s),\n});\n\nexport function pointerDownEvent(s: PressSample): PointerDownEvent {\n return { kind: 'pointerdown', target: s.target, ...at(s, s), ...stylusOf(s), ...pressedOn(s) };\n}\n\nexport function pointerMoveEvent(s: PointerSample, world: Point): InputEvent {\n return { kind: 'pointermove', ...at(s, world), ...stylusOf(s) };\n}\n\nexport function pointerUpEvent(s: PointerSample, world: Point): InputEvent {\n return { kind: 'pointerup', ...at(s, world) };\n}\n","/**\n * Turns pointer samples into the gestures they add up to: a press, the drag\n * it becomes past the threshold, the click it is when released in place, the\n * double click two of those make, a long-press, and multitouch.\n *\n * It decides with its sink's answers, so it is not a pure function of its\n * input: a long-press only spends its press when something handled it.\n */\nimport type { EventModifiers, InputEvent } from '../ui/inputEvent';\nimport { pastDragThreshold } from '../ui/dragThreshold';\nimport { composeClick, type ClickMemory, type ClickObserver, type ReleaseOutcome } from './click';\nimport { createLongPressHold, type HeldPress, type RecognizerClock } from './longPressHold';\nimport { createMultiTouchEpisode, multiTouchGeometry, type MultiTouchGeometry, type Point } from './multiTouch';\nimport { longPressEvents, type PressFacts } from './pressFacts';\nimport {\n modifiersOf, pointerDownEvent, pointerMoveEvent, pointerUpEvent, pressFactsOf,\n type PointerSample, type PressSample,\n} from './samples';\nimport { DRAG_THRESHOLD_PX } from '../ui/dragThreshold';\nimport { DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX, LONG_PRESS_MS, TAP_THRESHOLD_PX } from './thresholds';\n\n/** Where recognized events go. */\nexport interface RecognizerSink {\n dispatch(ev: InputEvent): 'handled' | 'unhandled';\n /** Whether a multitouch gesture of `fingers` fingers is running, to be pumped. */\n multiTouchInFlight(fingers: number): boolean;\n}\n\n/** What a host hears about beyond the events themselves, to drive press feedback. */\nexport interface RecognizerObserver extends ClickObserver {\n /** The press being held toward a long-press, or `null` once it fires or is abandoned. */\n holdChanged?(pending: HeldPress | null): void;\n /** A long-press something handled, as itself or as its contextmenu fallback. */\n longPress?(pointerType: 'touch' | 'pen'): void;\n}\n\n/** What {@link createPointerRecognizer} needs from its host. */\nexport interface PointerRecognizerOptions {\n sink: RecognizerSink;\n clock: RecognizerClock;\n /**\n * Client point to world point; the identity by default. Asked as each event\n * is built rather than once per sample: an event dispatched earlier in the\n * same sample, a pinch step say, may have moved the view.\n */\n toWorld?: (clientX: number, clientY: number) => Point;\n /** Client point to the space a multitouch centroid is reported in. The identity by default. */\n toSurface?: (client: Point) => Point;\n /** Long-press hold time in ms, read at each press. Default `LONG_PRESS_MS`. */\n longPressMs?: () => number | undefined;\n /** Longest gap in ms between two clicks of a double click, read at each click. Default `DOUBLE_CLICK_MAX_MS`. */\n doubleClickMs?: () => number | undefined;\n /** Farthest two clicks of a double click may land apart, in CSS px. Default `DOUBLE_CLICK_MAX_PX`. */\n doubleClickPx?: () => number | undefined;\n /** Farthest a multitouch tap's fingers may travel, in CSS px. Default `TAP_THRESHOLD_PX`. */\n tapPx?: () => number | undefined;\n /** Travel in CSS px that makes a press a drag, read at each move. Default `DRAG_THRESHOLD_PX`. */\n dragPx?: () => number | undefined;\n clicks?: ClickMemory;\n observer?: RecognizerObserver;\n}\n\n/** A recognizer for one surface. Its host feeds it every pointer sample the surface receives. */\nexport interface PointerRecognizer {\n press(sample: PressSample): void;\n /** A move of any pointer, held or not. */\n move(sample: PointerSample): void;\n release(sample: PointerSample): ReleaseOutcome;\n /** A held pointer ended without a release. */\n cancel(pointerId: number): void;\n /**\n * Whether a touch or pen that armed a long-press is still held. One still\n * pending fires here, ahead of its timer: a platform that reports the hold\n * itself is reporting the same one.\n */\n takeHold(): boolean;\n heldCount(): number;\n /** A held pointer's latest client position. */\n positionOf(pointerId: number): Point | undefined;\n /** Forget every held pointer and stop timing, dispatching nothing. */\n reset(): void;\n}\n\ninterface Held {\n pos: Point;\n /** The press, withheld until movement crosses the drag threshold. Null once\n * forwarded, spent by a long-press, or claimed by multitouch. */\n buffered: InputEvent | null;\n down: PressFacts;\n /** Set on a pointer that armed a long-press, for as long as it is held. */\n holdType?: 'touch' | 'pen';\n}\n\nfunction multiTouchEvent(\n fingers: number,\n mods: EventModifiers,\n more: MultiTouchGeometry | { end: 'commit' | 'cancel' },\n): InputEvent {\n return { kind: 'multitouch', fingers, ...modifiersOf(mods), ...more };\n}\n\nconst positionsOf = (held: ReadonlyMap<number, Held>): Map<number, Point> =>\n new Map([...held].map(([id, p]) => [id, p.pos]));\n\n/** The held pointers' geometry, plus `extra` points, with the centroid in surface space. */\nfunction heldGeometry(\n held: ReadonlyMap<number, Held>,\n toSurface: (client: Point) => Point,\n extra: Point[],\n): MultiTouchGeometry {\n const g = multiTouchGeometry([...positionsOf(held).values(), ...extra]);\n return { ...g, centroid: toSurface(g.centroid) };\n}\n\n/** A hold that lasted: a long-press, or the contextmenu it falls back to. */\nfunction fireLongPress(rec: Held | undefined, sink: RecognizerSink, observer: RecognizerObserver): void {\n if (!rec) return;\n const evs = longPressEvents(rec.down);\n let result = sink.dispatch(evs.longpress);\n if (result === 'unhandled') result = sink.dispatch(evs.contextmenu);\n if (result === 'unhandled') return;\n // The press is spent: its release must not click, nor a later move open a drag.\n rec.buffered = null;\n if (rec.holdType) observer.longPress?.(rec.holdType);\n}\n\n/** Each threshold as its option says at the moment of reading, else its constant. */\nfunction thresholdsOf(opts: PointerRecognizerOptions) {\n return {\n longPressMs: (): number => opts.longPressMs?.() ?? LONG_PRESS_MS,\n tapPx: (): number => opts.tapPx?.() ?? TAP_THRESHOLD_PX,\n dragPx: (): number => opts.dragPx?.() ?? DRAG_THRESHOLD_PX,\n doubleClick: () => ({\n maxMs: opts.doubleClickMs?.() ?? DOUBLE_CLICK_MAX_MS,\n maxPx: opts.doubleClickPx?.() ?? DOUBLE_CLICK_MAX_PX,\n }),\n };\n}\n\n/** When a sample's input happened, on `clock`'s timeline. */\nfunction sampleTime(clock: RecognizerClock): (s: PointerSample) => number {\n return (s) => {\n const now = clock.now();\n const t = s.timeStamp;\n return t !== undefined && t > 0 && t <= now ? t : now;\n };\n}\n\n/** Build a recognizer holding no pointers. It touches no DOM: time and timers come from `opts.clock`. */\nexport function createPointerRecognizer(opts: PointerRecognizerOptions): PointerRecognizer {\n const { sink, clock, observer = {}, toSurface = (p) => p } = opts;\n const world = (s: PointerSample): Point => opts.toWorld?.(s.clientX, s.clientY) ?? { x: s.clientX, y: s.clientY };\n const clicks = opts.clicks ?? { last: null };\n const held = new Map<number, Held>();\n const { longPressMs, tapPx, dragPx, doubleClick } = thresholdsOf(opts);\n const touches = createMultiTouchEpisode(tapPx);\n const hold = createLongPressHold(clock, (pending) => { observer.holdChanged?.(pending); });\n const geometry = (extra: Point[] = []) => heldGeometry(held, toSurface, extra);\n const happenedAt = sampleTime(clock);\n\n // MULTI-POINTER POLICY: multitouch takes every pointer that has not already\n // committed to a gesture, by clearing its buffered press. One that already\n // opened a drag has no buffer left to claim, so its drag survives the second\n // finger: yanking it from someone who rested a palm is worse than letting it finish.\n const claimForMultiTouch = (s: PointerSample): void => {\n hold.cancel();\n for (const p of held.values()) p.buffered = null;\n const g = geometry();\n touches.join(positionsOf(held), g.centroid, happenedAt(s));\n sink.dispatch(multiTouchEvent(held.size, s, g));\n };\n\n return {\n press(s) {\n const ev = pointerDownEvent(s);\n const rec: Held = { pos: { x: s.clientX, y: s.clientY }, buffered: ev, down: pressFactsOf(s) };\n held.set(s.pointerId, rec);\n // The press dispatches twice, to disjoint spec kinds: now for\n // `pointerDown` bindings, and buffered for `drag`. A second finger's is\n // withheld, or it would act under the pinch it belongs to.\n if (held.size < 2) sink.dispatch({ ...ev, stage: 'press' });\n if ((s.pointerType === 'touch' || s.pointerType === 'pen') && held.size === 1) {\n rec.holdType = s.pointerType;\n hold.arm(\n { pointerId: s.pointerId, pointerType: s.pointerType, press: rec.down, startedAt: clock.now(), duration: longPressMs() },\n () => { fireLongPress(held.get(s.pointerId), sink, observer); },\n );\n }\n if (held.size >= 2) claimForMultiTouch(s);\n },\n\n move(s) {\n const rec = held.get(s.pointerId);\n const to = { x: s.clientX, y: s.clientY };\n if (rec) rec.pos = to;\n touches.moved(s.pointerId, to);\n // The buffered press goes out before the move: it opens the drag the moves pump.\n if (rec?.buffered && pastDragThreshold(rec.down, s, dragPx())) {\n const press = rec.buffered;\n rec.buffered = null;\n hold.cancel(s.pointerId);\n sink.dispatch(press);\n }\n if (held.size >= 2 && sink.multiTouchInFlight(held.size)) {\n sink.dispatch(multiTouchEvent(held.size, s, geometry()));\n }\n sink.dispatch(pointerMoveEvent(s, world(s)));\n },\n\n release(s) {\n hold.cancel(s.pointerId);\n const before = held.size;\n const rec = held.get(s.pointerId);\n held.delete(s.pointerId);\n // Any finger lifting ends the multitouch gesture the hand was making.\n if (before >= 2) sink.dispatch(multiTouchEvent(before, s, { end: 'commit' }));\n if (before >= 2 && held.size < 2) {\n // The centroid as it was with this pointer still down.\n const fingers = touches.finish(\n geometry([{ x: s.clientX, y: s.clientY }]).centroid, happenedAt(s), longPressMs(),\n );\n if (fingers !== null) sink.dispatch({ kind: 'multitouchtap', fingers, ...modifiersOf(s) });\n }\n sink.dispatch(pointerUpEvent(s, world(s)));\n // A press still buffered never crossed the drag threshold, and nothing\n // else spent it. Without this, a tool binding `click` but not `drag`\n // would click on the release of a drag clear across the canvas.\n if (!rec?.buffered) return {};\n const at = world(s);\n const up = {\n target: s.target, clientX: s.clientX, clientY: s.clientY, worldX: at.x, worldY: at.y, ...modifiersOf(s),\n };\n return composeClick(rec.down, up, clicks, () => happenedAt(s), (ev) => sink.dispatch(ev), observer, doubleClick());\n },\n\n cancel(pointerId) {\n const rec = held.get(pointerId);\n if (!rec) return;\n const before = held.size;\n held.delete(pointerId);\n hold.cancel(pointerId);\n // A cancel carries no modifiers of its own, so these are the press's.\n if (before >= 2) sink.dispatch(multiTouchEvent(before, rec.down, { end: 'cancel' }));\n touches.abandon();\n sink.dispatch({ kind: 'pointercancel', pointerId, ...modifiersOf(rec.down) });\n },\n\n takeHold() {\n let holding = false;\n for (const [id, rec] of held) {\n if (!rec.holdType) continue;\n holding = true;\n if (!hold.pendingFor(id)) continue;\n hold.cancel(id);\n fireLongPress(rec, sink, observer);\n }\n return holding;\n },\n\n heldCount: () => held.size,\n positionOf: (pointerId) => held.get(pointerId)?.pos,\n reset() {\n hold.cancel();\n held.clear();\n touches.abandon();\n },\n };\n}\n","/** Elements that handle their own press and keys. */\nexport const CONTROL_SELECTOR = [\n 'button', 'input', 'select', 'textarea', 'a[href]', '[contenteditable=\"\"]', '[contenteditable=\"true\"]',\n '[role=\"button\"]', '[role=\"checkbox\"]', '[role=\"switch\"]', '[role=\"menuitem\"]', '[role=\"link\"]',\n].join(',');\n\n/**\n * Whether `target` sits in a control of its own somewhere inside `host` — a\n * toggle in a list row, a button over a canvas. The host's handlers leave such\n * an event to the control, so a host's press, click and keys never swallow its\n * controls'.\n */\nexport function isInControlWithin(target: EventTarget | null, host: Element): boolean {\n if (!(target instanceof Element)) return false;\n const control = target.closest(CONTROL_SELECTOR);\n return control !== null && control !== host && host.contains(control);\n}\n","/**\n * Which pointers are down on an element: pressed on it or inside it, with any\n * button, and not yet released. The one answer to \"is this move a hover\" for\n * everything listening on that element.\n */\nexport interface HeldPointers {\n count(): number;\n /** Stop reading. The element's listeners go with its last reader. */\n release(): void;\n}\n\ninterface Tracker {\n readers: number;\n /** Pointer id to whether its press reported button state at all. */\n held: Map<number, boolean>;\n detach(): void;\n}\n\nconst trackers = new WeakMap<Element, Tracker>();\n\nfunction attach(element: Element): Tracker {\n const doc = element.ownerDocument;\n const win = doc.defaultView;\n const held = new Map<number, boolean>();\n const down = (e: Event): void => {\n const p = e as PointerEvent;\n held.set(p.pointerId, !!p.buttons);\n };\n const up = (e: Event): void => { held.delete((e as PointerEvent).pointerId); };\n // A move with nothing held is the release this document never saw. Read\n // only for a press that reported buttons: synthesized events carry none.\n const move = (e: Event): void => {\n const p = e as PointerEvent;\n if (held.get(p.pointerId) && p.buttons === 0) held.delete(p.pointerId);\n };\n // A window that loses focus may never deliver the release.\n const blur = (): void => { held.clear(); };\n\n // Capture phase, so nothing that stops propagation can hide a press or its release.\n element.addEventListener('pointerdown', down, true);\n doc.addEventListener('pointerup', up, true);\n doc.addEventListener('pointercancel', up, true);\n doc.addEventListener('pointermove', move, true);\n win?.addEventListener('blur', blur);\n return {\n readers: 0,\n held,\n detach() {\n element.removeEventListener('pointerdown', down, true);\n doc.removeEventListener('pointerup', up, true);\n doc.removeEventListener('pointercancel', up, true);\n doc.removeEventListener('pointermove', move, true);\n win?.removeEventListener('blur', blur);\n },\n };\n}\n\n/**\n * Read the pointers held on `element`. Every reader of one element shares one\n * set of listeners, so they cannot disagree.\n */\nexport function heldPointers(element: Element): HeldPointers {\n let tracker = trackers.get(element);\n if (!tracker) {\n tracker = attach(element);\n trackers.set(element, tracker);\n }\n const shared = tracker;\n shared.readers += 1;\n let released = false;\n return {\n count: () => shared.held.size,\n release() {\n if (released) return;\n released = true;\n shared.readers -= 1;\n if (shared.readers > 0) return;\n shared.detach();\n if (trackers.get(element) === shared) trackers.delete(element);\n },\n };\n}\n","/** Returns true when the target takes typed text: an input, a textarea, or a contenteditable element. */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!target || !(target instanceof Element)) return false;\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((target as HTMLElement).isContentEditable) return true;\n const ce = target.getAttribute('contenteditable');\n return ce === 'true' || ce === '';\n}\n\nconst ACTIVATED_BY_KEY = [\n 'button', 'a[href]', 'summary', 'select',\n 'input[type=\"button\"]', 'input[type=\"submit\"]', 'input[type=\"reset\"]',\n 'input[type=\"checkbox\"]', 'input[type=\"radio\"]',\n '[role=\"button\"]', '[role=\"link\"]', '[role=\"checkbox\"]', '[role=\"switch\"]',\n '[role=\"menuitem\"]', '[role=\"tab\"]', '[role=\"option\"]',\n].join(', ');\n\n/**\n * True when `e` is Space or Enter on a focused control those keys activate — a\n * button, a link, a checkbox. The key is that control's, so a page-level\n * listener that claims it cancels the control's own activation.\n */\nexport function activatesFocusedControl(e: KeyboardEvent): boolean {\n if (e.key !== ' ' && e.key !== 'Enter') return false;\n return e.target instanceof Element && e.target.matches(ACTIVATED_BY_KEY);\n}\n\nconst SELECT_NAVIGATION = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown']);\n\nfunction selectOwnsKey(e: KeyboardEvent): boolean {\n if (!(e.target instanceof Element) || e.target.tagName !== 'SELECT') return false;\n if (e.metaKey || e.ctrlKey || e.altKey) return false;\n // A one-character `key` is a printable character, which a select reads as type-ahead.\n return SELECT_NAVIGATION.has(e.key) || e.key.length === 1;\n}\n\n/**\n * True when the key `e` reports belongs to the control it was typed on: Space\n * or Enter on anything those activate, and a `<select>`'s type-ahead\n * characters and navigation keys. A select claims nothing else, so Delete,\n * Escape, and every modifier chord typed on one are still a page-level\n * listener's to take. A text field is {@link isEditableTarget}'s question,\n * since it owns every key.\n */\nexport function focusedControlOwnsKey(e: KeyboardEvent): boolean {\n return activatesFocusedControl(e) || selectOwnsKey(e);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/grammar/gestures.ts","../src/grammar/modifiers.ts","../src/grammar/routeGrammar.ts","../src/grammar/keyRouteGrammar.ts","../src/ui/ingestTypes.ts","../src/ui/matchTarget.ts","../src/ui/match.ts","../src/grammar/specKinds.ts","../src/grammar/routeToSpec.ts","../src/grammar/describeRoute.ts","../src/grammar/modifierComboToParsed.ts","../src/ui/stylus.ts","../src/ui/spec.ts","../src/ui/platform.ts","../src/ui/keySpecsFromMods.ts","../src/ui/keySpecsFromShortcut.ts","../src/ui/keySpecFromCode.ts","../src/ui/formatShortcut.ts","../src/ui/keySugar.ts","../src/ui/fixedSeat.ts","../src/ui/specificity.ts","../src/ui/dragThreshold.ts","../src/recognizer/thresholds.ts","../src/recognizer/pressFacts.ts","../src/recognizer/click.ts","../src/recognizer/longPressHold.ts","../src/recognizer/multiTouch.ts","../src/recognizer/samples.ts","../src/recognizer/pointerRecognizer.ts","../src/ui/controlTarget.ts","../src/ui/heldPointers.ts","../src/ui/keyOwner.ts"],"names":["held","phase","key","mods","MOD_ORDER","at"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Declarative gesture taxonomy. Single source of truth for:\n * - which gestures hit-test (have a `.target` slot in the route string)\n * - which gestures carry an argument and what values are legal\n * - the default arg value (used when none is specified in a route)\n *\n * Reflection, matcher, and inspector UI all read this table. Adding a new\n * gesture name in one place updates every consumer.\n */\n\nexport type GestureName =\n | 'click'\n | 'pointerDown'\n | 'hover'\n | 'dblTap'\n | 'drag'\n | 'wheel'\n | 'pinch'\n | 'keyDown'\n | 'keyUp'\n | 'keyHeld'\n | 'contextMenu'\n | 'longPress'\n | 'multiTouch'\n | 'multiTouchTap'\n | 'drop'\n | 'carry'\n | 'paste';\n\n/**\n * Gesture kinds an affordance claim can bar, in the spec vocabulary bindings\n * are written in. `'pointer'` is one token because `pointerDown` / `click` /\n * `drag` are a single press protocol — at the event level the first two are\n * the same `kind: 'pointerdown'`, told apart only by `stage`.\n */\nexport type ClaimableGesture =\n | 'pointer'\n | 'doubleClick'\n | 'contextMenu'\n | 'longPress'\n | 'wheel'\n | 'pinch';\n\n/** Declares the argument a gesture carries: what it is called, which values\n * are legal, and what an omitted arg slot means. */\nexport interface GestureArgSpec {\n /** Display name for the arg in inspector chips (`direction`, `key`, `fingers`). */\n name: string;\n /** Acceptable values. `'free'` means any string (e.g. key names). */\n values: readonly string[] | 'free';\n /** Value an omitted arg slot takes. Must be in `values` unless\n * `values === 'free'`. Omit it to make an omitted slot mean the `'*'`\n * wildcard — match every value. */\n default?: string;\n}\n\n/** What the grammar knows about one gesture — the form of input itself, not\n * any action bound to it. */\nexport interface GestureDescriptor {\n name: GestureName;\n /** Does the route's `.target` slot apply? Targetless gestures (`wheel`,\n * `keyDown/Up`, `multiTouch`, `multiTouchTap`) elide it entirely in the v2 grammar. */\n hasTarget: boolean;\n /** Optional argument spec. Encoded as `gesture(value)` in the route string. */\n arg?: GestureArgSpec;\n}\n\n/** The gesture taxonomy: one descriptor per gesture the grammar recognizes.\n * Adding a gesture here is what makes it parseable, matchable and\n * inspectable. */\nexport const GESTURE_DESCRIPTORS: readonly GestureDescriptor[] = [\n { name: 'click', hasTarget: true },\n { name: 'pointerDown', hasTarget: true },\n { name: 'hover', hasTarget: true, arg: { name: 'motion', values: ['move', 'leave'], default: 'move' } },\n { name: 'dblTap', hasTarget: true },\n { name: 'drag', hasTarget: true },\n { name: 'wheel', hasTarget: true, arg: { name: 'direction', values: ['up', 'down', '*'], default: '*' } },\n { name: 'pinch', hasTarget: true, arg: { name: 'direction', values: ['in', 'out', '*'], default: '*' } },\n { name: 'keyDown', hasTarget: false, arg: { name: 'key', values: 'free' } },\n { name: 'keyUp', hasTarget: false, arg: { name: 'key', values: 'free' } },\n { name: 'keyHeld', hasTarget: false, arg: { name: 'key', values: 'free' } },\n { name: 'contextMenu', hasTarget: true },\n { name: 'longPress', hasTarget: true },\n { name: 'multiTouch', hasTarget: false, arg: { name: 'fingers', values: ['2', '3', '4'] } },\n { name: 'multiTouchTap', hasTarget: false, arg: { name: 'fingers', values: ['2', '3', '4'] } },\n // The arg is the MIME-glob filter. No default: a spec with no `types`\n // matches any payload, which is what an omitted arg slot means for a\n // `'free'` arg.\n { name: 'drop', hasTarget: false, arg: { name: 'types', values: 'free' } },\n { name: 'carry', hasTarget: true, arg: { name: 'types', values: 'free' } },\n { name: 'paste', hasTarget: false, arg: { name: 'types', values: 'free' } },\n];\n\nconst BY_NAME = new Map<string, GestureDescriptor>(\n GESTURE_DESCRIPTORS.map((d) => [d.name, d]),\n);\n\n/** Look up a gesture's descriptor. Throws on an unknown name — callers\n * holding an unvalidated string should gate on `isKnownGestureName` first. */\nexport function getGestureDescriptor(name: GestureName): GestureDescriptor {\n const d = BY_NAME.get(name);\n if (!d) throw new Error(`unknown gesture: ${name}`);\n return d;\n}\n\n/** Whether a string names a gesture the grammar recognizes. */\nexport function isKnownGestureName(name: string): name is GestureName {\n return BY_NAME.has(name);\n}\n","/** All valid keys for a modifier sub-table in a route entry. Canonical\n * order: mod → shift → alt (matches formatShortcut). */\nexport type ModifierCombo =\n | 'default'\n | 'mod' | 'shift' | 'alt'\n | 'mod+shift' | 'mod+alt' | 'shift+alt'\n | 'mod+shift+alt';\n\n/** Convenience: produce the canonical ModifierCombo from modifiers passed\n * in any order. Useful in computed property syntax:\n *\n * ```ts\n * 'rect': {\n * [mods('shift')]: addToSelection,\n * [mods('alt', 'shift')]: cloneAndAdd, // → 'shift+alt'\n * }\n * ```\n */\nexport function mods(\n ...keys: ReadonlyArray<'mod' | 'shift' | 'alt'>\n): ModifierCombo {\n if (keys.length === 0) return 'default';\n const set = new Set(keys);\n return [\n set.has('mod') && 'mod',\n set.has('shift') && 'shift',\n set.has('alt') && 'alt',\n ].filter(Boolean).join('+') as ModifierCombo;\n}\n","/**\n * Route-string grammar v3:\n *\n * route = phaseSlot WS gesture WS argSlot? WS targetSlot? WS modSlot?\n * phaseSlot = '[' phaseList ']'\n * phaseList = phaseAtom (WS ',' WS phaseAtom)*\n * phaseAtom = (channel ':')? phaseValue -- bare phaseValue ≡ '&:phaseValue'\n * channel = '&' | '*' | toolId -- '&' = the binding's own tool\n * phaseValue = 'initial' | 'engaged' | '*'\n * argSlot = '(' argValue ')' -- whitespace inside parens is significant\n * targetSlot = '=>' WS targetValue -- omitted slot defaults to '*' for hasTarget\n * modSlot = modAtom (WS modAtom)*\n * modAtom = sigil (modName | 'held')\n * sigil = '+' | '?' -- ! @ # $ % ^ & * reserved as id-prefix\n * modName = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta'\n *\n * `held` is a pressed button, read as a modifier is: `?held` a button may be\n * held, `+held` one must be, absent none may. Only `hover` takes it.\n *\n * The truly-loose form (any channel, any phase) is `[*:*]`.\n *\n * Examples:\n * [initial] click => empty +shift -- self idle\n * [engaged] wheel -- self mid-gesture\n * [rect:engaged] wheel -- when rect tool is mid-gesture\n * [*:engaged] keyDown(Delete) -- when any tool is mid-gesture\n * [initial,engaged] contextMenu => empty -- either self phase\n * [*] click => empty -- self, any phase\n */\nimport { getGestureDescriptor, isKnownGestureName, type GestureName } from './gestures';\nimport type { RoutePhase } from '../ui/phase';\n\n/** Channel reference for a phase atom. `'&'` = the binding's own tool;\n * `'*'` = any tool; otherwise a registered tool id. */\nexport type ChannelRef = '&' | '*' | string;\n\n/** One element of a phase list: a (channel, phase) pair. The default\n * channel (omitted in the shorthand) is `'&'`. `phase: '*'` means\n * \"any phase of the given channel\". */\nexport interface PhaseAtom {\n channel: ChannelRef;\n phase: RoutePhase | '*';\n}\n\n/** Reserved id-prefix sigils. Tool ids, action ids, channel names, target\n * kinds, and arg values may not start with any of these — keeps the\n * parser unambiguous and reserves single-char prefixes for future grammar\n * extensions. */\nexport const RESERVED_ID_PREFIXES: ReadonlySet<string> = new Set([\n '!', '@', '#', '$', '%', '^', '&', '*',\n]);\n\n/** Reserved bareword channel/id names. These are keywords in the phase\n * slot — a tool may not register with one of these as its id (collides\n * with the bare-phase shorthand). */\nexport const RESERVED_ID_NAMES: ReadonlySet<string> = new Set([\n 'initial', 'engaged',\n]);\n\n/** v3 modifier requirement on a single modifier key. Absent from a\n * `ParsedModifiers` map means \"must not be held\" (the strict default). */\nexport type ModRequirement = 'required' | 'optional';\n\n/** Canonical modifier names accepted in the modSlot, in canonical order. */\nexport const VALID_MOD_NAMES = ['mod', 'shift', 'alt', 'ctrl', 'meta'] as const;\n\n/** A single modifier name accepted in the modSlot. */\nexport type ModifierKey = (typeof VALID_MOD_NAMES)[number];\n\n/** Parsed-form modifiers — structured map; absent keys are implicitly\n * forbidden. Empty object = \"no modifiers held\". */\nexport type ParsedModifiers = Partial<Record<ModifierKey, ModRequirement>>;\n\n/** Reserved sigil characters. The parser rejects any of these with a\n * \"reserved for future use\" error so introducing them later is\n * non-breaking. `*` is NOT in this set — it's the universal wildcard. */\nexport const RESERVED_SIGILS: ReadonlySet<string> = new Set(['!', '@', '#', '$', '%', '^', '&']);\n\n/** Active (parseable) sigils today: `+` required, `?` optional. */\nexport const ACTIVE_SIGILS: ReadonlySet<string> = new Set(['+', '?']);\n\n/** Runtime membership test for {@link ModifierKey}, for validating a modifier\n * name that arrives as a plain string. */\nconst MOD_NAME_SET: ReadonlySet<string> = new Set(VALID_MOD_NAMES);\nexport { MOD_NAME_SET };\n\n/** v3 parsed-route shape. */\nexport interface ParsedRoute {\n /** One or more phase atoms (channel + phase). Empty array is invalid.\n * Bare-phase shorthand in the source string desugars to channel `'&'`,\n * so `[engaged]` parses to `[{ channel: '&', phase: 'engaged' }]`. */\n phases: readonly PhaseAtom[];\n gesture: GestureName;\n /** Resolved arg. For arg-bearing gestures, the descriptor's default\n * fills in when the slot is omitted (e.g. `wheel` → `arg: '*'`).\n * Undefined for gestures whose descriptor has no `arg`. */\n arg: string | undefined;\n /** For hasTarget gestures: target string with `'*'` as the wildcard\n * sentinel. Defaults to `'*'` when the slot is omitted. Undefined for\n * hasTarget=false gestures. */\n target: string | undefined;\n /** Structured modifier requirements; empty map = \"no modifiers held\". */\n modifiers: ParsedModifiers;\n /** Whether a pressed button may or must be held. Absent, none may. Only on\n * `hover`. */\n held?: ModRequirement;\n}\n\n/** Parse a route string into its slots, filling in the shorthand defaults the\n * grammar defines (bare phases mean channel `&`; an omitted arg or target\n * slot takes the gesture descriptor's default). Throws with the offending\n * input on anything the grammar does not accept, including sigils reserved\n * for later versions. */\nexport function parseRoute(input: string): ParsedRoute {\n // 1) Extract bracketed phaseSlot from the head.\n const trimmed = input.trim();\n if (!trimmed.startsWith('[')) {\n throw new Error(`invalid route (phase brackets required): ${input}`);\n }\n const closeIdx = trimmed.indexOf(']');\n if (closeIdx < 0) throw new Error(`invalid route (unclosed phase bracket): ${input}`);\n const phaseListRaw = trimmed.slice(1, closeIdx).trim();\n const phases = parsePhaseList(phaseListRaw, input);\n let rest = trimmed.slice(closeIdx + 1).trim();\n\n // 2) Pull off the gesture name (alphanumeric).\n const gestureMatch = /^([A-Za-z]+)/.exec(rest);\n if (!gestureMatch) throw new Error(`invalid route (no gesture name): ${input}`);\n const gestureName = gestureMatch[1]!;\n if (!isKnownGestureName(gestureName)) {\n throw new Error(`invalid route (unknown gesture \"${gestureName}\"): ${input}`);\n }\n rest = rest.slice(gestureMatch[0].length).trimStart();\n const desc = getGestureDescriptor(gestureName);\n\n // 3) Optional argSlot: `(...)`. Whitespace inside parens is significant.\n let arg: string | undefined;\n if (rest.startsWith('(')) {\n const closeArg = rest.indexOf(')');\n if (closeArg < 0) throw new Error(`invalid route (unbalanced arg parens): ${input}`);\n const argRaw = rest.slice(1, closeArg); // no trim — whitespace significant\n if (!desc.arg) throw new Error(`invalid route (${gestureName} has no arg): ${input}`);\n if (argRaw !== '*' && desc.arg.values !== 'free' && !desc.arg.values.includes(argRaw)) {\n throw new Error(`invalid route (\"${argRaw}\" not in ${desc.arg.values.join('|')}): ${input}`);\n }\n arg = argRaw;\n rest = rest.slice(closeArg + 1).trimStart();\n } else if (desc.arg) {\n arg = desc.arg.default ?? '*';\n }\n\n // 4) Optional targetSlot: `=> <target>`. Elided \"=> *\" defaults to '*' for hasTarget gestures.\n let target: string | undefined;\n if (rest.startsWith('=>')) {\n if (!desc.hasTarget) throw new Error(`invalid route (${gestureName} has no target): ${input}`);\n rest = rest.slice(2).trimStart();\n const tgtMatch = /^([^\\s+?!@#$%^&]+)/.exec(rest);\n if (!tgtMatch) throw new Error(`invalid route (missing target after \"=>\"): ${input}`);\n target = tgtMatch[1]!;\n rest = rest.slice(tgtMatch[0].length).trimStart();\n } else if (desc.hasTarget) {\n target = '*';\n }\n\n // 5) modSlot — zero or more sigil-prefixed atoms.\n const modifiers: ParsedModifiers = {};\n let held: ModRequirement | undefined;\n while (rest.length > 0) {\n const ch = rest[0]!;\n if (RESERVED_SIGILS.has(ch)) {\n throw new Error(`invalid route (\"${ch}\" is reserved for future use): ${input}`);\n }\n if (!ACTIVE_SIGILS.has(ch)) {\n throw new Error(`invalid route (unexpected \"${ch}\" at \"${rest}\"): ${input}`);\n }\n const sigil = ch;\n rest = rest.slice(1);\n const nameMatch = /^([a-z]+)/.exec(rest);\n if (!nameMatch) throw new Error(`invalid route (sigil \"${sigil}\" without modifier name): ${input}`);\n const name = nameMatch[1]!;\n if (name === HELD) {\n if (gestureName !== 'hover') throw new Error(`invalid route (${gestureName} takes no \"${HELD}\"): ${input}`);\n if (held !== undefined) throw new Error(`invalid route (duplicate \"${HELD}\"): ${input}`);\n held = sigil === '+' ? 'required' : 'optional';\n rest = rest.slice(nameMatch[0].length).trimStart();\n continue;\n }\n if (!MOD_NAME_SET.has(name)) {\n throw new Error(`invalid route (unknown modifier \"${name}\"): ${input}`);\n }\n if (modifiers[name as ModifierKey] !== undefined) {\n throw new Error(`invalid route (duplicate modifier \"${name}\"): ${input}`);\n }\n modifiers[name as ModifierKey] = sigil === '+' ? 'required' : 'optional';\n rest = rest.slice(nameMatch[0].length).trimStart();\n }\n\n return { phases, gesture: gestureName, arg, target, modifiers, ...(held ? { held } : {}) };\n}\n\n/** The modSlot atom for a pressed button. */\nconst HELD = 'held';\n\nfunction parsePhaseList(raw: string, input: string): readonly PhaseAtom[] {\n if (raw === '') throw new Error(`invalid route (empty phase list): ${input}`);\n const tokens = raw.split(',').map((p) => p.trim()).filter((p) => p.length > 0);\n if (tokens.length === 0) throw new Error(`invalid route (empty phase list): ${input}`);\n return tokens.map((t) => parsePhaseAtom(t, input));\n}\n\nconst VALID_PHASES: ReadonlySet<string> = new Set(['initial', 'engaged', '*']);\n\nfunction parsePhaseAtom(raw: string, input: string): PhaseAtom {\n // Split on the channel/phase separator. `parts.length === 1` is the\n // bare-phase shorthand (channel defaults to '&').\n const parts = raw.split(':');\n if (parts.length > 2) {\n throw new Error(`invalid route (phase atom \"${raw}\" has multiple \":\"): ${input}`);\n }\n if (parts.length === 1) {\n const phase = parts[0]!;\n if (!VALID_PHASES.has(phase)) {\n throw new Error(`invalid route (unknown phase \"${phase}\" in \"${raw}\"): ${input}`);\n }\n return { channel: '&', phase: phase as PhaseAtom['phase'] };\n }\n // parts.length === 2 — explicit channel:phase form.\n const channel = parts[0]!;\n const phase = parts[1]!;\n if (channel === '') {\n throw new Error(`invalid route (empty channel before \":\" in \"${raw}\"): ${input}`);\n }\n if (!VALID_PHASES.has(phase)) {\n throw new Error(`invalid route (unknown phase \"${phase}\" in \"${raw}\"): ${input}`);\n }\n if (channel !== '&' && channel !== '*') {\n if (RESERVED_ID_NAMES.has(channel)) {\n throw new Error(`invalid route (channel \"${channel}\" is a reserved phase keyword): ${input}`);\n }\n if (RESERVED_ID_PREFIXES.has(channel[0]!)) {\n throw new Error(`invalid route (channel \"${channel}\" starts with reserved sigil \"${channel[0]}\"): ${input}`);\n }\n }\n return { channel, phase: phase as PhaseAtom['phase'] };\n}\n\n/** Render a single phase atom in canonical shorthand form. `&` channel\n * is elided (\"`engaged`\", \"`*`\"); other channels use the explicit\n * `channel:phase` form (\"`rect:engaged`\", \"`*:*`\"). */\nexport function formatPhaseAtom(a: PhaseAtom): string {\n if (a.channel === '&') return a.phase;\n return `${a.channel}:${a.phase}`;\n}\n\n/** Visual-collapse pass: given a list of route strings, fold pairs that\n * differ ONLY in `shift` presence (one has `+shift`, the other doesn't,\n * everything else identical) into a single route with `?shift`.\n *\n * Preserves input order — the first member of each fold-pair holds the\n * position; the second is dropped. Does NOT fold other modifier\n * pairs (alt/ctrl/meta/mod) — those tend to carry meaning across the\n * same key.\n */\nexport function collapseShiftPairs(routes: readonly string[]): string[] {\n if (routes.length < 2) return [...routes];\n const parsed = routes.map((r) => ({ raw: r, p: parseRoute(r) }));\n const consumed = new Set<number>();\n const out: string[] = [];\n for (let i = 0; i < parsed.length; i++) {\n if (consumed.has(i)) continue;\n const a = parsed[i]!;\n // Look ahead for a twin: same gesture/arg/target/phases/mods-except-shift.\n let twinIndex = -1;\n for (let j = i + 1; j < parsed.length; j++) {\n if (consumed.has(j)) continue;\n const b = parsed[j]!;\n if (isShiftTwin(a.p, b.p)) { twinIndex = j; break; }\n }\n if (twinIndex < 0) { out.push(a.raw); continue; }\n consumed.add(twinIndex);\n // Emit the union with shift marked optional.\n const folded: ParsedRoute = {\n ...a.p,\n modifiers: { ...withoutShift(a.p.modifiers), shift: 'optional' },\n };\n out.push(formatRoute(folded));\n }\n return out;\n}\n\nfunction isShiftTwin(a: ParsedRoute, b: ParsedRoute): boolean {\n if (a.gesture !== b.gesture) return false;\n if (a.held !== b.held) return false;\n if (a.arg !== b.arg) return false;\n if (a.target !== b.target) return false;\n if (!samePhases(a.phases, b.phases)) return false;\n // Exactly one must have shift required; the other must lack shift.\n const aShift = a.modifiers.shift;\n const bShift = b.modifiers.shift;\n const aHas = aShift === 'required';\n const bHas = bShift === 'required';\n if (!(aHas !== bHas)) return false; // one and only one has shift\n if (aShift === 'optional' || bShift === 'optional') return false; // already optional\n // Every other modifier must match exactly.\n for (const name of VALID_MOD_NAMES) {\n if (name === 'shift') continue;\n if (a.modifiers[name] !== b.modifiers[name]) return false;\n }\n return true;\n}\n\nfunction samePhases(\n a: readonly PhaseAtom[],\n b: readonly PhaseAtom[],\n): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i]!.channel !== b[i]!.channel || a[i]!.phase !== b[i]!.phase) return false;\n }\n return true;\n}\n\nfunction withoutShift(m: ParsedModifiers): ParsedModifiers {\n const { shift: _shift, ...rest } = m;\n void _shift;\n return rest;\n}\n\nconst MOD_ORDER: readonly ModifierKey[] = ['mod', 'shift', 'alt', 'ctrl', 'meta'];\n\n/** Render a parsed route back to a canonical route string: shorthand where\n * the grammar has it, defaulted slots elided, modifiers in canonical order.\n * `parseRoute(formatRoute(r))` yields `r` again. */\nexport function formatRoute(r: ParsedRoute): string {\n const desc = getGestureDescriptor(r.gesture);\n\n // Phase slot — comma-separated atoms in source order; canonical\n // shorthand per atom (`&:engaged` → `engaged`, etc.).\n const phaseStr = `[${r.phases.map(formatPhaseAtom).join(',')}]`;\n\n let out = `${phaseStr} ${r.gesture}`;\n\n // Arg slot — elide the value an omitted slot would parse back to. A\n // descriptor with no declared default takes '*', same as the target slot.\n if (desc.arg && r.arg !== undefined && r.arg !== (desc.arg.default ?? '*')) {\n out += `(${r.arg})`;\n }\n\n // Target slot — elide \"*\" (wildcard default for hasTarget gestures).\n if (desc.hasTarget && r.target !== undefined && r.target !== '*') {\n out += ` => ${r.target}`;\n }\n\n // Mod atoms in canonical order, space-separated.\n for (const name of MOD_ORDER) {\n const req = r.modifiers[name];\n if (req === 'required') out += ` +${name}`;\n else if (req === 'optional') out += ` ?${name}`;\n }\n if (r.held === 'required') out += ` +${HELD}`;\n else if (r.held === 'optional') out += ` ?${HELD}`;\n\n return out;\n}\n","/**\n * Mini-grammar for the `arg` slot of `keyDown` / `keyUp` routes.\n *\n * keyRoute = key ('?' optionalMod)*\n * optionalMod = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta'\n *\n * `?shift` means \"shift may or may not be held; either fires this route.\"\n * Required modifiers still belong in the route's `:modifiers` slot — this\n * grammar only widens which events match, never narrows.\n */\nimport type { KeySpec, ModSpec } from '../ui/spec';\nimport { VALID_MOD_NAMES, type ModifierKey } from './routeGrammar';\n\n/** An optional modifier in a key route — the same set as the canonical\n * {@link ModifierKey}. */\nexport type OptionalMod = ModifierKey;\nconst OPTIONAL_SET = new Set<string>(VALID_MOD_NAMES);\n\n/** A key route split into the key itself and the modifiers whose state does\n * not affect the match. */\nexport interface ParsedKeyRoute {\n key: string;\n optionalMods: readonly OptionalMod[];\n}\n\n/** Parse the `arg` slot of a `keyDown` / `keyUp` route. Throws on an empty\n * key, an unrecognized optional modifier, or a repeated one. */\nexport function parseKeyRoute(input: string): ParsedKeyRoute {\n const [key, ...mods] = input.split('?');\n if (!key) throw new Error(`invalid key route (empty key): ${input}`);\n const seen = new Set<string>();\n for (const m of mods) {\n if (!OPTIONAL_SET.has(m)) throw new Error(`unknown optional modifier \"${m}\" in ${input}`);\n if (seen.has(m)) throw new Error(`duplicate optional modifier \"${m}\" in ${input}`);\n seen.add(m);\n }\n return { key, optionalMods: mods as OptionalMod[] };\n}\n\n/** Render a parsed key route back to its canonical source form. Round-trips\n * with `parseKeyRoute`. */\nexport function formatKeyRoute(r: ParsedKeyRoute): string {\n return r.optionalMods.length === 0 ? r.key : `${r.key}?${r.optionalMods.join('?')}`;\n}\n\n/** Build a runtime KeySpec from a parsed key route. Each optional modifier\n * becomes `mods.<name>: 'optional'`. The matcher's `matchModifiers`\n * honors `'optional'` uniformly across `mod`, `shift`, `alt`, `ctrl`,\n * and `meta`. */\nexport function keyRouteToSpec(r: ParsedKeyRoute): KeySpec {\n const mods: ModSpec = {};\n for (const m of r.optionalMods) mods[m] = 'optional';\n const spec: KeySpec = { kind: 'key', key: r.key };\n if (Object.keys(mods).length > 0) spec.mods = mods;\n return spec;\n}\n","/** Which external content a `drop` or `paste` spec's MIME globs let through. */\n\n/** MIME-glob match: `'image/*'` prefix-matches the major type; anything\n * else is an exact (case-insensitive) match; bare `'*'` or `'*\\/*'` matches all. */\nexport function mimeMatchesGlob(mime: string, glob: string): boolean {\n const m = mime.toLowerCase();\n const g = glob.toLowerCase();\n if (g === '*' || g === '*/*') return true;\n if (g.endsWith('/*')) return m.startsWith(g.slice(0, -1));\n return m === g;\n}\n\n/** The MIME of an item whose type is not known yet: a file hovering in an OS\n * drag, which some browsers do not name until it is dropped. */\nexport const UNKNOWN_MIME = '*/*';\n\n/** True if ANY item's MIME matches ANY of the `types` globs.\n * `types: []` (empty) ≡ omitted = match any. An item of\n * {@link UNKNOWN_MIME} passes every glob. */\nexport function matchIngestTypes(\n items: readonly { mime: string }[],\n types: string[] | undefined,\n): boolean {\n if (!types || types.length === 0) return true;\n return items.some((it) => it.mime === UNKNOWN_MIME || types.some((g) => mimeMatchesGlob(it.mime, g)));\n}\n","/** Target matching: a `TargetSpec` against what an event classified under its point. */\n\nimport type { TargetSpec, TargetPredicate } from './spec';\n\n/** Read a `.kind` string off an affordance hit, or `undefined` when the hit\n * is absent or shaped differently. */\nfunction affordanceKindOf(target: unknown): string | undefined {\n if (typeof target !== 'object' || target === null) return undefined;\n const k = (target as { kind?: unknown }).kind;\n return typeof k === 'string' ? k : undefined;\n}\n\n/**\n * A {@link TargetSpec} resolved to its form, with the parts each form encodes\n * in its string pulled out. This is the one enumeration of the target forms:\n * sites that act on it switch on `form` exhaustively rather than re-deriving\n * the prefixes.\n */\nexport type TargetSpecForm =\n | { form: 'body'; body: 'empty' | 'selected-body' | 'unselected-body' }\n | { form: 'kind'; kind: string; requireSelected: boolean }\n | { form: 'affordance'; kind: string }\n | { form: 'predicate'; kindOf: TargetPredicate };\n\nfunction hasPrefix<P extends string>(s: string, prefix: P): s is `${P}${string}` {\n return s.startsWith(prefix);\n}\n\n/**\n * Resolve a `TargetSpec` to its {@link TargetSpecForm}.\n *\n * `null` means the value is no form this build knows — junk from an untyped\n * consumer, or a spec authored against a newer kit. Every caller treats it as\n * no-match rather than a wildcard.\n */\nexport function parseTargetSpec(spec: TargetSpec): TargetSpecForm | null {\n if (typeof spec === 'object') {\n return spec !== null && typeof spec.kindOf === 'function'\n ? { form: 'predicate', kindOf: spec.kindOf }\n : null;\n }\n if (typeof spec !== 'string') return null;\n if (spec === 'empty' || spec === 'selected-body' || spec === 'unselected-body') {\n return { form: 'body', body: spec };\n }\n if (hasPrefix(spec, 'affordance:')) {\n return { form: 'affordance', kind: spec.slice('affordance:'.length) };\n }\n // `:selected` is only a suffix when it is the LAST segment — `kind:app:note`\n // names a kind that happens to contain a colon.\n if (hasPrefix(spec, 'kind:')) {\n const rest = spec.slice('kind:'.length);\n const requireSelected = rest.endsWith(':selected');\n return {\n form: 'kind',\n kind: requireSelected ? rest.slice(0, -':selected'.length) : rest,\n requireSelected,\n };\n }\n const _exhaustive: never = spec;\n void _exhaustive;\n return null;\n}\n\n/**\n * Match a target value + event against a TargetSpec.\n *\n * - `{ kindOf: predicate }` — calls the predicate with the affordance hit and\n * the `bodyTarget` string.\n * - `'empty'`, `'selected-body'`, `'unselected-body'` — compared against\n * `bodyTarget` on the event.\n * - `kind:<k>` — compared against `bodyKind`, the *semantic* kind of the node\n * body under the point (`'text'`, `'rect'`, an app's own `'app:note'`).\n * Selection-agnostic.\n * - `kind:<k>:selected` — the same, and additionally requires the body to be\n * in the current selection. Only the final `:selected` is a suffix, so a\n * kind may itself contain colons.\n * - `affordance:<k>` — exact match against the affordance hit's own `kind`.\n * Kit affordance kinds are `handle:<corner>`, `'rotate-handle'`,\n * `anchor:<i>`, `controlIn:<i>` / `controlOut:<i>`, and `layer:<id>` for a\n * registered layer's widget. The match is exact and includes any parameter,\n * so \"any anchor\" needs the `isAnchor` predicate rather than this form.\n * - `undefined` spec.target — any target is accepted.\n *\n * Every string form resolves to `false` when the field it reads is absent, so\n * an unwired `classifyTarget`/`affordanceAt` yields no-match rather than a\n * silent wildcard.\n */\nexport function matchTarget(\n target: unknown,\n specTarget: TargetSpec | undefined,\n bodyTarget?: string,\n bodyKind?: string,\n): boolean {\n if (specTarget === undefined) return true;\n const form = parseTargetSpec(specTarget);\n if (form === null) return false;\n\n switch (form.form) {\n // Receives the affordance hit plus the bodyTarget classification.\n case 'predicate':\n return form.kindOf(target, bodyTarget);\n\n // Resolved from the `classifyTarget` result packed into the event's\n // `bodyTarget`. Unwired classifyTarget → absent → no match.\n case 'body':\n return bodyTarget !== undefined && bodyTarget === form.body;\n\n case 'affordance':\n return affordanceKindOf(target) === form.kind;\n\n case 'kind':\n if (bodyKind === undefined || bodyKind !== form.kind) return false;\n return form.requireSelected ? bodyTarget === 'selected-body' : true;\n\n default: {\n // Exhaustiveness guard — new target forms are a compile error here.\n const _exhaustive: never = form;\n void _exhaustive;\n return false;\n }\n }\n}\n","/** Pure gesture matcher — no React, no state, no DOM. */\n\nimport type { CarrySpec, DropSpec, GestureSpec, ModSpec, PasteSpec, PhaseSpec } from './spec';\nimport type { InputEvent } from './inputEvent';\nimport type { PhaseAtom } from '../grammar/routeGrammar';\nimport { matchIngestTypes } from './ingestTypes';\nimport { matchTarget } from './matchTarget';\n\nexport { matchTarget, parseTargetSpec } from './matchTarget';\nexport type { TargetSpecForm } from './matchTarget';\n\n/** The modifier-state fields `matchModifiers` reads. Structural, so a DOM\n * `KeyboardEvent` or `PointerEvent` satisfies it directly. */\nexport type ModifiersEvent = { altKey: boolean; ctrlKey: boolean; metaKey: boolean; shiftKey: boolean };\n\ntype KeyRequirement = 'required' | 'forbidden' | 'optional';\n\nfunction resolveSpecValue(value: boolean | 'optional' | undefined): KeyRequirement {\n if (value === true) return 'required';\n if (value === 'optional') return 'optional';\n return 'forbidden';\n}\n\n/**\n * Strict modifier match.\n *\n * - Omitted or `false`: MUST NOT be held.\n * - `true`: MUST be held.\n * - `'optional'`: accepts either held or unheld.\n * - `mod` is platform-aware: matches `metaKey` on mac, `ctrlKey` elsewhere,\n * and the *other* platform key is forbidden. Callers should not combine\n * `mod` with `meta`/`ctrl`.\n */\nexport function matchModifiers(\n e: ModifiersEvent,\n mods: ModSpec | undefined,\n isMac: boolean,\n): boolean {\n // Start strict: every modifier is forbidden unless the spec opts in.\n let alt: KeyRequirement = 'forbidden';\n let ctrl: KeyRequirement = 'forbidden';\n let meta: KeyRequirement = 'forbidden';\n let shift: KeyRequirement = 'forbidden';\n\n if (mods) {\n alt = resolveSpecValue(mods.alt);\n shift = resolveSpecValue(mods.shift);\n\n // mod: platform-aware shorthand. Resolves to meta on mac, ctrl elsewhere.\n // The *other* platform key stays forbidden (handled by the strict default).\n if (mods.mod !== undefined) {\n const modReq = resolveSpecValue(mods.mod);\n if (isMac) meta = modReq;\n else ctrl = modReq;\n } else {\n meta = resolveSpecValue(mods.meta);\n ctrl = resolveSpecValue(mods.ctrl);\n }\n }\n\n return (\n checkKey(alt, e.altKey) &&\n checkKey(ctrl, e.ctrlKey) &&\n checkKey(meta, e.metaKey) &&\n checkKey(shift, e.shiftKey)\n );\n}\n\nfunction checkKey(req: KeyRequirement, held: boolean): boolean {\n if (req === 'required') return held;\n if (req === 'forbidden') return !held;\n return true;\n}\n\n/** Case-insensitive key match; supports string or string[] (any-of). */\nexport function matchKey(eventKey: string, specKey: string | string[]): boolean {\n const lower = eventKey.toLowerCase();\n if (Array.isArray(specKey)) {\n return specKey.some((k) => k.toLowerCase() === lower);\n }\n return specKey.toLowerCase() === lower;\n}\n\n/** A key event against a key spec: by `code` first when the spec names one,\n * then by `key`. Either is enough. */\nfunction matchKeyOrCode(\n e: { key: string; code?: string },\n spec: { key: string | string[]; code?: string | string[] },\n): boolean {\n if (spec.code !== undefined && e.code !== undefined && [spec.code].flat().includes(e.code)) return true;\n return matchKey(e.key, spec.key);\n}\n\n/** Per-tool gesture-lifecycle state at match time. `selfChannel` is the tool\n * id `'&'` resolves to — the tool that owns the binding being evaluated — or\n * `null` for a binding without an owning tool, in which case no `'&'` atom\n * can match. `engagedChannels` is the set of tool ids that currently have an\n * in-flight handle. */\nexport interface PhaseContext {\n selfChannel: string | null;\n engagedChannels: ReadonlySet<string>;\n}\n\n/** Normalize the `PhaseSpec` shorthand to an atom array.\n * Bare keywords desugar to a single `'&'`-channel atom. */\nfunction normalizePhase(spec: PhaseSpec): readonly PhaseAtom[] {\n if (typeof spec === 'string') {\n return [{ channel: '&', phase: spec }];\n }\n return spec;\n}\n\n/** True if the binding's `phase` spec is satisfied by the current\n * per-tool engagement state. Omitted spec → always true (no phase\n * constraint). Union semantics: a phase atom list matches when ANY\n * atom matches. */\nexport function matchPhase(spec: PhaseSpec | undefined, ctx: PhaseContext): boolean {\n if (spec === undefined) return true;\n const atoms = normalizePhase(spec);\n if (atoms.length === 0) return true;\n for (const a of atoms) {\n if (matchPhaseAtom(a, ctx)) return true;\n }\n return false;\n}\n\nfunction matchPhaseAtom(a: PhaseAtom, ctx: PhaseContext): boolean {\n if (a.channel === '*') {\n // Any-channel sentinel: 'engaged' matches when any channel is engaged;\n // 'initial' matches when none are; '*' matches both.\n if (a.phase === '*') return true;\n const anyEngaged = ctx.engagedChannels.size > 0;\n return a.phase === 'engaged' ? anyEngaged : !anyEngaged;\n }\n // Resolve '&' to the binding's owning tool. Without an owner, '&' atoms\n // can't match (correct: ambient actions don't have a \"self\").\n const id = a.channel === '&' ? ctx.selfChannel : a.channel;\n if (id == null) return false;\n if (a.phase === '*') return true;\n const isEngaged = ctx.engagedChannels.has(id);\n return a.phase === 'engaged' ? isEngaged : !isEngaged;\n}\n\n/**\n * Match a `drag` or `pointerDown` spec, both of which fire on pointerdown.\n *\n * One physical press is dispatched twice: eagerly at `stage: 'press'`, and\n * again from the buffer once the drag threshold releases it. Each kind takes\n * exactly one of the two.\n */\nfunction matchPress(\n e: InputEvent,\n spec: Extract<GestureSpec, { kind: 'drag' | 'pointerDown' }>,\n isMac: boolean,\n): boolean {\n if (e.kind !== 'pointerdown') return false;\n if (spec.kind === 'drag') {\n // Drag begins at pointerdown; the dispatcher promotes to drag after\n // threshold is crossed. Without this gate the eager dispatch would open\n // the press's drag handle a second time.\n if (e.stage === 'press') return false;\n } else if (e.stage !== 'press') {\n return false;\n }\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n // Pass the affordance hit as the `target` for `kindOf` predicates.\n // Pass `bodyTarget` for string-form TargetSpec values.\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n}\n\n/**\n * Match a single GestureSpec against an InputEvent.\n *\n * For `key-held`, only `phase: 'down'` returns true. The dispatcher tracks the\n * held state independently and handles `phase: 'up'` itself.\n */\nexport function matchSpec(\n e: InputEvent,\n spec: GestureSpec,\n isMac: boolean,\n phaseCtx?: PhaseContext,\n): boolean {\n // With no phase ctx nothing is engaged and the spec has no owner: an\n // any-channel `initial` matches, and an own-channel (`&`) atom cannot.\n if (spec.phase !== undefined) {\n const ctx: PhaseContext = phaseCtx ?? { selfChannel: null, engagedChannels: EMPTY_ENGAGED };\n if (!matchPhase(spec.phase, ctx)) return false;\n }\n\n switch (spec.kind) {\n case 'key': {\n if (e.kind !== 'key') return false;\n if (!matchKeyOrCode(e, spec)) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'key-held': {\n if (e.kind !== 'key-held') return false;\n if (e.phase !== 'down') return false; // only match the down phase\n if (!matchKeyOrCode(e, spec)) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'wheel': {\n if (e.kind !== 'wheel') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n const direction = spec.direction ?? '*';\n if (direction === 'up' && !(e.deltaY < 0)) return false;\n if (direction === 'down' && !(e.deltaY > 0)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'pinch': {\n if (e.kind !== 'pinch') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n const direction = spec.direction ?? '*';\n if (direction === 'out' && !(e.scale > 1)) return false;\n if (direction === 'in' && !(e.scale < 1)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'click': {\n if (e.kind !== 'click') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n // A `kindOf` predicate gets the affordance the press landed on — the\n // same value it would get on a drag — NOT the DOM target, which is what\n // lets `hit == null` mean \"not chrome\".\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'doubleClick': {\n if (e.kind !== 'doubleclick') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n // Each happens at a point, so its target is what the event classified\n // there: for a long-press, the affordance its press landed on.\n case 'contextMenu':\n case 'longPress': {\n if (e.kind !== 'contextmenu' && e.kind !== 'longpress') return false;\n if (e.kind !== spec.kind.toLowerCase()) return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n return matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n }\n\n case 'hover': {\n if (e.kind !== 'hover') return false;\n if (!matchModifiers(e, spec.mods, isMac)) return false;\n if (!e.off && (e.held === true ? spec.held === undefined : spec.held === true)) return false;\n const on = !e.off && matchTarget(e.affordance, spec.target, e.bodyTarget, e.bodyKind);\n if (spec.motion !== 'leave') return on;\n return !on && e.from !== undefined && matchTarget(e.from.affordance, spec.target, e.from.bodyTarget, e.from.bodyKind);\n }\n\n case 'drag':\n case 'pointerDown':\n return matchPress(e, spec, isMac);\n\n case 'multiTouch': {\n if (e.kind !== 'multitouch') return false;\n if (e.fingers !== spec.fingers) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'multiTouchTap': {\n if (e.kind !== 'multitouchtap') return false;\n if (e.fingers !== spec.fingers) return false;\n return matchModifiers(e, spec.mods, isMac);\n }\n\n case 'drop':\n case 'carry':\n case 'paste':\n return matchArrival(e, spec, isMac);\n\n default: {\n // Exhaustiveness guard — new spec kinds are a compile error here.\n const _exhaustive: never = spec;\n void _exhaustive;\n return false;\n }\n }\n}\n\n/** Content arriving from off the surface: an OS drop, a paste, or a carry. A\n * carry starts as it comes over and, if nothing took it then, may still be\n * taken on release; its leave belongs to the handle in flight. A move with\n * none in flight is offered to a spec with a target, which waits for the\n * carry to reach it. */\nfunction matchArrival(e: InputEvent, spec: DropSpec | CarrySpec | PasteSpec, isMac: boolean): boolean {\n if (e.kind !== spec.kind) return false;\n if (e.kind === 'carry') {\n const target = 'target' in spec ? spec.target : undefined;\n if (e.stage === 'leave' || (e.stage === 'move' && target === undefined)) return false;\n if (!matchIngestTypes([{ mime: e.type }], spec.types)) return false;\n if (!matchTarget(e.affordance, target, e.bodyTarget, e.bodyKind)) return false;\n } else if (e.kind === 'drop' || e.kind === 'paste') {\n if (!matchIngestTypes(e.items, spec.types)) return false;\n }\n return matchModifiers(e, spec.mods, isMac);\n}\n\nconst EMPTY_ENGAGED: ReadonlySet<string> = new Set();\n","import type { GestureSpec } from '../ui/spec';\nimport type { GestureName } from './gestures';\n\ntype SpecKind = GestureSpec['kind'];\n\n/** `GestureSpec.kind` → route-grammar gesture name. `keyUp` has no spec\n * kind, so the reverse direction is not total. */\nconst SPEC_KIND_TO_GESTURE: Record<SpecKind, GestureName | undefined> = {\n key: 'keyDown',\n 'key-held': 'keyHeld',\n wheel: 'wheel',\n pinch: 'pinch',\n click: 'click',\n doubleClick: 'dblTap',\n contextMenu: 'contextMenu',\n longPress: 'longPress',\n drag: 'drag',\n pointerDown: 'pointerDown',\n hover: 'hover',\n multiTouch: 'multiTouch',\n multiTouchTap: 'multiTouchTap',\n drop: 'drop',\n carry: 'carry',\n paste: 'paste',\n};\n\nconst GESTURE_TO_SPEC_KIND = new Map<GestureName, SpecKind>(\n (Object.entries(SPEC_KIND_TO_GESTURE) as [SpecKind, GestureName | undefined][])\n .filter((e): e is [SpecKind, GestureName] => e[1] !== undefined)\n .map(([kind, gesture]) => [gesture, kind]),\n);\n\n/** The route-grammar gesture a `GestureSpec.kind` routes as, or `undefined`\n * for a kind the grammar has no name for. */\nexport function routeGestureForSpecKind(kind: SpecKind): GestureName | undefined {\n return SPEC_KIND_TO_GESTURE[kind];\n}\n\n/** The `GestureSpec.kind` a route-grammar gesture is written as, or\n * `undefined` for a gesture no spec can express. */\nexport function specKindForRouteGesture(gesture: GestureName): SpecKind | undefined {\n return GESTURE_TO_SPEC_KIND.get(gesture);\n}\n","import type { GestureSpec, ModSpec, PhaseSpec, TargetSpec } from '../ui/spec';\nimport { parseTargetSpec } from '../ui/match';\nimport { formatRoute, type ParsedRoute } from './routeGrammar';\nimport { parseKeyRoute } from './keyRouteGrammar';\nimport { specKindForRouteGesture } from './specKinds';\n\n/**\n * Build the `GestureSpec` a parsed route describes, so a route string can\n * drive `matchSpec` and `specificity` directly.\n *\n * Wildcards become omitted fields: a `*` target, direction or MIME list, and a\n * `[*:*]` phase slot. `[*]` is `[&:*]`, which an ambient binding never\n * matches, so it stays a phase atom. A `keyDown` / `keyHeld` arg is read as a\n * key route, so `keyDown(z?shift)` yields `mods.shift: 'optional'`; a drop, carry, or\n * paste arg is a `|`-separated MIME list.\n *\n * Throws on a route no spec can express: `keyUp`, a key or finger-count\n * wildcard, or a target that is not a `TargetSpec` form.\n */\nexport function routeToSpec(parsed: ParsedRoute): GestureSpec {\n const fail = (why: string): never => {\n throw new Error(`routeToSpec: ${why}: ${formatRoute(parsed)}`);\n };\n const arg = parsed.arg === '*' ? undefined : parsed.arg;\n\n const mods: ModSpec = {};\n for (const [name, req] of Object.entries(parsed.modifiers)) {\n mods[name as keyof ModSpec] = req === 'required' ? true : 'optional';\n }\n\n const common: { mods?: ModSpec; phase?: PhaseSpec } = {};\n const isUnconstrained = parsed.phases.length === 1\n && parsed.phases[0]!.channel === '*' && parsed.phases[0]!.phase === '*';\n if (!isUnconstrained) common.phase = parsed.phases;\n\n const withMods = <S extends GestureSpec>(spec: S): S => {\n const extra = spec.mods;\n const merged = { ...mods, ...extra };\n const out = { ...spec, ...common };\n if (Object.keys(merged).length > 0) out.mods = merged;\n return out;\n };\n\n let target: TargetSpec | undefined;\n if (parsed.target !== undefined && parsed.target !== '*') {\n if (parseTargetSpec(parsed.target as TargetSpec) === null) {\n fail(`\"${parsed.target}\" is not a target form`);\n }\n target = parsed.target as TargetSpec;\n }\n const t = target === undefined ? {} : { target };\n\n const kind = specKindForRouteGesture(parsed.gesture);\n switch (kind) {\n case undefined:\n return fail(`${parsed.gesture} has no GestureSpec kind`);\n case 'hover':\n return withMods({\n kind,\n ...(arg === 'leave' ? { motion: 'leave' as const } : {}),\n ...(parsed.held ? { held: parsed.held === 'required' ? (true as const) : ('optional' as const) } : {}),\n ...t,\n });\n case 'click':\n case 'pointerDown':\n case 'doubleClick':\n case 'drag':\n case 'contextMenu':\n case 'longPress':\n return withMods({ kind, ...t });\n case 'wheel':\n return withMods({ kind, ...(arg ? { direction: arg as 'up' | 'down' } : {}), ...t });\n case 'pinch':\n return withMods({ kind, ...(arg ? { direction: arg as 'in' | 'out' } : {}), ...t });\n case 'key':\n case 'key-held': {\n if (arg === undefined) return fail('a key spec needs a concrete key');\n const { key, optionalMods } = parseKeyRoute(arg);\n const optional: ModSpec = {};\n for (const m of optionalMods) optional[m] = 'optional';\n return withMods({ kind, key, ...(optionalMods.length > 0 ? { mods: optional } : {}) });\n }\n case 'multiTouch':\n case 'multiTouchTap':\n if (arg === undefined) return fail(`a ${kind} spec needs concrete fingers`);\n return withMods({ kind, fingers: Number(arg) });\n case 'carry':\n return withMods({ kind, ...(arg ? { types: arg.split('|') } : {}), ...t });\n case 'drop':\n case 'paste':\n return withMods({ kind, ...(arg ? { types: arg.split('|') } : {}) });\n }\n}\n","import { getGestureDescriptor, type GestureName } from './gestures';\nimport type { ParsedRoute, PhaseAtom, ParsedModifiers, ModifierKey } from './routeGrammar';\n\nconst MOD_NAMES: Record<ModifierKey, string> = {\n mod: 'Mod', shift: 'Shift', alt: 'Alt', ctrl: 'Ctrl', meta: 'Meta',\n};\nconst MOD_ORDER: readonly ModifierKey[] = ['mod', 'shift', 'alt', 'ctrl', 'meta'];\n\n/** Glossary for route-vocabulary terms surfaced by `describeRouteParts`.\n * Exposed so docs / inspector UIs can render the same definitions. */\nexport const ROUTE_TERMS = {\n idle: 'Not in the middle of a drag or other synchronous operation.',\n 'mid-gesture': 'In the middle of a drag or other synchronous operation.',\n} as const;\n\n/** Per-field explanations for the slots of a parsed route. Exposed so\n * inspector UIs / docs can describe what each setting in a route table\n * means without duplicating prose. */\nexport const ROUTE_FIELD_DEFINITIONS = {\n phases: 'Which lifecycle stage(s) a channel must be in for this route to fire. `initial` = the channel is idle; `engaged` = the channel is mid-gesture. The channel is the binding\\'s own tool (`&`), any tool (`*`), or a named tool id.',\n gesture: 'The class of input event that triggers this route — click, drag, double-tap, keyDown/keyUp, wheel, pinch, contextMenu, multiTouch, multiTouchTap, drop, or paste.',\n arg: 'Sub-class of the gesture. Direction for wheel (up / down / *) and pinch (in / out / *), key name for keyDown / keyUp, finger count for multiTouch / multiTouchTap, MIME glob for drop / paste. Other gestures have no arg slot.',\n target: 'Which hit-test result the gesture must land on. `*` matches any target; `empty` matches the empty canvas; otherwise the value names a specific hit-target kind.',\n modifiers: 'Modifier keys the user must hold (`+key`) or may optionally hold (`?key`) for this route to match. Unlisted modifiers must not be held.',\n} as const;\n\n/** The slots of a parsed route that `ROUTE_FIELD_DEFINITIONS` explains. */\nexport type RouteFieldName = keyof typeof ROUTE_FIELD_DEFINITIONS;\n\n/** The route-vocabulary terms `ROUTE_TERMS` defines. */\nexport type RouteTermLabel = keyof typeof ROUTE_TERMS;\n\n/** A part of a structured route description. `string` parts are plain prose;\n * `term` parts carry a glossary lookup so renderers can attach tooltips. */\nexport type RouteDescriptionPart =\n | string\n | { kind: 'term'; label: RouteTermLabel; definition: string };\n\nfunction term(label: RouteTermLabel): RouteDescriptionPart {\n return { kind: 'term', label, definition: ROUTE_TERMS[label] };\n}\n\nfunction joinAnd(parts: readonly string[]): string {\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0];\n if (parts.length === 2) return `${parts[0]} and ${parts[1]}`;\n return `${parts.slice(0, -1).join(', ')}, and ${parts[parts.length - 1]}`;\n}\n\nfunction partitionModifiers(mods: ParsedModifiers): { required: string[]; optional: string[] } {\n const required: string[] = [];\n const optional: string[] = [];\n for (const name of MOD_ORDER) {\n const req = mods[name];\n if (req === 'required') required.push(MOD_NAMES[name]);\n else if (req === 'optional') optional.push(MOD_NAMES[name]);\n }\n return { required, optional };\n}\n\n/** What a pointer leaves: the hover target, or with none the surface itself. */\nfunction leftClause(target: string | undefined): string {\n if (target === undefined || target === '*') return 'off the surface';\n return target === 'empty' ? 'off empty canvas' : `off a ${target}`;\n}\n\nfunction phaseAtomParts({ channel, phase }: PhaseAtom): RouteDescriptionPart[] {\n const subject = channel === '&' ? 'the tool'\n : channel === '*' ? 'any tool'\n : `the ${channel} tool`;\n if (phase === 'initial') return [`${subject} is `, term('idle')];\n if (phase === 'engaged') return [`${subject} is `, term('mid-gesture')];\n return [`${subject} is in any phase`];\n}\n\nfunction phasesParts(phases: readonly PhaseAtom[]): RouteDescriptionPart[] {\n if (phases.length === 1) return phaseAtomParts(phases[0]);\n const out: RouteDescriptionPart[] = [];\n phases.forEach((p, i) => {\n if (i > 0) out.push(' or ');\n out.push(...phaseAtomParts(p));\n });\n return out;\n}\n\nfunction targetClause(target: string | undefined, hasTarget: boolean): string {\n if (!hasTarget || target === undefined) return '';\n if (target === '*') return ' anywhere';\n if (target === 'empty') return ' on empty canvas';\n return ` on a ${target}`;\n}\n\nfunction carryOnto(target: string | undefined): string {\n if (target === undefined || target === '*') return 'onto the canvas';\n if (target === 'empty') return 'onto empty canvas';\n return `onto a ${target}`;\n}\n\n/** The gesture's arg, or undefined when it is the `'*'` wildcard — which\n * `parseRoute` fills in for every omitted slot, so prose must not print it. */\nfunction concreteArg(parsed: ParsedRoute): string | undefined {\n return parsed.arg === '*' ? undefined : parsed.arg;\n}\n\n/** One modifier reads as a compound verb (\"Shift-clicks\"); more read as a\n * held chord (\"holds Mod and Alt and drags\"). */\nfunction userDoes(required: readonly string[], verb: string): string {\n if (required.length === 0) return `the user ${verb}`;\n if (required.length === 1) return `the user ${required[0]}-${verb}`;\n return `the user holds ${joinAnd(required)} and ${verb}`;\n}\n\nfunction actionClause(parsed: ParsedRoute, required: readonly string[]): string {\n const desc = getGestureDescriptor(parsed.gesture as GestureName);\n const arg = concreteArg(parsed);\n const target = targetClause(parsed.target, desc.hasTarget);\n\n switch (parsed.gesture) {\n case 'keyDown':\n case 'keyUp':\n case 'keyHeld': {\n const verb = parsed.gesture === 'keyDown' ? 'presses'\n : parsed.gesture === 'keyUp' ? 'releases'\n : 'holds';\n const key = arg ?? 'any key';\n return required.length > 0\n ? `the user holds ${joinAnd(required)} and ${verb} ${key}`\n : `the user ${verb} ${key}`;\n }\n case 'wheel': {\n const direction = arg === 'up' ? ' up'\n : arg === 'down' ? ' down'\n : '';\n return userDoes(required, `scrolls${direction}${target}`);\n }\n case 'pinch': {\n const direction = arg === 'in' ? ' in'\n : arg === 'out' ? ' out'\n : '';\n return userDoes(required, `pinches${direction}${target}`);\n }\n case 'multiTouch':\n return userDoes(required, `touches with ${arg ?? 'multiple'} fingers`);\n case 'multiTouchTap':\n return userDoes(required, `taps with ${arg ?? 'multiple'} fingers`);\n case 'contextMenu':\n return userDoes(required, `opens the context menu${target}`);\n case 'longPress':\n return userDoes(required, `long-presses${target}`);\n case 'click':\n return userDoes(required, `clicks${target}`);\n case 'pointerDown':\n return userDoes(required, `presses${target}`);\n case 'hover': {\n const held = parsed.held === 'required' ? ' with a button held'\n : parsed.held === 'optional' ? ' whether or not a button is held'\n : '';\n const where = arg === 'leave' ? ` ${leftClause(parsed.target)}` : target;\n return userDoes(required, `moves the pointer${where}${held}`);\n }\n case 'dblTap':\n return userDoes(required, `double-taps${target}`);\n case 'drag':\n return userDoes(required, `drags${target}`);\n case 'drop':\n return userDoes(required, `drops ${arg ?? 'any'} content onto the canvas`);\n case 'carry':\n return userDoes(required, `carries ${arg ?? 'anything'} ${carryOnto(parsed.target)}`);\n case 'paste':\n return userDoes(required, `pastes ${arg ?? 'any'} content`);\n }\n}\n\n/** Sentence-shaping options for `describeRoute` and `describeRouteParts` —\n * set both false to embed the description inside a larger sentence. */\nexport interface DescribeRouteOptions {\n /** Capitalize the first letter of the result. Default true. */\n capitalize?: boolean;\n /** Trailing period. Default true. */\n period?: boolean;\n}\n\n/** Structured description of when a parsed route fires. Returns an array of\n * prose strings interspersed with `term` parts (e.g. `idle`, `mid-gesture`)\n * so React-based renderers can attach hover-definition tooltips. Use\n * `describeRoute()` for a plain-string version. */\nexport function describeRouteParts(\n parsed: ParsedRoute,\n opts: DescribeRouteOptions = {},\n): readonly RouteDescriptionPart[] {\n const { capitalize = true, period = true } = opts;\n const { required, optional } = partitionModifiers(parsed.modifiers);\n const action = actionClause(parsed, required);\n const optClause = optional.length > 0\n ? ` (${joinAnd(optional)} optional)`\n : '';\n\n const parts: RouteDescriptionPart[] = [];\n const head = `fires when ${action}, while `;\n parts.push(capitalize ? head.charAt(0).toUpperCase() + head.slice(1) : head);\n parts.push(...phasesParts(parsed.phases));\n if (optClause) parts.push(optClause);\n if (period) parts.push('.');\n return mergeAdjacentStrings(parts);\n}\n\n/** Plain-spoken English summary of when a parsed route fires. Intended for\n * developer-facing documentation. Term parts collapse to their label only\n * (e.g. `idle`); use `describeRouteParts()` if you want to expose the\n * glossary definitions in your renderer. */\nexport function describeRoute(parsed: ParsedRoute, opts: DescribeRouteOptions = {}): string {\n return describeRouteParts(parsed, opts)\n .map((p) => (typeof p === 'string' ? p : p.label))\n .join('');\n}\n\nfunction mergeAdjacentStrings(parts: readonly RouteDescriptionPart[]): RouteDescriptionPart[] {\n const out: RouteDescriptionPart[] = [];\n for (const p of parts) {\n const last = out[out.length - 1];\n if (typeof p === 'string' && typeof last === 'string') out[out.length - 1] = last + p;\n else out.push(p);\n }\n return out;\n}\n","import type { ModifierCombo } from './modifiers';\nimport type { ParsedModifiers, ModifierKey } from './routeGrammar';\n\n/** Translate the tool-authoring `ModifierCombo` enum (positional string,\n * e.g. `'mod+shift'`) to the v3 `ParsedModifiers` structured map\n * (every listed modifier becomes `'required'`; unlisted means\n * forbidden / absent). `'default'` yields `{}`. */\nexport function modifierComboToParsed(key: ModifierCombo): ParsedModifiers {\n if (key === 'default') return {};\n const out: ParsedModifiers = {};\n for (const part of key.split('+')) {\n out[part as ModifierKey] = 'required';\n }\n return out;\n}\n\n/** Stable canonical serialization of a ParsedModifiers map for use as a\n * hash key (conflicts dedup). Sorts mod names alphabetically and emits\n * `name=req` pairs joined by `&`. */\nexport function canonicalModifiers(mods: ParsedModifiers): string {\n return Object.entries(mods)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, req]) => `${name}=${req}`)\n .join('&');\n}\n","import type { PointerSampleStylus } from './inputEvent';\n\n/**\n * The stylus fields `src` carries, as a spread-able partial: a sample that\n * carries none of them adds no `undefined`-valued keys to what it is spread into.\n */\nexport function stylusOf(src: PointerSampleStylus): PointerSampleStylus {\n return {\n ...(typeof src.pressure === 'number' ? { pressure: src.pressure } : {}),\n ...(typeof src.tiltX === 'number' ? { tiltX: src.tiltX } : {}),\n ...(typeof src.tiltY === 'number' ? { tiltY: src.tiltY } : {}),\n };\n}\n","/** GestureSpec — describes the form of a user input event that can fire an action. */\n\n/** Optional modifier-key requirement for a gesture spec.\n *\n * Matching is strict: an omitted modifier field means the modifier MUST NOT\n * be held — a bare `{ kind: 'key', key: 'Escape' }` matches only unmodified\n * Escape, NOT Cmd+Escape. A `true` means the modifier MUST be held; `false`\n * is the same as omitted.\n *\n * `mod` is a platform-aware shorthand: matches `metaKey` on mac, `ctrlKey`\n * elsewhere.\n *\n * Every modifier additionally accepts `'optional'`, meaning \"held or not,\n * both acceptable\" — used by actions like nudge whose step size depends on\n * shift but whose firing does not.\n */\nexport type ModSpec = Partial<{\n alt: boolean | 'optional';\n ctrl: boolean | 'optional';\n meta: boolean | 'optional';\n mod: boolean | 'optional';\n shift: boolean | 'optional';\n}>;\n\n/** The predicate form of {@link TargetSpec}. `hit` is the affordance hit\n * under the pointer, for every gesture kind; `bodyTarget` is the optional\n * body-class string ('empty' | 'selected-body' | 'unselected-body') when\n * `classifyTarget` is wired. Build one with `hitPredicate` or\n * `bodyPredicate`, which make the declaration below. */\nexport interface TargetPredicate {\n (hit: unknown, bodyTarget?: string): boolean;\n /** Whether the predicate reads `hit`. An exclusive affordance claim bars\n * every binding whose target does not: `false` is a predicate that decides\n * from `bodyTarget` alone, and chrome over a body must not read as that body. */\n readsAffordance: boolean;\n}\n\n/** A {@link TargetPredicate} that reads the affordance hit, alone or with the\n * body class, so it stays in contention under an exclusive claim. */\nexport function hitPredicate(\n fn: (hit: unknown, bodyTarget?: string) => boolean,\n): TargetPredicate & { readsAffordance: true } {\n return Object.assign(\n (hit: unknown, bodyTarget?: string): boolean => fn(hit, bodyTarget),\n { readsAffordance: true as const },\n );\n}\n\n/** A {@link TargetPredicate} that decides from the body class alone, so an\n * exclusive affordance claim bars it. */\nexport function bodyPredicate(\n fn: (bodyTarget: string | undefined) => boolean,\n): TargetPredicate & { readsAffordance: false } {\n return Object.assign(\n (_hit: unknown, bodyTarget?: string): boolean => fn(bodyTarget),\n { readsAffordance: false as const },\n );\n}\n\n/** Target selector for click and drag gesture specs. Consumers can pass\n * `{ kindOf: predicate }` to classify hits themselves.\n *\n * Adding a form here is a compile error in `parseTargetSpec` until\n * `TargetSpecForm` grows a matching variant — which is in turn a compile\n * error at every site that switches on one. */\nexport type TargetSpec =\n | 'empty'\n | 'selected-body'\n | 'unselected-body'\n | `kind:${string}`\n | `kind:${string}:selected`\n | `affordance:${string}`\n | { kindOf: TargetPredicate };\n\n/** Phase qualifier on a gesture spec. Restricts when the spec matches based\n * on per-tool gesture-lifecycle state. When omitted, matches in any phase.\n *\n * Shorthand forms gate on the binding's own tool:\n * `'engaged'` → `[{ channel: '&', phase: 'engaged' }]` // self mid-gesture\n * `'initial'` → `[{ channel: '&', phase: 'initial' }]` // self idle\n * `'*'` → `[{ channel: '&', phase: '*' }]` // either self phase\n *\n * Array form for explicit channel:phase atoms — e.g. `[{ channel: 'rect',\n * phase: 'engaged' }]` for \"when the rect tool is mid-gesture, regardless of\n * which scope I'm in.\" */\nexport type PhaseSpec = 'initial' | 'engaged' | '*' | readonly import('../grammar/routeGrammar').PhaseAtom[];\n\n/** Single-keystroke gesture (keydown). */\nexport interface KeySpec {\n kind: 'key';\n /** A single key, or an array of acceptable keys (case-insensitive match). */\n key: string | string[];\n /** The physical key, as `KeyboardEvent.code` (`'BracketRight'`), or several.\n * Tried before `key`, and either matching is enough: the binding then holds\n * on that key whatever a layout or a held modifier makes it type, and still\n * on any key that types `key`. `key` is what a route names the binding by. */\n code?: string | string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Key-held gesture (keydown opens, keyup closes). Drives \"hold space for\n * hand tool\"-style interactions. */\nexport interface KeyHeldSpec {\n kind: 'key-held';\n /** A single key, or an array of acceptable keys (case-insensitive match). */\n key: string | string[];\n /** The physical key or keys, as on {@link KeySpec.code}. */\n code?: string | string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Wheel-event gesture. `direction` filters by deltaY sign: `'up'` matches\n * only deltaY < 0, `'down'` only deltaY > 0, and the default `'*'` either. */\nexport interface WheelSpec {\n kind: 'wheel';\n direction?: 'up' | 'down' | '*';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Pinch reported as a scale factor about a focal point (WebKit\n * `gesturechange`). `direction` filters by the sample's scale: `'out'` is\n * scale > 1, `'in'` is scale < 1; default `'*'`. A touchscreen pinch is\n * {@link MultiTouchSpec}, not this. */\nexport interface PinchSpec {\n kind: 'pinch';\n direction?: 'in' | 'out' | '*';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Click gesture (pointerdown + pointerup without movement past the\n * threshold). */\nexport interface ClickSpec {\n kind: 'click';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Double-click: two `click` events within 600ms and 8px of each other.\n * Synthesized by `useGestureDispatcher`; emitted AFTER the second `click`. */\nexport interface DoubleClickSpec {\n kind: 'doubleClick';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Right-click (contextmenu) gesture. The dispatcher calls\n * `preventDefault()` on the underlying DOM event so the native menu\n * doesn't appear — tools/actions fully own the right-click UX. */\nexport interface ContextMenuSpec {\n kind: 'contextMenu';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Drag gesture (pointerdown + pointermove past the threshold). */\nexport interface DragSpec {\n kind: 'drag';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * Bare pointer press, matched at down time — before the dispatcher knows\n * whether the gesture will become a click or a drag. Reach for this only when\n * the effect must be visible while the button is still held; anything that\n * can wait for the release belongs on a `click` spec, which does not fire on\n * a press that turns into a drag.\n *\n * A matching binding does NOT own the gesture: the same press goes on to open\n * a drag or synthesize a click as usual. Bind an immediate action here, not an\n * ongoing one.\n */\nexport interface PointerDownSpec {\n kind: 'pointerDown';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * The pointer moving over the surface with no button pressed. Fires on every\n * such move; a held pointer's moves belong to its drag and fire nothing here,\n * unless `held` says otherwise.\n *\n * With `motion: 'leave'` it fires instead when the pointer passes out of what\n * the binding targets: onto something its `target` does not match, or off the\n * surface. With no `target` that is the whole surface. Its params are the\n * move's that took the pointer out, or the last move's before it left the surface.\n *\n * A hover binding claims nothing. Every live binding that matches the move\n * runs, not only the best one, and the move still reaches the hover-cursor\n * pump. There is no press to own, so bind an immediate action, not an ongoing\n * one. Its params carry `world`, `clientX` / `clientY`,\n * `affordance`, `bodyTarget`, `mods`, and `held`.\n */\nexport interface HoverSpec {\n kind: 'hover';\n motion?: 'move' | 'leave';\n /** Whether a pressed button may (`'optional'`) or must (`true`) be held, as\n * `mods` says of a modifier; omitted, a held pointer's moves are not hovers.\n * Such a binding still claims nothing, so the drag keeps its moves. Leaving\n * the surface is a leave whether or not a button is held. */\n held?: true | 'optional';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * Press held past the long-press threshold without crossing the drag\n * threshold. Synthesized by `useGestureDispatcher` from the pointer stream.\n * Fires for `touch` and `pen` pointers only: a mouse held still is an\n * ordinary slow click.\n *\n * When a long-press matches no binding, the dispatcher re-dispatches it as a\n * `contextmenu` event, so `contextMenu` bindings work under a finger.\n */\nexport interface LongPressSpec {\n kind: 'longPress';\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Multi-touch gesture. `fingers` is the required touch count. */\nexport interface MultiTouchSpec {\n kind: 'multiTouch';\n fingers: number;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** Multi-touch tap gesture — fires when N fingers touch down then release\n * together without movement past the tap threshold, sooner than a long-press\n * would fire. Synthesized by the dispatcher from the underlying multitouch\n * tracking. */\nexport interface MultiTouchTapSpec {\n kind: 'multiTouchTap';\n fingers: number;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** OS drag-and-drop of external content onto the canvas. `types` filters by\n * MIME glob (`'image/*'`, `'text/plain'`); the spec matches when ANY item's\n * MIME matches ANY glob. Omitted or empty = matches any drop. */\nexport interface DropSpec {\n kind: 'drop';\n types?: string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/**\n * A press that began elsewhere on the page, carried over the canvas: a palette\n * item dragged in, a row dragged out of a list. The in-app sibling of\n * {@link DropSpec}, which is the OS's drag. A carry is begun with `startCarry`.\n * `types` filters by the payload's `type`, as globs; omitted or empty matches\n * any carry.\n *\n * An ongoing action bound here starts when the carry comes over the surface:\n * its moves update it, the release commits it, and leaving the surface or\n * canceling the press cancels it. An immediate action fires once, on the\n * release.\n *\n * `target` is matched against what is under the carry. With one, an ongoing\n * action starts on the first step that is over its target, as the carry comes\n * over or as it moves on, and an immediate action fires only on a release over it.\n */\nexport interface CarrySpec {\n kind: 'carry';\n types?: string[];\n target?: TargetSpec;\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** System-clipboard paste of external content. Same `types` semantics as\n * {@link DropSpec} — omitted or empty = matches any paste. */\nexport interface PasteSpec {\n kind: 'paste';\n types?: string[];\n mods?: ModSpec;\n phase?: PhaseSpec;\n}\n\n/** The full union of supported gesture spec kinds. */\nexport type GestureSpec =\n | KeySpec\n | KeyHeldSpec\n | WheelSpec\n | PinchSpec\n | ClickSpec\n | DoubleClickSpec\n | ContextMenuSpec\n | DragSpec\n | PointerDownSpec\n | HoverSpec\n | LongPressSpec\n | MultiTouchSpec\n | MultiTouchTapSpec\n | DropSpec\n | CarrySpec\n | PasteSpec;\n","/**\n * Whether this is an Apple platform, where `mod` means the Command key and\n * not Ctrl. iPhone and iPad count: with a keyboard attached their shortcuts\n * are Command shortcuts. False where there is no `navigator`.\n *\n * Pass the answer to {@link matchModifiers} / {@link matchSpec} as `isMac`,\n * and read it wherever a `mod` shortcut is drawn, so a label names the key\n * the matcher listens for.\n */\nexport function isApplePlatform(): boolean {\n if (typeof navigator === 'undefined' || !navigator) return false;\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n // `||`, not `??`: jsdom and some embedders report an empty-string platform.\n const raw = nav.userAgentData?.platform || nav.platform || nav.userAgent || '';\n return /mac|iphone|ipad|ipod/i.test(raw);\n}\n","import { isApplePlatform } from './platform';\n\n/** One key of a shortcut as a keyboard prints it. */\nexport interface KeyLegend {\n /** Glyph drawn for the key (modifier or key). */\n label: string;\n /** When true, the key may be held but is not required to trigger the action\n * (e.g. an optional modifier). Defaults to false. */\n optional?: boolean;\n}\n\n/** Logical modifier name. Matches the kit's `ModifierKey` in shape — kept as a\n * local type so `weasel-ui` stays independent of `@weasel-js/core`. */\nexport type LogicalMod = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta';\n\n/** Detected (or overridden) platform. `'mod'` resolves to ⌘ on macOS,\n * Ctrl on Windows / Linux. */\nexport type Platform = 'macos' | 'windows' | 'linux';\n\n/** Visual form of a modifier or named-key label.\n *\n * - `'auto'` (default): the per-entry, per-platform default — whatever\n * label is actually printed on the physical key. macOS keys show the\n * Apple glyphs (⌘ ⌥ ⌃ ⇧ ⎋ ↵ ⇥). Windows keys mostly show text\n * (Ctrl, Alt, Shift) BUT the Win key shows its logo (⊞) and the\n * context-menu key shows ▤. Linux mirrors Windows with Super (⊞).\n * - `'symbol'` forces a glyph wherever the key has one: Apple's on macOS,\n * ISO/IEC 9995-7's elsewhere (⎈ Ctrl, ⎇ Alt, ⎋ Esc). A key with no\n * symbol still falls back to text.\n * - `'text'` always spells the label out (Cmd / Option / Esc / Enter). */\nexport type LegendStyle = 'auto' | 'symbol' | 'text';\n\n/** A modifier to render, named platform-independently. */\nexport interface LogicalModSpec {\n name: LogicalMod;\n /** Marks this modifier as optional (may be held but isn't required).\n * Forwarded as the resulting `KeyLegend.optional`. */\n optional?: boolean;\n}\n\n/** Options for {@link keySpecsFromMods}. */\nexport interface KeySpecsFromModsOptions {\n /** Override OS detection. Defaults to {@link detectPlatform}. */\n platform?: Platform;\n /** Defaults to `'auto'`. Pass `'symbol'` or `'text'` to force a specific\n * style regardless of platform. */\n legend?: LegendStyle;\n /** Labels that replace the platform and legend tables', by a modifier's\n * logical name (`mod`, `shift`, `alt`, `ctrl`, `meta`) or a key's\n * `KeyboardEvent.key` (`Escape`, `Home`, `z`): a whole keyboard's worth\n * for a layout, a locale, or a keyboard of one's own. */\n labels?: KeyLabels;\n}\n\n/** Key labels by modifier name or `KeyboardEvent.key`. See {@link KeySpecsFromModsOptions.labels}. */\nexport type KeyLabels = Readonly<Record<string, string>>;\n\nconst MOD_BY_PLATFORM: Record<LogicalMod, Record<Platform, Record<LegendStyle, string>>> = {\n mod: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n },\n shift: {\n macos: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n windows: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n linux: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n },\n // Off macOS the symbols are ISO/IEC 9995-7's: ⎈ for Control, ⎇ for Alt.\n alt: {\n macos: { auto: '⌥', symbol: '⌥', text: 'Option' },\n windows: { auto: 'Alt', symbol: '⎇', text: 'Alt' },\n linux: { auto: 'Alt', symbol: '⎇', text: 'Alt' },\n },\n ctrl: {\n macos: { auto: '⌃', symbol: '⌃', text: 'Control' },\n windows: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: '⎈', text: 'Ctrl' },\n },\n // Windows/Linux Meta has a recognized symbol on the physical key (⊞ Win\n // logo / Super logo), so `auto` shows it. Use `text` for Win / Super.\n meta: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: '⊞', symbol: '⊞', text: 'Win' },\n linux: { auto: '⊞', symbol: '⊞', text: 'Super' },\n },\n};\n\n/** Every label {@link keySpecsFromMods} can produce, on any platform and legend. */\nexport const MODIFIER_LABELS: ReadonlySet<string> = new Set(\n Object.values(MOD_BY_PLATFORM).flatMap((byPlatform) =>\n Object.values(byPlatform).flatMap((byLegend) => Object.values(byLegend)),\n ),\n);\n\n/** The platform whose key legends to draw. Whether `mod` is ⌘ comes from\n * `isApplePlatform`, the same read the dispatcher\n * matches `mod` with, so a keycap names the key that fires. With no\n * `navigator` (a server render) it answers `'macos'`, the kit's docs\n * convention; an unrecognized browser reads as `'linux'`. */\nexport function detectPlatform(): Platform {\n if (typeof navigator === 'undefined' || !navigator) return 'macos';\n if (isApplePlatform()) return 'macos';\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n const raw = nav.userAgentData?.platform || nav.platform || nav.userAgent || '';\n // `\\b`: jsdom names its host OS in the user agent, and \"darwin\" ends in \"win\".\n return /\\bwin/i.test(raw) ? 'windows' : 'linux';\n}\n\n/**\n * Map a list of **logical** modifiers (`'mod'`, `'shift'`, …) to **visual**\n * `KeyLegend`s appropriate for the current platform — `'mod'` means \"Cmd on\n * Mac, Ctrl on Win/Linux\".\n *\n * ```ts\n * <KeySequence\n * keys={keySpecsFromMods([{ name: 'mod' }, { name: 'shift', optional: true }])}\n * />\n * ```\n */\nexport function keySpecsFromMods(\n mods: readonly LogicalModSpec[],\n opts: KeySpecsFromModsOptions = {},\n): readonly KeyLegend[] {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n return mods.map((m) => {\n const label = opts.labels?.[m.name] ?? MOD_BY_PLATFORM[m.name][platform][legend];\n return m.optional ? { label, optional: true } : { label };\n });\n}\n\n/** Per-platform × per-legend table for named, non-modifier keys. `auto`\n * is whatever's printed on the physical key for that platform. Arrows\n * are universal symbols on every platform. */\nconst NAMED_KEY: Record<string, Record<Platform, Record<LegendStyle, string>>> = {\n Escape: { macos: { auto: '⎋', symbol: '⎋', text: 'Esc' }, windows: { auto: 'Esc', symbol: '⎋', text: 'Esc' }, linux: { auto: 'Esc', symbol: '⎋', text: 'Esc' } },\n Enter: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: '↵', text: 'Enter' }, linux: { auto: 'Enter', symbol: '↵', text: 'Enter' } },\n Return: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: '↵', text: 'Enter' }, linux: { auto: 'Enter', symbol: '↵', text: 'Enter' } },\n Tab: { macos: { auto: '⇥', symbol: '⇥', text: 'Tab' }, windows: { auto: 'Tab', symbol: '⇥', text: 'Tab' }, linux: { auto: 'Tab', symbol: '⇥', text: 'Tab' } },\n Space: { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: '␣', text: 'Space' }, linux: { auto: 'Space', symbol: '␣', text: 'Space' } },\n ' ': { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: '␣', text: 'Space' }, linux: { auto: 'Space', symbol: '␣', text: 'Space' } },\n Backspace: { macos: { auto: '⌫', symbol: '⌫', text: 'Backspace' }, windows: { auto: 'Backspace', symbol: '⟵', text: 'Backspace' }, linux: { auto: 'Backspace', symbol: '⟵', text: 'Backspace' } },\n Delete: { macos: { auto: '⌦', symbol: '⌦', text: 'Delete' }, windows: { auto: 'Delete', symbol: '⌦', text: 'Delete' }, linux: { auto: 'Delete', symbol: '⌦', text: 'Delete' } },\n // Context-menu key (the right-Ctrl-area key on Windows / Linux keyboards\n // with a ▤ icon). Mac has no equivalent; falls back to text 'Menu'.\n ContextMenu: { macos: { auto: 'Menu', symbol: 'Menu', text: 'Menu' }, windows: { auto: '▤', symbol: '▤', text: 'Menu' }, linux: { auto: '▤', symbol: '▤', text: 'Menu' } },\n // Symbol mode only: Apple's arrows for Home, End, and the page keys, and\n // ISO/IEC 9995-7's symbols for the rest.\n Home: { macos: { auto: 'Home', symbol: '↖', text: 'Home' }, windows: { auto: 'Home', symbol: '↖', text: 'Home' }, linux: { auto: 'Home', symbol: '↖', text: 'Home' } },\n End: { macos: { auto: 'End', symbol: '↘', text: 'End' }, windows: { auto: 'End', symbol: '↘', text: 'End' }, linux: { auto: 'End', symbol: '↘', text: 'End' } },\n PageUp: { macos: { auto: 'PgUp', symbol: '⇞', text: 'PgUp' }, windows: { auto: 'PgUp', symbol: '⇞', text: 'PgUp' }, linux: { auto: 'PgUp', symbol: '⇞', text: 'PgUp' } },\n PageDown: { macos: { auto: 'PgDn', symbol: '⇟', text: 'PgDn' }, windows: { auto: 'PgDn', symbol: '⇟', text: 'PgDn' }, linux: { auto: 'PgDn', symbol: '⇟', text: 'PgDn' } },\n PrintScreen: { macos: { auto: 'PrtSc', symbol: '⎙', text: 'PrtSc' }, windows: { auto: 'PrtSc', symbol: '⎙', text: 'PrtSc' }, linux: { auto: 'PrtSc', symbol: '⎙', text: 'PrtSc' } },\n Insert: { macos: { auto: 'Ins', symbol: '⎀', text: 'Insert' }, windows: { auto: 'Ins', symbol: '⎀', text: 'Insert' }, linux: { auto: 'Ins', symbol: '⎀', text: 'Insert' } },\n ScrollLock: { macos: { auto: 'ScrLk', symbol: '⇳', text: 'ScrLk' }, windows: { auto: 'ScrLk', symbol: '⇳', text: 'ScrLk' }, linux: { auto: 'ScrLk', symbol: '⇳', text: 'ScrLk' } },\n Pause: { macos: { auto: 'Pause', symbol: '⎉', text: 'Pause' }, windows: { auto: 'Pause', symbol: '⎉', text: 'Pause' }, linux: { auto: 'Pause', symbol: '⎉', text: 'Pause' } },\n ArrowUp: { macos: { auto: '↑', symbol: '↑', text: '↑' }, windows: { auto: '↑', symbol: '↑', text: '↑' }, linux: { auto: '↑', symbol: '↑', text: '↑' } },\n ArrowDown: { macos: { auto: '↓', symbol: '↓', text: '↓' }, windows: { auto: '↓', symbol: '↓', text: '↓' }, linux: { auto: '↓', symbol: '↓', text: '↓' } },\n ArrowLeft: { macos: { auto: '←', symbol: '←', text: '←' }, windows: { auto: '←', symbol: '←', text: '←' }, linux: { auto: '←', symbol: '←', text: '←' } },\n ArrowRight: { macos: { auto: '→', symbol: '→', text: '→' }, windows: { auto: '→', symbol: '→', text: '→' }, linux: { auto: '→', symbol: '→', text: '→' } },\n};\n\n/**\n * Render a raw `KeyboardEvent.key` value as a platform-appropriate\n * `KeyLegend`. Named non-modifier keys (Esc, Enter, Tab, Space, Backspace,\n * Delete, arrows) get the platform's conventional form. Letter / digit /\n * other keys pass through upper-cased.\n *\n * ```ts\n * keySpecFromKey('Escape', { platform: 'macos' }) // { label: '⎋' }\n * keySpecFromKey('Escape', { platform: 'windows' }) // { label: 'Esc' }\n * keySpecFromKey('p') // { label: 'P' }\n * ```\n *\n * Symbol mode off macOS draws ISO/IEC 9995-7's symbols where the key\n * has one, though Windows and Linux keyboards print the text form.\n */\nexport function keySpecFromKey(\n raw: string,\n opts: KeySpecsFromModsOptions & { optional?: boolean } = {},\n): KeyLegend {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n const entry = NAMED_KEY[raw];\n const override = opts.labels?.[raw] ?? (raw.length === 1 ? opts.labels?.[raw.toUpperCase()] : undefined);\n const label = override ?? (entry ? entry[platform][legend] : raw.length === 1 ? raw.toUpperCase() : raw);\n return opts.optional ? { label, optional: true } : { label };\n}\n","import type { ShortcutInput } from './formatShortcut';\nimport { keySpecFromKey, keySpecsFromMods, type KeyLegend, type KeySpecsFromModsOptions, type LogicalModSpec } from './keySpecsFromMods';\n\n/**\n * A shortcut as key legends, one per key, as `@weasel-js/ui`'s `KeySequence` draws them: mod, shift, alt, then the\n * key, each in the platform's own legend (`⌘` on macOS, `Ctrl` elsewhere).\n * Only the key itself: `formatShortcutParts` adds the keymaps that lead to it. `shift: 'optional'`\n * becomes an optional key; a key list\n * renders its first key. Returns `undefined` for no shortcut.\n *\n * ```tsx\n * <KeySequence keys={keySpecsFromShortcut({ key: 'z', mod: true, shift: true })} />\n * ```\n */\nexport function keySpecsFromShortcut(\n shortcut: ShortcutInput | undefined,\n opts: KeySpecsFromModsOptions = {},\n): readonly KeyLegend[] | undefined {\n if (!shortcut) return undefined;\n const mods: LogicalModSpec[] = [];\n if (shortcut.mod) mods.push({ name: 'mod' });\n if (shortcut.shift) mods.push(shortcut.shift === 'optional' ? { name: 'shift', optional: true } : { name: 'shift' });\n if (shortcut.alt) mods.push({ name: 'alt' });\n const key = typeof shortcut.key === 'string' ? shortcut.key : shortcut.key[0];\n const keys = keySpecsFromMods(mods, opts);\n return key === undefined ? keys : [...keys, keySpecFromKey(key, opts)];\n}\n","import { keySpecFromKey, keySpecsFromMods, type KeyLegend, type KeySpecsFromModsOptions, type LogicalMod } from './keySpecsFromMods';\n\nconst MOD_CODES: Readonly<Record<string, LogicalMod>> = {\n ShiftLeft: 'shift', ShiftRight: 'shift',\n ControlLeft: 'ctrl', ControlRight: 'ctrl',\n AltLeft: 'alt', AltRight: 'alt',\n MetaLeft: 'meta', MetaRight: 'meta',\n};\n\n/** What a US keyboard prints on keys `KeyboardEvent.code` names by position rather than by character. */\nconst PRINTED: Readonly<Record<string, string>> = {\n Backquote: '`', Minus: '-', Equal: '=', BracketLeft: '[', BracketRight: ']', Backslash: '\\\\',\n Semicolon: ';', Quote: \"'\", Comma: ',', Period: '.', Slash: '/', IntlBackslash: '§',\n CapsLock: 'Caps', Fn: 'fn',\n};\n\n/**\n * The legend of the physical key a `KeyboardEvent.code` names (`KeyA`, `ShiftLeft`, `ArrowUp`), as\n * {@link keySpecFromKey} prints that key on the platform: `MetaLeft` is `⌘` on macOS and `⊞` on\n * Windows. Letters and punctuation print as a US keyboard prints them. `opts.labels` answers by code\n * first, then as it does for {@link keySpecFromKey} and {@link keySpecsFromMods}.\n */\nexport function keySpecFromCode(code: string, opts: KeySpecsFromModsOptions = {}): KeyLegend {\n const own = opts.labels?.[code];\n if (own !== undefined) return { label: own };\n const mod = MOD_CODES[code];\n if (mod) return keySpecsFromMods([{ name: mod }], opts)[0]!;\n const char = /^Key([A-Z])$/.exec(code) ?? /^Digit(\\d)$/.exec(code);\n if (char) return keySpecFromKey(char[1]!, opts);\n if (code === 'NumpadEnter') return keySpecFromKey('Enter', opts);\n const printed = PRINTED[code];\n return printed !== undefined ? { label: printed } : keySpecFromKey(code, opts);\n}\n","import type { MenuShortcut } from '@weasel-js/menu';\nimport { keySpecsFromShortcut } from './keySpecsFromShortcut';\nimport { detectPlatform, type KeyLegend, type LegendStyle, type Platform } from './keySpecsFromMods';\n\n/** A keyboard shortcut as the formatters read it: `@weasel-js/menu`'s `MenuShortcut`. */\nexport type ShortcutInput = MenuShortcut;\n\n/** Options for {@link formatShortcut} and {@link formatShortcutParts}. */\nexport interface FormatShortcutOptions {\n /** Defaults to the detected platform. */\n platform?: Platform;\n /** {@link formatShortcutParts} only; {@link formatShortcut} picks its own. Defaults to `'auto'`. */\n legend?: LegendStyle;\n}\n\n/** One keymap on the way to a key: its label, and the chips of the leader that opens it. */\nexport interface ShortcutLeaderStep {\n label: string;\n keys: readonly KeyLegend[];\n}\n\n/** A shortcut as display chips: {@link formatShortcutParts}'s result. */\nexport interface ShortcutParts {\n /** The keymaps leading to the key, outermost first; empty for a key outside any keymap. */\n leader: readonly ShortcutLeaderStep[];\n /** The key's own chips: the modifiers, then the key. */\n keys: readonly KeyLegend[];\n}\n\n/** What {@link formatShortcut} writes after each leader step's label: `Loupe ▸ 2`. */\nexport const SHORTCUT_LEADER_SEPARATOR = ' ▸ ';\n\n/** Format a shortcut as display chips, one per key: the modifiers, then the\n * key, each as the platform's keyboard prints it, so `mod` is `⌘` on macOS\n * and `Ctrl` elsewhere, after the keymaps that lead to it (`Loupe ▸ 2`).\n * UIs that want a boxed per-key look render each chip in its own element.\n * `shift: 'optional'` gives an optional chip. */\nexport function formatShortcutParts(\n b: ShortcutInput | undefined,\n opts: FormatShortcutOptions = {},\n): ShortcutParts | undefined {\n const keys = keySpecsFromShortcut(b, opts);\n if (!b || !keys) return undefined;\n const leader = (b.leader ?? []).map((l) => ({ label: l.label, keys: keySpecsFromShortcut(l.shortcut, opts) ?? [] }));\n return { leader, keys };\n}\n\n/** Format a shortcut as a single display string. Order: mod, shift, alt,\n * key, after each keymap that leads to it (`Loupe ▸ ⌘2`). On macOS the glyphs run together (`⌘⇧Z`); elsewhere the keys are\n * spelled out and joined with `+` (`Ctrl+Shift+Z`). Returns `undefined` for\n * `undefined` input so callers can `??` a fallback. When `key` is an array,\n * the first element is used. `shift: 'optional'` is treated as falsy. */\nexport function formatShortcut(\n b: ShortcutInput | undefined,\n opts: FormatShortcutOptions = {},\n): string | undefined {\n const platform = opts.platform ?? detectPlatform();\n const mac = platform === 'macos';\n const parts = formatShortcutParts(b && { ...b, shift: b.shift === true }, mac ? { platform } : { platform, legend: 'text' });\n if (!parts) return undefined;\n const keys = parts.keys.map((k) => k.label).join(mac ? '' : '+');\n return [...parts.leader.map((l) => `${l.label}${SHORTCUT_LEADER_SEPARATOR}`), keys].join('');\n}\n","/**\n * Sugar for writing a key binding without the route grammar: `key('Mod+K')`,\n * `held('Space')`, `unbound()`. `bindingSpec` reads what a binding override\n * takes, and `keySpecRoute` writes a key spec back as the route string a host\n * persists.\n */\nimport { parseRoute } from '../grammar/routeGrammar';\nimport { routeToSpec } from '../grammar/routeToSpec';\nimport type { GestureSpec, KeyHeldSpec, KeySpec, ModSpec } from './spec';\n\nconst MODIFIERS: Record<string, keyof ModSpec> = {\n meta: 'meta', cmd: 'meta', command: 'meta',\n ctrl: 'ctrl', control: 'ctrl',\n alt: 'alt', option: 'alt',\n shift: 'shift',\n mod: 'mod',\n};\n\n/** Key names whose `KeyboardEvent.key` is spelled otherwise. */\nconst KEY_NAMES: Record<string, string> = { space: ' ', esc: 'Escape' };\n\nfunction parse(shortcut: string): { key: string; mods: ModSpec } {\n // A trailing '+' is the plus key: 'Mod++'.\n const parts = shortcut.endsWith('++') ? [...shortcut.slice(0, -2).split('+'), '+'] : shortcut.split('+');\n const raw = parts.pop();\n if (!raw) throw new Error(`shortcut \"${shortcut}\" names no key`);\n const mods: ModSpec = {};\n for (const part of parts) {\n const mod = MODIFIERS[part.toLowerCase()];\n if (!mod) throw new Error(`shortcut \"${shortcut}\": unknown modifier \"${part}\"`);\n mods[mod] = true;\n }\n return { key: KEY_NAMES[raw.toLowerCase()] ?? raw, mods };\n}\n\n/** A keystroke in the `Mod+Shift+K` form. Modifiers are case-insensitive:\n * `Meta`/`Cmd`/`Command`, `Ctrl`/`Control`, `Alt`/`Option`, `Shift`, and\n * `Mod` for Cmd on Apple platforms and Ctrl elsewhere. */\nexport function key(shortcut: string): KeySpec {\n const { key: k, mods } = parse(shortcut);\n return Object.keys(mods).length > 0 ? { kind: 'key', key: k, mods } : { kind: 'key', key: k };\n}\n\n/** The same keystroke held down, as a `key-held` spec. */\nexport function held(shortcut: string): KeyHeldSpec {\n const { key: k, mods } = parse(shortcut);\n return Object.keys(mods).length > 0 ? { kind: 'key-held', key: k, mods } : { kind: 'key-held', key: k };\n}\n\n/** A binding override that removes the binding. */\nexport function unbound(): null {\n return null;\n}\n\n/** What a binding override is written as: a route string, a spec, or `null` to unbind. */\nexport type BindingOverrideInput = string | GestureSpec | null;\n\n/** Read a binding override into the spec it names, or `null`. */\nexport function bindingSpec(input: BindingOverrideInput): GestureSpec | null {\n if (typeof input === 'string') return routeToSpec(parseRoute(input));\n return input;\n}\n\nconst MOD_ORDER: readonly (keyof ModSpec)[] = ['mod', 'shift', 'alt', 'ctrl', 'meta'];\n\n/** A key spec as its route string — what `bindingSpec` reads back to an\n * equal spec — or `null` for a key the route grammar cannot spell (`?`,\n * `)`, `*`). A spec is plain JSON, so store that one as it is. A key list is\n * written as its first key. */\nexport function keySpecRoute(spec: KeySpec | KeyHeldSpec): string | null {\n const k = Array.isArray(spec.key) ? spec.key[0]! : spec.key;\n const optional = MOD_ORDER.filter((m) => spec.mods?.[m] === 'optional');\n const required = MOD_ORDER.filter((m) => spec.mods?.[m] === true);\n const arg = [k, ...optional].join('?');\n const gesture = spec.kind === 'key' ? 'keyDown' : 'keyHeld';\n const route = [`[*:*] ${gesture}(${arg})`, ...required.map((m) => `+${m}`)].join(' ');\n return spellsKey(route, k) ? route : null;\n}\n\nfunction spellsKey(route: string, k: string): boolean {\n try {\n const back = bindingSpec(route);\n return back !== null && (back.kind === 'key' || back.kind === 'key-held') && back.key === k;\n } catch {\n return false;\n }\n}\n","/**\n * Elements an overlay may portal into: anything a theme has been stamped on\n * (`applyTheme` / `<ThemeProvider>` write both attributes), plus anything\n * opting in with `data-wzl-portal-host`. The opt-in exists for a styling root\n * that sits *below* the themed element — labkit's `.lk-root` carries element\n * defaults the themed wrapper does not.\n */\nconst HOST_SELECTOR = '[data-wzl-portal-host],[data-wzl-theme],[data-wzl-mode]';\n\n/**\n * The nearest element `from` sits inside that can host a portalled overlay,\n * or `null` when there is none and the body is the only answer.\n */\nexport function nearestPortalHost(from: Element | null | undefined): HTMLElement | null {\n return (from?.closest(HOST_SELECTOR) as HTMLElement | null) ?? null;\n}\n\n/** Whether `el` is the containing block of its fixed-position descendants rather than the viewport. */\nfunction containsFixed(el: Element): boolean {\n const cs = getComputedStyle(el);\n const set = (value: string | undefined) => value !== undefined && value !== '' && value !== 'none';\n return (\n set(cs.transform) ||\n set(cs.filter) ||\n set(cs.backdropFilter) ||\n set(cs.perspective) ||\n /paint|layout|strict|content/.test(cs.contain ?? '')\n );\n}\n\n/**\n * Where a `position: fixed` element following the pointer mounts: `host`, and\n * the client-space point its `left: 0; top: 0` lands on.\n */\nexport interface FixedSeat {\n host: HTMLElement;\n left: number;\n top: number;\n}\n\n/**\n * The seat for something drawn at a client-space point on behalf of `from`, a\n * drag ghost above all: the nearest portal host, so it resolves the theme\n * `from` is drawn in, or the body. Subtract `left` and `top` from the client\n * point to place it.\n */\nexport function fixedSeat(from: Element | null | undefined): FixedSeat {\n const host = nearestPortalHost(from) ?? document.body;\n if (host === document.body || !containsFixed(host)) return { host, left: 0, top: 0 };\n const rect = host.getBoundingClientRect();\n return { host, left: rect.left, top: rect.top };\n}\n","import { parseTargetSpec } from './match';\nimport type { GestureSpec, ModSpec, PhaseSpec, TargetSpec } from './spec';\nimport type { PhaseAtom } from '../grammar/routeGrammar';\n\n/** Count modifier keys declared as `required` (`true`). `'optional'`,\n * `false`, and `undefined` do NOT discriminate — they don't count. */\nfunction modsCount(mods: ModSpec | undefined): number {\n if (!mods) return 0;\n let n = 0;\n if (mods.alt === true) n++;\n if (mods.ctrl === true) n++;\n if (mods.meta === true) n++;\n if (mods.mod === true) n++;\n if (mods.shift === true) n++;\n return n;\n}\n\n/**\n * Rank a `TargetSpec` by how much it narrows. Graduated so a target that\n * names a specific thing outranks one that only names a class of things:\n *\n * 3 — `kind:<k>:selected`: this kind AND in the selection\n * 2 — `kind:<k>` / `affordance:<k>`: one named kind\n * 1 — `'empty'` / `'selected-body'` / `'unselected-body'` / `{ kindOf }`\n * 0 — no target\n *\n * A predicate stays at 1 because its narrowness is unknowable statically —\n * `hit == null` and `isRotateHandle` are the same shape here.\n */\nfunction targetRank(target: TargetSpec | undefined): number {\n if (target === undefined) return 0;\n const form = parseTargetSpec(target);\n if (form === null) return 1;\n switch (form.form) {\n case 'kind': return form.requireSelected ? 3 : 2;\n case 'affordance': return 2;\n case 'body': return 1;\n case 'predicate': return 1;\n default: {\n const _exhaustive: never = form;\n void _exhaustive;\n return 1;\n }\n }\n}\n\nfunction specTargetOf(spec: GestureSpec): TargetSpec | undefined {\n return 'target' in spec ? spec.target : undefined;\n}\n\n/**\n * Rank a `PhaseSpec` by how much it narrows, on the same graduated principle\n * as `targetRank`. A phase atom constrains two axes — which channel, and its\n * lifecycle state — and each may be wildcarded:\n *\n * 2 — both concrete: `{ channel: '&' | '<toolId>', phase: 'initial' }`,\n * which is also what the bare-keyword shorthand desugars to\n * 1 — one axis wildcarded: `{ channel: '*', phase: 'engaged' }`\n * 0 — `{ channel: '*', phase: '*' }`, or no `phase` field at all\n *\n * The `*:*` case scoring 0 is the point: it matches everything `matchPhase`\n * would have matched with no spec, so grading it above an undeclared phase\n * would let a binding buy precedence with a constraint that constrains\n * nothing — CSS's `:where()` problem.\n *\n * An atom list is a union (`matchPhase` returns true when ANY atom matches),\n * so the list is as broad as its broadest atom and takes the **minimum**.\n */\nfunction phaseRank(spec: PhaseSpec | undefined): number {\n if (spec === undefined) return 0;\n const atoms = typeof spec === 'string'\n ? [{ channel: '&', phase: spec } as PhaseAtom]\n : spec;\n if (atoms.length === 0) return 0;\n let min = 2;\n for (const a of atoms) {\n const rank = (a.channel === '*' ? 0 : 1) + (a.phase === '*' ? 0 : 1);\n if (rank < min) min = rank;\n }\n return min;\n}\n\n/** CSS-style specificity tuple for a GestureSpec. Higher tuple wins under\n * lexicographic compare. Dimensions, in order of precedence:\n *\n * [0] target — how much the spec's target narrows; see `targetRank`.\n * [1] mods — count of required modifier keys (shift/alt/ctrl/meta/mod).\n * `'optional'` does NOT count.\n * [2] phase — how much the spec's `phase` narrows; see `phaseRank`.\n * [3] exact — per-kind tiebreak: 2 for a drop/carry/paste spec with a\n * non-empty `types` MIME filter, else 1.\n *\n * Identical tuples fall back to registration order in the matcher's\n * stable sort. */\nexport function specificity(\n spec: GestureSpec,\n): readonly [number, number, number, number] {\n const t = targetRank(specTargetOf(spec));\n const mods = ('mods' in spec ? spec.mods : undefined) as ModSpec | undefined;\n const m = modsCount(mods);\n const p = phaseRank(('phase' in spec ? spec.phase : undefined) as PhaseSpec | undefined);\n // A consumer's `types: ['text/csv']` binding should win over the kit's\n // catch-all ingest binding.\n const typed =\n (spec.kind === 'drop' || spec.kind === 'carry' || spec.kind === 'paste') &&\n spec.types !== undefined && spec.types.length > 0\n ? 2 : 1;\n return [t, m, p, typed];\n}\n","/**\n * How far, in CSS pixels, a press must travel before it is a drag rather than\n * a click. `drag` specs match only past it: the pointer recognizer holds a\n * pointerdown back until the pointer crosses it, so a press-and-release that\n * stays under it never opens a drag.\n */\nexport const DRAG_THRESHOLD_PX = 4;\n\n/** Whether a pointer that went down at `from` has travelled far enough, by\n * `to`, to be a drag. Both points are client coordinates. */\nexport function pastDragThreshold(\n from: { clientX: number; clientY: number },\n to: { clientX: number; clientY: number },\n threshold: number = DRAG_THRESHOLD_PX,\n): boolean {\n return Math.hypot(to.clientX - from.clientX, to.clientY - from.clientY) >= threshold;\n}\n","/**\n * The times and distances that tell one pointer gesture from another. The\n * drag threshold sits with its helper in `ui/dragThreshold.ts`.\n */\n\n/** How long a touch or pen press is held before it fires `longPress`, in ms. */\nexport const LONG_PRESS_MS = 500;\n\n/** The longest gap between two clicks that still makes a double click, in ms:\n * the upper end of OS double-click settings. */\nexport const DOUBLE_CLICK_MAX_MS = 600;\n\n/** How far apart, in CSS pixels, two clicks may land and still make a double\n * click: the drift of a real mouse or trackpad between them. */\nexport const DOUBLE_CLICK_MAX_PX = 8;\n\n/** How far, in CSS pixels, a finger or the centroid of a multitouch gesture\n * may travel before the gesture stops being a tap. */\nexport const TAP_THRESHOLD_PX = 8;\n","/**\n * What the recognizer remembers of a press, and the events a release or a\n * hold on it synthesizes.\n */\nimport type { BodyKind, BodyTarget, DoubleClickBody, EventModifiers, InputEvent } from '../ui/inputEvent';\nimport type { Point } from './multiTouch';\n\n/** Press-time state replayed onto a synthesized click, long-press or\n * contextmenu, whose matchers resolve targets against it. */\nexport interface PressFacts extends EventModifiers {\n target: unknown;\n clientX: number;\n clientY: number;\n /** The press point in the host's world space, forwarded onto the\n * synthesized click as `pressX`/`pressY` — see `ClickEvent`. */\n world: Point;\n affordance?: unknown;\n bodyTarget?: BodyTarget;\n bodyKind?: BodyKind;\n /** Replayed onto the double click in place of `bodyTarget` and `bodyKind`. */\n doubleClickBody?: DoubleClickBody;\n}\n\n/** Where and how a press was released, for the click it turned out to be. */\nexport interface ReleaseFacts extends EventModifiers {\n target: unknown;\n clientX: number;\n clientY: number;\n /** The release point in the host's world space. */\n world: Point;\n}\n\n/** What a press landed on, as a spread-able partial with no `undefined`-valued keys. */\nexport function pressedOn(\n down: Pick<PressFacts, 'affordance' | 'bodyTarget' | 'bodyKind'>,\n): Pick<PressFacts, 'affordance' | 'bodyTarget' | 'bodyKind'> {\n return {\n ...(down.affordance !== undefined ? { affordance: down.affordance } : {}),\n ...(down.bodyTarget !== undefined ? { bodyTarget: down.bodyTarget } : {}),\n ...(down.bodyKind !== undefined ? { bodyKind: down.bodyKind } : {}),\n };\n}\n\n/** A press released where it went down, as a click, and as the double click\n * it is when it follows another closely. Both happen at the release, with the\n * release's modifiers, on what the press landed on. */\nexport function clickEvents(down: PressFacts, up: ReleaseFacts): { click: InputEvent; doubleclick: InputEvent } {\n const shared = {\n target: up.target,\n altKey: up.altKey,\n ctrlKey: up.ctrlKey,\n metaKey: up.metaKey,\n shiftKey: up.shiftKey,\n x: up.world.x,\n y: up.world.y,\n clientX: up.clientX,\n clientY: up.clientY,\n };\n const named = down.doubleClickBody;\n return {\n click: { kind: 'click', ...shared, ...pressedOn(down), pressX: down.world.x, pressY: down.world.y },\n doubleclick: {\n kind: 'doubleclick', ...shared,\n ...pressedOn(named ? { affordance: down.affordance, ...named } : down),\n },\n };\n}\n\n/** A held press as a long-press, and as the contextmenu it falls back to when\n * the long-press matches nothing. The fallback is what makes existing\n * `contextMenu` bindings reachable by touch with no consumer change. */\nexport function longPressEvents(down: PressFacts): { longpress: InputEvent; contextmenu: InputEvent } {\n const shared = {\n target: down.target,\n altKey: down.altKey,\n ctrlKey: down.ctrlKey,\n metaKey: down.metaKey,\n shiftKey: down.shiftKey,\n ...pressedOn(down),\n };\n const at = { x: down.world.x, y: down.world.y, clientX: down.clientX, clientY: down.clientY };\n return {\n longpress: { kind: 'longpress', ...at, ...shared },\n contextmenu: { kind: 'contextmenu', ...at, ...shared },\n };\n}\n","/** A press released in place: its click, and the double click a second one makes. */\nimport type { InputEvent } from '../ui/inputEvent';\nimport type { Point } from './multiTouch';\nimport { clickEvents, type PressFacts, type ReleaseFacts } from './pressFacts';\nimport { DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX } from './thresholds';\n\n/**\n * The click a double click would follow. Held by the host rather than the\n * recognizer when it has to outlive one: a host that rebuilds its recognizer\n * between two clicks would otherwise drop the double click.\n */\nexport interface ClickMemory {\n last: { t: number; clientX: number; clientY: number } | null;\n}\n\n/** Told of clicks without competing for them, as a binding would. */\nexport interface ClickObserver {\n /** After the click was dispatched, so whatever its binding changed is readable. */\n click?(world: Point): void;\n /** Before the double click is dispatched, whichever binding then handles it. */\n doubleClick?(world: Point): void;\n}\n\n/** What a release composed. `doubleClick` is absent unless one was dispatched. */\nexport interface ReleaseOutcome {\n doubleClick?: 'handled' | 'unhandled';\n}\n\n/** How close in time and place two clicks land to make a double click. */\nexport interface DoubleClickLimits {\n maxMs: number;\n maxPx: number;\n}\n\nexport function composeClick(\n down: PressFacts,\n up: ReleaseFacts,\n clicks: ClickMemory,\n now: () => number,\n dispatch: (ev: InputEvent) => 'handled' | 'unhandled',\n observer: ClickObserver,\n limits: DoubleClickLimits = { maxMs: DOUBLE_CLICK_MAX_MS, maxPx: DOUBLE_CLICK_MAX_PX },\n): ReleaseOutcome {\n const evs = clickEvents(down, up);\n const { world } = up;\n dispatch(evs.click);\n observer.click?.(world);\n\n const t = now();\n const prev = clicks.last;\n const follows = prev !== null\n && t - prev.t < limits.maxMs\n && Math.hypot(up.clientX - prev.clientX, up.clientY - prev.clientY) < limits.maxPx;\n if (!follows) {\n clicks.last = { t, clientX: up.clientX, clientY: up.clientY };\n return {};\n }\n observer.doubleClick?.(world);\n const doubleClick = dispatch(evs.doubleclick);\n // Start over, so a third click composes nothing with the second.\n clicks.last = null;\n return { doubleClick };\n}\n","/** The one press being timed toward a long-press. */\nimport type { PressFacts } from './pressFacts';\n\n/** A clock and a timer, so a host or a test supplies its own. */\nexport interface RecognizerClock {\n now(): number;\n setTimer(fn: () => void, ms: number): unknown;\n clearTimer(timer: unknown): void;\n}\n\n/** A press held toward a long-press. */\nexport interface HeldPress {\n pointerId: number;\n /** A mouse never arms one. */\n pointerType: 'touch' | 'pen';\n press: PressFacts;\n /** `RecognizerClock.now()` when the hold started. */\n startedAt: number;\n /** How long the hold must last before the long-press fires, in ms. */\n duration: number;\n}\n\nexport interface LongPressHold {\n /** Start timing `press`; `fire` runs if it is still pending when its duration is up. */\n arm(press: HeldPress, fire: () => void): void;\n pendingFor(pointerId: number): boolean;\n /** Stop timing the pending press: any, or only `pointerId`'s. */\n cancel(pointerId?: number): void;\n}\n\n/**\n * One slot, not one per pointer: only a lone pointer arms a hold, and a second\n * one landing cancels it. `onChange` hears the pending press, and `null` when\n * it fires or is abandoned.\n */\nexport function createLongPressHold(\n clock: RecognizerClock,\n onChange: (pending: HeldPress | null) => void,\n): LongPressHold {\n let pending: { pointerId: number; timer: unknown } | null = null;\n\n const cancel = (pointerId?: number): void => {\n if (!pending || (pointerId !== undefined && pending.pointerId !== pointerId)) return;\n clock.clearTimer(pending.timer);\n pending = null;\n onChange(null);\n };\n\n return {\n arm(press, fire) {\n cancel();\n const timer = clock.setTimer(() => {\n pending = null;\n onChange(null);\n fire();\n }, press.duration);\n pending = { pointerId: press.pointerId, timer };\n onChange(press);\n },\n pendingFor: (pointerId) => pending?.pointerId === pointerId,\n cancel,\n };\n}\n","/** Two or more pointers down at once: their geometry, and whether the episode was a tap. */\nimport { TAP_THRESHOLD_PX } from './thresholds';\n\n/** A position in whatever space the recognizer's `positionOf` reports. */\nexport interface Point { x: number; y: number }\n\n/** Where two or more pointers sit: what `multiTouchGeometry` reads from their positions. */\nexport interface MultiTouchGeometry {\n centroid: Point;\n /** Distance between the first two pointers. */\n spread: number;\n /** Direction from the first pointer to the second, in degrees in (-180, 180],\n * growing clockwise on screen. */\n angle: number;\n}\n\n/** Every pointer's centroid, and the first two's spread and angle. All zero with fewer than 2 pointers. */\nexport function multiTouchGeometry(positions: Iterable<Point>): MultiTouchGeometry {\n const pts = [...positions];\n if (pts.length < 2) return { centroid: { x: 0, y: 0 }, spread: 0, angle: 0 };\n let sumX = 0;\n let sumY = 0;\n for (const p of pts) {\n sumX += p.x;\n sumY += p.y;\n }\n const dx = pts[1]!.x - pts[0]!.x;\n const dy = pts[1]!.y - pts[0]!.y;\n return {\n centroid: { x: sumX / pts.length, y: sumY / pts.length },\n spread: Math.sqrt(dx * dx + dy * dy),\n angle: (Math.atan2(dy, dx) * 180) / Math.PI,\n };\n}\n\ninterface Episode {\n /** The most fingers down at once. */\n fingers: number;\n centroid: Point;\n /** Where each finger was when it joined: a pinch about a still center moves\n * every finger and no centroid. */\n joinedAt: Map<number, Point>;\n moved: boolean;\n startedAt: number;\n}\n\nexport interface MultiTouchEpisode {\n /** A finger landed with at least two now down. `positions` is every held pointer's. */\n join(positions: ReadonlyMap<number, Point>, centroid: Point, now: number): void;\n moved(pointerId: number, to: Point): void;\n /**\n * The hand dropped below two fingers, its centroid last at `centroid`. The\n * peak finger count when the episode was a tap: brief, and nothing moved.\n */\n finish(centroid: Point, now: number, maxHoldMs: number): number | null;\n /** End the episode with no tap. */\n abandon(): void;\n}\n\n/** `tapPx` is how far a finger or the centroid may travel and still tap, read as each is measured. */\nexport function createMultiTouchEpisode(tapPx: () => number = () => TAP_THRESHOLD_PX): MultiTouchEpisode {\n let episode: Episode | null = null;\n return {\n join(positions, centroid, now) {\n if (!episode) {\n episode = {\n fingers: positions.size, centroid: { ...centroid }, joinedAt: new Map(), moved: false, startedAt: now,\n };\n } else {\n episode.fingers = positions.size;\n }\n for (const [id, p] of positions) {\n if (!episode.joinedAt.has(id)) episode.joinedAt.set(id, { ...p });\n }\n },\n moved(pointerId, to) {\n const from = episode?.joinedAt.get(pointerId);\n if (episode && from && Math.hypot(to.x - from.x, to.y - from.y) > tapPx()) episode.moved = true;\n },\n finish(centroid, now, maxHoldMs) {\n const e = episode;\n episode = null;\n if (!e) return null;\n // A hold as long as a long-press is not a tap, for two fingers as for one.\n const brief = now - e.startedAt < maxHoldMs;\n const still = Math.hypot(centroid.x - e.centroid.x, centroid.y - e.centroid.y) <= tapPx();\n return brief && !e.moved && still ? e.fingers : null;\n },\n abandon() { episode = null; },\n };\n}\n","/**\n * What a host feeds the pointer recognizer, one per pointer event, and the\n * pump events each becomes.\n */\nimport type {\n BodyKind, BodyTarget, DoubleClickBody, EventModifiers, InputEvent, PointerDownEvent, PointerSampleStylus,\n} from '../ui/inputEvent';\nimport { stylusOf } from '../ui/stylus';\nimport type { Point } from './multiTouch';\nimport { pressedOn, type PressFacts } from './pressFacts';\n\n/** One pointer event, in client space. */\nexport interface PointerSample extends EventModifiers, PointerSampleStylus {\n pointerId: number;\n clientX: number;\n clientY: number;\n /** What the originating event was aimed at. */\n target?: unknown;\n /**\n * When the input happened, on the recognizer clock's timeline: a DOM event's\n * `timeStamp` beside `performance.now()`. The windows between two inputs are\n * measured on it, so a long task that delays an event's handling does not\n * widen them. Read as the clock's `now()` when absent, 0, or ahead of it.\n */\n timeStamp?: number;\n}\n\n/** A pointer going down, with what the host found under it. */\nexport interface PressSample extends PointerSample {\n /** The world point the host hit-tested at. */\n x: number;\n y: number;\n /** `PointerEvent.pointerType`. Only `'touch'` and `'pen'` arm a long-press. */\n pointerType: string;\n affordance?: unknown;\n bodyTarget?: BodyTarget;\n bodyKind?: BodyKind;\n /** What a double click this press completes lands on, where not the body hit. */\n doubleClickBody?: DoubleClickBody;\n}\n\nexport function modifiersOf(e: EventModifiers): EventModifiers {\n return { altKey: e.altKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, shiftKey: e.shiftKey };\n}\n\nexport function pressFactsOf(s: PressSample): PressFacts {\n return {\n target: s.target,\n clientX: s.clientX,\n clientY: s.clientY,\n world: { x: s.x, y: s.y },\n ...modifiersOf(s),\n ...pressedOn(s),\n ...(s.doubleClickBody !== undefined ? { doubleClickBody: s.doubleClickBody } : {}),\n };\n}\n\nconst at = (s: PointerSample, world: Point) => ({\n pointerId: s.pointerId, x: world.x, y: world.y, clientX: s.clientX, clientY: s.clientY, ...modifiersOf(s),\n});\n\nexport function pointerDownEvent(s: PressSample): PointerDownEvent {\n return { kind: 'pointerdown', target: s.target, ...at(s, s), ...stylusOf(s), ...pressedOn(s) };\n}\n\nexport function pointerMoveEvent(s: PointerSample, world: Point): InputEvent {\n return { kind: 'pointermove', ...at(s, world), ...stylusOf(s) };\n}\n\nexport function pointerUpEvent(s: PointerSample, world: Point): InputEvent {\n return { kind: 'pointerup', ...at(s, world) };\n}\n","/**\n * Turns pointer samples into the gestures they add up to: a press, the drag\n * it becomes past the threshold, the click it is when released in place, the\n * double click two of those make, a long-press, and multitouch.\n *\n * It decides with its sink's answers, so it is not a pure function of its\n * input: a long-press only spends its press when something handled it.\n */\nimport type { EventModifiers, InputEvent } from '../ui/inputEvent';\nimport { pastDragThreshold } from '../ui/dragThreshold';\nimport { composeClick, type ClickMemory, type ClickObserver, type ReleaseOutcome } from './click';\nimport { createLongPressHold, type HeldPress, type RecognizerClock } from './longPressHold';\nimport { createMultiTouchEpisode, multiTouchGeometry, type MultiTouchGeometry, type Point } from './multiTouch';\nimport { longPressEvents, type PressFacts } from './pressFacts';\nimport {\n modifiersOf, pointerDownEvent, pointerMoveEvent, pointerUpEvent, pressFactsOf,\n type PointerSample, type PressSample,\n} from './samples';\nimport { DRAG_THRESHOLD_PX } from '../ui/dragThreshold';\nimport { DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX, LONG_PRESS_MS, TAP_THRESHOLD_PX } from './thresholds';\n\n/** Where recognized events go. */\nexport interface RecognizerSink {\n dispatch(ev: InputEvent): 'handled' | 'unhandled';\n /** Whether a multitouch gesture of `fingers` fingers is running, to be pumped. */\n multiTouchInFlight(fingers: number): boolean;\n}\n\n/** What a host hears about beyond the events themselves, to drive press feedback. */\nexport interface RecognizerObserver extends ClickObserver {\n /** The press being held toward a long-press, or `null` once it fires or is abandoned. */\n holdChanged?(pending: HeldPress | null): void;\n /** A long-press something handled, as itself or as its contextmenu fallback. */\n longPress?(pointerType: 'touch' | 'pen'): void;\n}\n\n/** What {@link createPointerRecognizer} needs from its host. */\nexport interface PointerRecognizerOptions {\n sink: RecognizerSink;\n clock: RecognizerClock;\n /**\n * Client point to world point; the identity by default. Asked as each event\n * is built rather than once per sample: an event dispatched earlier in the\n * same sample, a pinch step say, may have moved the view.\n */\n toWorld?: (clientX: number, clientY: number) => Point;\n /** Client point to the space a multitouch centroid is reported in. The identity by default. */\n toSurface?: (client: Point) => Point;\n /** Long-press hold time in ms, read at each press. Default `LONG_PRESS_MS`. */\n longPressMs?: () => number | undefined;\n /** Longest gap in ms between two clicks of a double click, read at each click. Default `DOUBLE_CLICK_MAX_MS`. */\n doubleClickMs?: () => number | undefined;\n /** Farthest two clicks of a double click may land apart, in CSS px. Default `DOUBLE_CLICK_MAX_PX`. */\n doubleClickPx?: () => number | undefined;\n /** Farthest a multitouch tap's fingers may travel, in CSS px. Default `TAP_THRESHOLD_PX`. */\n tapPx?: () => number | undefined;\n /** Travel in CSS px that makes a press a drag, read at each move. Default `DRAG_THRESHOLD_PX`. */\n dragPx?: () => number | undefined;\n clicks?: ClickMemory;\n observer?: RecognizerObserver;\n}\n\n/** A recognizer for one surface. Its host feeds it every pointer sample the surface receives. */\nexport interface PointerRecognizer {\n press(sample: PressSample): void;\n /** A move of any pointer, held or not. */\n move(sample: PointerSample): void;\n release(sample: PointerSample): ReleaseOutcome;\n /** A held pointer ended without a release. */\n cancel(pointerId: number): void;\n /**\n * Whether a touch or pen that armed a long-press is still held. One still\n * pending fires here, ahead of its timer: a platform that reports the hold\n * itself is reporting the same one.\n */\n takeHold(): boolean;\n heldCount(): number;\n /** A held pointer's latest client position. */\n positionOf(pointerId: number): Point | undefined;\n /** Forget every held pointer and stop timing, dispatching nothing. */\n reset(): void;\n}\n\ninterface Held {\n pos: Point;\n /** The press, withheld until movement crosses the drag threshold. Null once\n * forwarded, spent by a long-press, or claimed by multitouch. */\n buffered: InputEvent | null;\n down: PressFacts;\n /** Set on a pointer that armed a long-press, for as long as it is held. */\n holdType?: 'touch' | 'pen';\n}\n\nfunction multiTouchEvent(\n fingers: number,\n mods: EventModifiers,\n more: MultiTouchGeometry | { end: 'commit' | 'cancel' },\n): InputEvent {\n return { kind: 'multitouch', fingers, ...modifiersOf(mods), ...more };\n}\n\nconst positionsOf = (held: ReadonlyMap<number, Held>): Map<number, Point> =>\n new Map([...held].map(([id, p]) => [id, p.pos]));\n\n/** The held pointers' geometry, plus `extra` points, with the centroid in surface space. */\nfunction heldGeometry(\n held: ReadonlyMap<number, Held>,\n toSurface: (client: Point) => Point,\n extra: Point[],\n): MultiTouchGeometry {\n const g = multiTouchGeometry([...positionsOf(held).values(), ...extra]);\n return { ...g, centroid: toSurface(g.centroid) };\n}\n\n/** A hold that lasted: a long-press, or the contextmenu it falls back to. */\nfunction fireLongPress(rec: Held | undefined, sink: RecognizerSink, observer: RecognizerObserver): void {\n if (!rec) return;\n const evs = longPressEvents(rec.down);\n let result = sink.dispatch(evs.longpress);\n if (result === 'unhandled') result = sink.dispatch(evs.contextmenu);\n if (result === 'unhandled') return;\n // The press is spent: its release must not click, nor a later move open a drag.\n rec.buffered = null;\n if (rec.holdType) observer.longPress?.(rec.holdType);\n}\n\n/** Each threshold as its option says at the moment of reading, else its constant. */\nfunction thresholdsOf(opts: PointerRecognizerOptions) {\n return {\n longPressMs: (): number => opts.longPressMs?.() ?? LONG_PRESS_MS,\n tapPx: (): number => opts.tapPx?.() ?? TAP_THRESHOLD_PX,\n dragPx: (): number => opts.dragPx?.() ?? DRAG_THRESHOLD_PX,\n doubleClick: () => ({\n maxMs: opts.doubleClickMs?.() ?? DOUBLE_CLICK_MAX_MS,\n maxPx: opts.doubleClickPx?.() ?? DOUBLE_CLICK_MAX_PX,\n }),\n };\n}\n\n/** When a sample's input happened, on `clock`'s timeline. */\nfunction sampleTime(clock: RecognizerClock): (s: PointerSample) => number {\n return (s) => {\n const now = clock.now();\n const t = s.timeStamp;\n return t !== undefined && t > 0 && t <= now ? t : now;\n };\n}\n\n/** Build a recognizer holding no pointers. It touches no DOM: time and timers come from `opts.clock`. */\nexport function createPointerRecognizer(opts: PointerRecognizerOptions): PointerRecognizer {\n const { sink, clock, observer = {}, toSurface = (p) => p } = opts;\n const world = (s: PointerSample): Point => opts.toWorld?.(s.clientX, s.clientY) ?? { x: s.clientX, y: s.clientY };\n const clicks = opts.clicks ?? { last: null };\n const held = new Map<number, Held>();\n const { longPressMs, tapPx, dragPx, doubleClick } = thresholdsOf(opts);\n const touches = createMultiTouchEpisode(tapPx);\n const hold = createLongPressHold(clock, (pending) => { observer.holdChanged?.(pending); });\n const geometry = (extra: Point[] = []) => heldGeometry(held, toSurface, extra);\n const happenedAt = sampleTime(clock);\n\n // MULTI-POINTER POLICY: multitouch takes every pointer that has not already\n // committed to a gesture, by clearing its buffered press. One that already\n // opened a drag has no buffer left to claim, so its drag survives the second\n // finger: yanking it from someone who rested a palm is worse than letting it finish.\n const claimForMultiTouch = (s: PointerSample): void => {\n hold.cancel();\n for (const p of held.values()) p.buffered = null;\n const g = geometry();\n touches.join(positionsOf(held), g.centroid, happenedAt(s));\n sink.dispatch(multiTouchEvent(held.size, s, g));\n };\n\n return {\n press(s) {\n const ev = pointerDownEvent(s);\n const rec: Held = { pos: { x: s.clientX, y: s.clientY }, buffered: ev, down: pressFactsOf(s) };\n held.set(s.pointerId, rec);\n // The press dispatches twice, to disjoint spec kinds: now for\n // `pointerDown` bindings, and buffered for `drag`. A second finger's is\n // withheld, or it would act under the pinch it belongs to.\n if (held.size < 2) sink.dispatch({ ...ev, stage: 'press' });\n if ((s.pointerType === 'touch' || s.pointerType === 'pen') && held.size === 1) {\n rec.holdType = s.pointerType;\n hold.arm(\n { pointerId: s.pointerId, pointerType: s.pointerType, press: rec.down, startedAt: clock.now(), duration: longPressMs() },\n () => { fireLongPress(held.get(s.pointerId), sink, observer); },\n );\n }\n if (held.size >= 2) claimForMultiTouch(s);\n },\n\n move(s) {\n const rec = held.get(s.pointerId);\n const to = { x: s.clientX, y: s.clientY };\n if (rec) rec.pos = to;\n touches.moved(s.pointerId, to);\n // The buffered press goes out before the move: it opens the drag the moves pump.\n if (rec?.buffered && pastDragThreshold(rec.down, s, dragPx())) {\n const press = rec.buffered;\n rec.buffered = null;\n hold.cancel(s.pointerId);\n sink.dispatch(press);\n }\n if (held.size >= 2 && sink.multiTouchInFlight(held.size)) {\n sink.dispatch(multiTouchEvent(held.size, s, geometry()));\n }\n sink.dispatch(pointerMoveEvent(s, world(s)));\n },\n\n release(s) {\n hold.cancel(s.pointerId);\n const before = held.size;\n const rec = held.get(s.pointerId);\n held.delete(s.pointerId);\n // Any finger lifting ends the multitouch gesture the hand was making.\n if (before >= 2) sink.dispatch(multiTouchEvent(before, s, { end: 'commit' }));\n if (before >= 2 && held.size < 2) {\n // The centroid as it was with this pointer still down.\n const fingers = touches.finish(\n geometry([{ x: s.clientX, y: s.clientY }]).centroid, happenedAt(s), longPressMs(),\n );\n if (fingers !== null) sink.dispatch({ kind: 'multitouchtap', fingers, ...modifiersOf(s) });\n }\n sink.dispatch(pointerUpEvent(s, world(s)));\n // A press still buffered never crossed the drag threshold, and nothing\n // else spent it. Without this, a tool binding `click` but not `drag`\n // would click on the release of a drag clear across the canvas.\n if (!rec?.buffered) return {};\n const at = world(s);\n const up = {\n target: s.target, clientX: s.clientX, clientY: s.clientY, world: { x: at.x, y: at.y }, ...modifiersOf(s),\n };\n return composeClick(rec.down, up, clicks, () => happenedAt(s), (ev) => sink.dispatch(ev), observer, doubleClick());\n },\n\n cancel(pointerId) {\n const rec = held.get(pointerId);\n if (!rec) return;\n const before = held.size;\n held.delete(pointerId);\n hold.cancel(pointerId);\n // A cancel carries no modifiers of its own, so these are the press's.\n if (before >= 2) sink.dispatch(multiTouchEvent(before, rec.down, { end: 'cancel' }));\n touches.abandon();\n sink.dispatch({ kind: 'pointercancel', pointerId, ...modifiersOf(rec.down) });\n },\n\n takeHold() {\n let holding = false;\n for (const [id, rec] of held) {\n if (!rec.holdType) continue;\n holding = true;\n if (!hold.pendingFor(id)) continue;\n hold.cancel(id);\n fireLongPress(rec, sink, observer);\n }\n return holding;\n },\n\n heldCount: () => held.size,\n positionOf: (pointerId) => held.get(pointerId)?.pos,\n reset() {\n hold.cancel();\n held.clear();\n touches.abandon();\n },\n };\n}\n","/** Elements that handle their own press and keys. */\nexport const CONTROL_SELECTOR = [\n 'button', 'input', 'select', 'textarea', 'a[href]', '[contenteditable=\"\"]', '[contenteditable=\"true\"]',\n '[role=\"button\"]', '[role=\"checkbox\"]', '[role=\"switch\"]', '[role=\"menuitem\"]', '[role=\"link\"]',\n].join(',');\n\n/**\n * Whether `target` sits in a control of its own somewhere inside `host` — a\n * toggle in a list row, a button over a canvas. The host's handlers leave such\n * an event to the control, so a host's press, click and keys never swallow its\n * controls'.\n */\nexport function isInControlWithin(target: EventTarget | null, host: Element): boolean {\n if (!(target instanceof Element)) return false;\n const control = target.closest(CONTROL_SELECTOR);\n return control !== null && control !== host && host.contains(control);\n}\n","/**\n * Which pointers are down on an element: pressed on it or inside it, with any\n * button, and not yet released. The one answer to \"is this move a hover\" for\n * everything listening on that element.\n */\nexport interface HeldPointers {\n count(): number;\n /** Stop reading. The element's listeners go with its last reader. */\n release(): void;\n}\n\ninterface Tracker {\n readers: number;\n /** Pointer id to whether its press reported button state at all. */\n held: Map<number, boolean>;\n detach(): void;\n}\n\nconst trackers = new WeakMap<Element, Tracker>();\n\nfunction attach(element: Element): Tracker {\n const doc = element.ownerDocument;\n const win = doc.defaultView;\n const held = new Map<number, boolean>();\n const down = (e: Event): void => {\n const p = e as PointerEvent;\n held.set(p.pointerId, !!p.buttons);\n };\n const up = (e: Event): void => { held.delete((e as PointerEvent).pointerId); };\n // A move with nothing held is the release this document never saw. Read\n // only for a press that reported buttons: synthesized events carry none.\n const move = (e: Event): void => {\n const p = e as PointerEvent;\n if (held.get(p.pointerId) && p.buttons === 0) held.delete(p.pointerId);\n };\n // A window that loses focus may never deliver the release.\n const blur = (): void => { held.clear(); };\n\n // Capture phase, so nothing that stops propagation can hide a press or its release.\n element.addEventListener('pointerdown', down, true);\n doc.addEventListener('pointerup', up, true);\n doc.addEventListener('pointercancel', up, true);\n doc.addEventListener('pointermove', move, true);\n win?.addEventListener('blur', blur);\n return {\n readers: 0,\n held,\n detach() {\n element.removeEventListener('pointerdown', down, true);\n doc.removeEventListener('pointerup', up, true);\n doc.removeEventListener('pointercancel', up, true);\n doc.removeEventListener('pointermove', move, true);\n win?.removeEventListener('blur', blur);\n },\n };\n}\n\n/**\n * Read the pointers held on `element`. Every reader of one element shares one\n * set of listeners, so they cannot disagree.\n */\nexport function heldPointers(element: Element): HeldPointers {\n let tracker = trackers.get(element);\n if (!tracker) {\n tracker = attach(element);\n trackers.set(element, tracker);\n }\n const shared = tracker;\n shared.readers += 1;\n let released = false;\n return {\n count: () => shared.held.size,\n release() {\n if (released) return;\n released = true;\n shared.readers -= 1;\n if (shared.readers > 0) return;\n shared.detach();\n if (trackers.get(element) === shared) trackers.delete(element);\n },\n };\n}\n","/** Returns true when the target takes typed text: an input, a textarea, or a contenteditable element. */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!target || !(target instanceof Element)) return false;\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((target as HTMLElement).isContentEditable) return true;\n const ce = target.getAttribute('contenteditable');\n return ce === 'true' || ce === '';\n}\n\nconst ACTIVATED_BY_KEY = [\n 'button', 'a[href]', 'summary', 'select',\n 'input[type=\"button\"]', 'input[type=\"submit\"]', 'input[type=\"reset\"]',\n 'input[type=\"checkbox\"]', 'input[type=\"radio\"]',\n '[role=\"button\"]', '[role=\"link\"]', '[role=\"checkbox\"]', '[role=\"switch\"]',\n '[role=\"menuitem\"]', '[role=\"tab\"]', '[role=\"option\"]',\n].join(', ');\n\n/**\n * True when `e` is Space or Enter on a focused control those keys activate — a\n * button, a link, a checkbox. The key is that control's, so a page-level\n * listener that claims it cancels the control's own activation.\n */\nexport function activatesFocusedControl(e: KeyboardEvent): boolean {\n if (e.key !== ' ' && e.key !== 'Enter') return false;\n return e.target instanceof Element && e.target.matches(ACTIVATED_BY_KEY);\n}\n\nconst SELECT_NAVIGATION = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown']);\n\nfunction selectOwnsKey(e: KeyboardEvent): boolean {\n if (!(e.target instanceof Element) || e.target.tagName !== 'SELECT') return false;\n if (e.metaKey || e.ctrlKey || e.altKey) return false;\n // A one-character `key` is a printable character, which a select reads as type-ahead.\n return SELECT_NAVIGATION.has(e.key) || e.key.length === 1;\n}\n\n/**\n * True when the key `e` reports belongs to the control it was typed on: Space\n * or Enter on anything those activate, and a `<select>`'s type-ahead\n * characters and navigation keys. A select claims nothing else, so Delete,\n * Escape, and every modifier chord typed on one are still a page-level\n * listener's to take. A text field is {@link isEditableTarget}'s question,\n * since it owns every key.\n */\nexport function focusedControlOwnsKey(e: KeyboardEvent): boolean {\n return activatesFocusedControl(e) || selectOwnsKey(e);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weasel-js/gestures",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Pure gesture taxonomy, route grammars, and matcher primitives. No React, no DOM, no scene.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"./package.json": "./package.json"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@weasel-js/menu": "1.
|
|
19
|
+
"@weasel-js/menu": "1.14.0"
|
|
20
20
|
},
|
|
21
21
|
"author": "orochi235",
|
|
22
22
|
"homepage": "https://orochi235.github.io/weasel/",
|