murasaki 0.2.0 → 0.3.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.
Files changed (98) hide show
  1. package/bin/murasaki.js +8 -3
  2. package/dist/cli/colors.d.ts +13 -0
  3. package/dist/cli/colors.d.ts.map +1 -0
  4. package/dist/cli/colors.js +14 -0
  5. package/dist/cli/colors.js.map +1 -0
  6. package/dist/cli/log.d.ts +14 -0
  7. package/dist/cli/log.d.ts.map +1 -0
  8. package/dist/cli/log.js +25 -0
  9. package/dist/cli/log.js.map +1 -0
  10. package/dist/components/Link.d.ts +9 -0
  11. package/dist/components/Link.d.ts.map +1 -0
  12. package/dist/components/Link.js +15 -0
  13. package/dist/components/Link.js.map +1 -0
  14. package/dist/dev.d.ts +2 -0
  15. package/dist/dev.d.ts.map +1 -0
  16. package/dist/dev.js +41 -0
  17. package/dist/dev.js.map +1 -0
  18. package/dist/env.d.ts +15 -0
  19. package/dist/env.d.ts.map +1 -0
  20. package/dist/env.js +43 -0
  21. package/dist/env.js.map +1 -0
  22. package/dist/index.d.ts +18 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/jsx/dom/index.d.ts +2 -0
  27. package/dist/jsx/dom/index.d.ts.map +1 -0
  28. package/dist/jsx/dom/index.js +3 -0
  29. package/dist/jsx/dom/index.js.map +1 -0
  30. package/dist/jsx/dom/runtime.d.ts +34 -0
  31. package/dist/jsx/dom/runtime.d.ts.map +1 -0
  32. package/dist/jsx/dom/runtime.js +303 -0
  33. package/dist/jsx/dom/runtime.js.map +1 -0
  34. package/dist/jsx/index.d.ts +3 -0
  35. package/dist/jsx/index.d.ts.map +1 -0
  36. package/dist/jsx/index.js +3 -0
  37. package/dist/jsx/index.js.map +1 -0
  38. package/dist/jsx/jsx-dev-runtime.d.ts +2 -0
  39. package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
  40. package/dist/jsx/jsx-dev-runtime.js +7 -0
  41. package/dist/jsx/jsx-dev-runtime.js.map +1 -0
  42. package/dist/jsx/jsx-runtime.d.ts +2 -0
  43. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  44. package/{src/jsx/jsx-runtime.ts → dist/jsx/jsx-runtime.js} +4 -3
  45. package/dist/jsx/jsx-runtime.js.map +1 -0
  46. package/dist/jsx/runtime.d.ts +24 -0
  47. package/dist/jsx/runtime.d.ts.map +1 -0
  48. package/dist/jsx/runtime.js +273 -0
  49. package/dist/jsx/runtime.js.map +1 -0
  50. package/dist/jsx/types.d.ts +30 -0
  51. package/dist/jsx/types.d.ts.map +1 -0
  52. package/dist/jsx/types.js +3 -0
  53. package/dist/jsx/types.js.map +1 -0
  54. package/dist/runtime/bundle.d.ts +8 -0
  55. package/dist/runtime/bundle.d.ts.map +1 -0
  56. package/dist/runtime/bundle.js +98 -0
  57. package/dist/runtime/bundle.js.map +1 -0
  58. package/dist/runtime/hmr.d.ts +2 -0
  59. package/dist/runtime/hmr.d.ts.map +1 -0
  60. package/dist/runtime/hmr.js +28 -0
  61. package/dist/runtime/hmr.js.map +1 -0
  62. package/dist/runtime/render.d.ts +3 -0
  63. package/dist/runtime/render.d.ts.map +1 -0
  64. package/dist/runtime/render.js +226 -0
  65. package/dist/runtime/render.js.map +1 -0
  66. package/dist/runtime/routes.d.ts +10 -0
  67. package/dist/runtime/routes.d.ts.map +1 -0
  68. package/dist/runtime/routes.js +65 -0
  69. package/dist/runtime/routes.js.map +1 -0
  70. package/dist/runtime/shortcuts.d.ts +8 -0
  71. package/dist/runtime/shortcuts.d.ts.map +1 -0
  72. package/dist/runtime/shortcuts.js +29 -0
  73. package/dist/runtime/shortcuts.js.map +1 -0
  74. package/dist/runtime/window.d.ts +10 -0
  75. package/dist/runtime/window.d.ts.map +1 -0
  76. package/dist/runtime/window.js +93 -0
  77. package/dist/runtime/window.js.map +1 -0
  78. package/dist/types.d.ts +17 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +3 -0
  81. package/dist/types.js.map +1 -0
  82. package/package.json +17 -10
  83. package/src/cli/colors.ts +0 -16
  84. package/src/cli/log.ts +0 -42
  85. package/src/components/Link.tsx +0 -25
  86. package/src/dev.tsx +0 -60
  87. package/src/env.ts +0 -48
  88. package/src/index.ts +0 -24
  89. package/src/jsx/index.ts +0 -21
  90. package/src/jsx/jsx-dev-runtime.ts +0 -6
  91. package/src/jsx/runtime.ts +0 -298
  92. package/src/jsx/types.ts +0 -36
  93. package/src/runtime/hmr.ts +0 -26
  94. package/src/runtime/render.tsx +0 -225
  95. package/src/runtime/routes.ts +0 -73
  96. package/src/runtime/shortcuts.ts +0 -31
  97. package/src/runtime/window.ts +0 -94
  98. package/src/types.ts +0 -22
@@ -0,0 +1,303 @@
1
+ // murasaki/jsx/dom — client-side runtime.
2
+ //
3
+ // Design notes (MVP):
4
+ // - Naive: every state change triggers a full re-render of the root.
5
+ // No virtual-DOM diff, no fiber. Good enough for desktop apps where
6
+ // trees are tiny and re-render is sub-millisecond.
7
+ // - Hooks: useState / useEffect / useRef. Indexed by "component slot"
8
+ // in render order — same as React's call-order rule, so the usual
9
+ // "no hooks in conditionals" applies.
10
+ // - Events: any prop starting with "on" + a function becomes a DOM
11
+ // event listener. Names normalize: onClick → "click", onChange → "change".
12
+ // - HMR friendly: createRoot re-uses the same container, just clears + remounts.
13
+ //
14
+ // This file is browser-only. It uses `document`, `window`, etc., so it must
15
+ // only be loaded via the client bundle — never imported on the Node side.
16
+ class JSXNode {
17
+ tag;
18
+ props;
19
+ children;
20
+ __isJSXNode = true;
21
+ constructor(tag, props, children) {
22
+ this.tag = tag;
23
+ this.props = props;
24
+ this.children = children;
25
+ }
26
+ }
27
+ function isJSXNode(v) {
28
+ return typeof v === 'object' && v !== null && v.__isJSXNode === true;
29
+ }
30
+ // ── jsx() factory ────────────────────────────────────────────────────
31
+ export function jsx(tag, props) {
32
+ const p = (props ?? {});
33
+ const rawChildren = p.children;
34
+ const children = Array.isArray(rawChildren)
35
+ ? rawChildren
36
+ : rawChildren != null
37
+ ? [rawChildren]
38
+ : [];
39
+ const { children: _drop, ...rest } = p;
40
+ return new JSXNode(tag, rest, children);
41
+ }
42
+ export const jsxs = jsx;
43
+ export const jsxDEV = jsx;
44
+ export const createElement = jsx;
45
+ export function Fragment(props) {
46
+ return props.children ?? null;
47
+ }
48
+ let currentRoot = null;
49
+ function getOrInitSlot(key) {
50
+ const slots = currentRoot.slots;
51
+ let slot = slots.get(key);
52
+ if (!slot) {
53
+ slot = { states: [], effects: [], refs: [] };
54
+ slots.set(key, slot);
55
+ }
56
+ return slot;
57
+ }
58
+ // ── useState ─────────────────────────────────────────────────────────
59
+ // Behavior on the server (no active root): returns the initial value with
60
+ // a no-op setter, so user code can be imported and SSR-rendered safely.
61
+ export function useState(initial) {
62
+ const root = currentRoot;
63
+ if (!root || !root.currentSlot) {
64
+ const v = typeof initial === 'function' ? initial() : initial;
65
+ return [v, () => { }];
66
+ }
67
+ const slot = root.currentSlot;
68
+ const idx = root.stateIdx++;
69
+ if (idx >= slot.states.length) {
70
+ slot.states[idx] = typeof initial === 'function' ? initial() : initial;
71
+ }
72
+ const set = (next) => {
73
+ const prev = slot.states[idx];
74
+ const value = typeof next === 'function' ? next(prev) : next;
75
+ if (Object.is(prev, value))
76
+ return;
77
+ slot.states[idx] = value;
78
+ scheduleRender(root);
79
+ };
80
+ return [slot.states[idx], set];
81
+ }
82
+ // ── useEffect (basic: deps-based; no-op on server) ──────────────────
83
+ export function useEffect(fn, deps) {
84
+ const root = currentRoot;
85
+ if (!root || !root.currentSlot)
86
+ return;
87
+ const slot = root.currentSlot;
88
+ const idx = root.effectIdx++;
89
+ const prev = slot.effects[idx];
90
+ const changed = !prev ||
91
+ !deps ||
92
+ !prev.deps ||
93
+ deps.length !== prev.deps.length ||
94
+ deps.some((d, i) => !Object.is(d, prev.deps?.[i]));
95
+ if (changed) {
96
+ slot.effects[idx] = {
97
+ deps,
98
+ cleanup: prev?.cleanup,
99
+ pending: () => {
100
+ prev?.cleanup?.();
101
+ const ret = fn();
102
+ if (typeof ret === 'function') {
103
+ slot.effects[idx].cleanup = ret;
104
+ }
105
+ else {
106
+ slot.effects[idx].cleanup = undefined;
107
+ }
108
+ },
109
+ };
110
+ }
111
+ }
112
+ // ── useRef (no-op-ish on server: returns a fresh ref every render) ──
113
+ export function useRef(initial) {
114
+ const root = currentRoot;
115
+ if (!root || !root.currentSlot)
116
+ return { current: initial };
117
+ const slot = root.currentSlot;
118
+ const idx = root.refIdx++;
119
+ if (idx >= slot.refs.length) {
120
+ slot.refs[idx] = { current: initial };
121
+ }
122
+ return slot.refs[idx];
123
+ }
124
+ // ── Schedule a re-render (microtask coalesce) ────────────────────────
125
+ function scheduleRender(root) {
126
+ if (root.rendering) {
127
+ root.pendingRender = true;
128
+ return;
129
+ }
130
+ root.pendingRender = true;
131
+ queueMicrotask(() => {
132
+ if (root.pendingRender) {
133
+ root.pendingRender = false;
134
+ mount(root);
135
+ }
136
+ });
137
+ }
138
+ // ── Attribute helpers ────────────────────────────────────────────────
139
+ const ATTR_ALIAS = {
140
+ className: 'class',
141
+ htmlFor: 'for',
142
+ charSet: 'charset',
143
+ };
144
+ function camelToKebab(k) {
145
+ if (k[0] === '-' || !/[A-Z]/.test(k))
146
+ return k;
147
+ return k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
148
+ }
149
+ function styleObjToCss(obj) {
150
+ let out = '';
151
+ for (const [k, v] of Object.entries(obj)) {
152
+ if (v == null || v === false)
153
+ continue;
154
+ let val;
155
+ if (typeof v === 'number')
156
+ val = `${v}px`;
157
+ else if (typeof v === 'string')
158
+ val = v;
159
+ else
160
+ continue;
161
+ out += `${out ? ';' : ''}${camelToKebab(k)}:${val}`;
162
+ }
163
+ return out;
164
+ }
165
+ // ── DOM materializer ────────────────────────────────────────────────
166
+ function appendChild(parent, child, slotKey) {
167
+ if (child == null || child === false || child === true)
168
+ return;
169
+ if (typeof child === 'string' || typeof child === 'number' || typeof child === 'bigint') {
170
+ parent.appendChild(document.createTextNode(String(child)));
171
+ return;
172
+ }
173
+ if (Array.isArray(child)) {
174
+ child.forEach((c, i) => appendChild(parent, c, `${slotKey}.${i}`));
175
+ return;
176
+ }
177
+ if (isJSXNode(child)) {
178
+ parent.appendChild(toDOM(child, slotKey));
179
+ }
180
+ }
181
+ function toDOM(node, slotKey) {
182
+ const { tag, props, children } = node;
183
+ // Component / Fragment
184
+ if (typeof tag === 'function') {
185
+ const root = currentRoot;
186
+ const prevSlot = root.currentSlot;
187
+ const prevKey = root.currentSlotKey;
188
+ const prevStateIdx = root.stateIdx;
189
+ const prevEffectIdx = root.effectIdx;
190
+ const prevRefIdx = root.refIdx;
191
+ const key = `${slotKey}|${tag.name || 'Anon'}`;
192
+ root.currentSlotKey = key;
193
+ root.currentSlot = getOrInitSlot(key);
194
+ root.stateIdx = 0;
195
+ root.effectIdx = 0;
196
+ root.refIdx = 0;
197
+ const result = tag({ ...props, children: children.length === 1 ? children[0] : children });
198
+ root.currentSlot = prevSlot;
199
+ root.currentSlotKey = prevKey;
200
+ root.stateIdx = prevStateIdx;
201
+ root.effectIdx = prevEffectIdx;
202
+ root.refIdx = prevRefIdx;
203
+ const frag = document.createDocumentFragment();
204
+ appendChild(frag, result, key);
205
+ return frag;
206
+ }
207
+ // Intrinsic element
208
+ const el = document.createElement(tag);
209
+ for (const k in props) {
210
+ const v = props[k];
211
+ if (k === 'children' || k === 'key' || k === 'ref')
212
+ continue;
213
+ if (v == null || v === false)
214
+ continue;
215
+ // Event handler: onClick, onChange, onInput, ...
216
+ if (k.length > 2 && k[0] === 'o' && k[1] === 'n' && typeof v === 'function') {
217
+ const eventName = k.slice(2).toLowerCase();
218
+ el.addEventListener(eventName, v);
219
+ continue;
220
+ }
221
+ // dangerouslySetInnerHTML
222
+ if (k === 'dangerouslySetInnerHTML') {
223
+ const html = v.__html;
224
+ if (typeof html === 'string')
225
+ el.innerHTML = html;
226
+ continue;
227
+ }
228
+ // Style object
229
+ if (k === 'style' && typeof v === 'object') {
230
+ el.setAttribute('style', styleObjToCss(v));
231
+ continue;
232
+ }
233
+ const name = ATTR_ALIAS[k] || k;
234
+ if (v === true) {
235
+ el.setAttribute(name, '');
236
+ }
237
+ else {
238
+ el.setAttribute(name, String(v));
239
+ }
240
+ }
241
+ children.forEach((c, i) => appendChild(el, c, `${slotKey}>${tag}.${i}`));
242
+ return el;
243
+ }
244
+ // ── Mount (initial + re-render) ──────────────────────────────────────
245
+ function mount(root) {
246
+ root.rendering = true;
247
+ currentRoot = root;
248
+ root.currentSlotKey = '';
249
+ root.currentSlot = null;
250
+ root.stateIdx = 0;
251
+ root.effectIdx = 0;
252
+ root.refIdx = 0;
253
+ // Render tree
254
+ const tree = root.render();
255
+ // Wipe container + re-fill
256
+ root.container.textContent = '';
257
+ appendChild(root.container, tree, 'root');
258
+ // Flush pending effects (post-render)
259
+ for (const slot of root.slots.values()) {
260
+ for (const effect of slot.effects) {
261
+ if (effect.pending) {
262
+ try {
263
+ effect.pending();
264
+ }
265
+ catch (e) {
266
+ console.error(e);
267
+ }
268
+ effect.pending = undefined;
269
+ }
270
+ }
271
+ }
272
+ currentRoot = null;
273
+ root.rendering = false;
274
+ if (root.pendingRender) {
275
+ root.pendingRender = false;
276
+ queueMicrotask(() => mount(root));
277
+ }
278
+ }
279
+ // ── Public createRoot ────────────────────────────────────────────────
280
+ export function createRoot(container) {
281
+ return {
282
+ render(tree) {
283
+ const root = {
284
+ container,
285
+ render: () => tree,
286
+ slots: new Map(),
287
+ currentSlotKey: '',
288
+ currentSlot: null,
289
+ stateIdx: 0,
290
+ effectIdx: 0,
291
+ refIdx: 0,
292
+ rendering: false,
293
+ pendingRender: false,
294
+ };
295
+ mount(root);
296
+ },
297
+ };
298
+ }
299
+ // ── Helper for bundle entry points ──────────────────────────────────
300
+ // The dev runner generates an entry that imports the user's page module,
301
+ // calls jsx() on its default export, and hands it to createRoot.
302
+ export { JSXNode };
303
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/jsx/dom/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createElement, Fragment, isJSXNode, isValidElement, JSXNode, jsx, raw, renderToString, } from './runtime.ts';
2
+ export type { Child, Component, Element, FC, JSXNodeLike, Props, } from './types.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jsx/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,cAAc,EACd,OAAO,EACP,GAAG,EACH,GAAG,EACH,cAAc,GACf,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,KAAK,EACL,SAAS,EACT,OAAO,EACP,EAAE,EACF,WAAW,EACX,KAAK,GACN,MAAM,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ // Public surface for `import { ... } from 'murasaki/jsx'`.
2
+ export { createElement, Fragment, isJSXNode, isValidElement, JSXNode, jsx, raw, renderToString, } from "./runtime.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jsx/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,cAAc,EACd,OAAO,EACP,GAAG,EACH,GAAG,EACH,cAAc,GACf,MAAM,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { Fragment, jsx as jsxDEV } from './runtime.ts';
2
+ //# sourceMappingURL=jsx-dev-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-dev-runtime.d.ts","sourceRoot":"","sources":["../../src/jsx/jsx-dev-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,7 @@
1
+ // JSX dev runtime entry — used when tsconfig has `jsx: "react-jsxdev"`.
2
+ // We don't (yet) track source locations or component stacks, so jsxDEV
3
+ // behaves identically to jsx.
4
+ export { Fragment, jsx as jsxDEV } from "./runtime.js";
5
+ // JSX namespace is declared globally in ./types.ts — picked up automatically
6
+ // by the JSX compiler without needing an explicit re-export here.
7
+ //# sourceMappingURL=jsx-dev-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-dev-runtime.js","sourceRoot":"","sources":["../../src/jsx/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,uEAAuE;AACvE,8BAA8B;AAE9B,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAEtD,6EAA6E;AAC7E,kEAAkE"}
@@ -0,0 +1,2 @@
1
+ export { Fragment, jsx, jsx as jsxs } from './runtime.ts';
2
+ //# sourceMappingURL=jsx-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../../src/jsx/jsx-runtime.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA"}
@@ -5,6 +5,7 @@
5
5
  // jsx(Component, props, key?)
6
6
  // jsxs(Component, propsWithChildrenArray, key?)
7
7
  // <></> → jsx(Fragment, { children: [...] })
8
-
9
- export { Fragment, jsx, jsx as jsxs } from './runtime.ts'
10
- export type { JSX } from './types.ts'
8
+ export { Fragment, jsx, jsx as jsxs } from "./runtime.js";
9
+ // JSX namespace is declared globally in ./types.ts — picked up automatically
10
+ // by the JSX compiler without needing an explicit re-export here.
11
+ //# sourceMappingURL=jsx-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../../src/jsx/jsx-runtime.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,qDAAqD;AACrD,EAAE;AACF,kCAAkC;AAClC,gCAAgC;AAChC,kDAAkD;AAClD,+CAA+C;AAE/C,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAEzD,6EAA6E;AAC7E,kEAAkE"}
@@ -0,0 +1,24 @@
1
+ import type { Child, Component, JSXNodeLike, Props } from './types.ts';
2
+ /** Wrap pre-rendered HTML so it's emitted verbatim as a JSX child. */
3
+ export declare function raw(html: string): JSXNodeLike;
4
+ export declare class JSXNode implements JSXNodeLike {
5
+ readonly __isJSXNode: true;
6
+ tag: string | Component;
7
+ props: Props;
8
+ children: Child[];
9
+ constructor(tag: string | Component, props: Props, children: Child[]);
10
+ toString(): string;
11
+ }
12
+ export declare function isJSXNode(v: unknown): v is JSXNode;
13
+ export declare function jsx(tag: string | Component, props: Props | null, ..._restChildren: unknown[]): JSXNode;
14
+ /** React-compatible alias. */
15
+ export declare const createElement: typeof jsx;
16
+ /** Fragment — renders children without a wrapper tag. */
17
+ export declare function Fragment(props: {
18
+ children?: Child;
19
+ }): Child;
20
+ /** Check if something is a JSX element (React.isValidElement compat). */
21
+ export declare function isValidElement(v: unknown): v is JSXNode;
22
+ /** Convert any value (JSXNode, string, array, etc.) to an HTML string. */
23
+ export declare function renderToString(value: Child): string;
24
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/jsx/runtime.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAoLtE,sEAAsE;AACtE,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAE7C;AAiBD,qBAAa,OAAQ,YAAW,WAAW;IACzC,QAAQ,CAAC,WAAW,EAAG,IAAI,CAAS;IACpC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,KAAK,EAAE,CAAA;gBAEL,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;IAMpE,QAAQ,IAAI,MAAM;CA8BnB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,OAAO,CAElD;AAGD,wBAAgB,GAAG,CACjB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,GAAG,aAAa,EAAE,OAAO,EAAE,GAC1B,OAAO,CAWT;AAED,8BAA8B;AAC9B,eAAO,MAAM,aAAa,YAAM,CAAA;AAEhC,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,KAAK,CAE3D;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,OAAO,CAEvD;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnD"}