@crowdedkingdoms/crowdyjs 8.22.0 → 10.0.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 (95) hide show
  1. package/MIGRATION.md +66 -0
  2. package/README.md +111 -7
  3. package/dist/crowdy-client.d.ts +3 -0
  4. package/dist/crowdy-client.d.ts.map +1 -1
  5. package/dist/crowdy-client.js +2 -0
  6. package/dist/domains/playerCodeProjects.d.ts +25 -0
  7. package/dist/domains/playerCodeProjects.d.ts.map +1 -0
  8. package/dist/domains/playerCodeProjects.js +299 -0
  9. package/dist/domains/playerCompute.d.ts +1 -1
  10. package/dist/domains/playerCompute.js +1 -1
  11. package/dist/generated/graphql.d.ts +792 -7
  12. package/dist/generated/graphql.d.ts.map +1 -1
  13. package/dist/generated/graphql.js +57 -0
  14. package/dist/index.d.ts +3 -5
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -5
  17. package/dist/kit/npcs.d.ts.map +1 -1
  18. package/dist/kit/social.d.ts.map +1 -1
  19. package/dist/live-coding/assets/browser-authoring-index.json +1 -0
  20. package/dist/live-coding/assets/manifest.json +19 -0
  21. package/dist/live-coding/assets/tree-sitter-rust.wasm +0 -0
  22. package/dist/live-coding/assets/web-tree-sitter.wasm +0 -0
  23. package/dist/live-coding/browser-authoring-index.generated.d.ts +2 -0
  24. package/dist/live-coding/browser-authoring-index.generated.d.ts.map +1 -0
  25. package/dist/live-coding/browser-authoring-index.generated.js +5127 -0
  26. package/dist/live-coding/lsp-protocol.d.ts +98 -0
  27. package/dist/live-coding/lsp-protocol.d.ts.map +1 -0
  28. package/dist/live-coding/lsp-protocol.js +70 -0
  29. package/dist/live-coding/monaco-services.d.ts +22 -0
  30. package/dist/live-coding/monaco-services.d.ts.map +1 -0
  31. package/dist/live-coding/monaco-services.js +69 -0
  32. package/dist/live-coding/platform-index.d.ts +29 -0
  33. package/dist/live-coding/platform-index.d.ts.map +1 -0
  34. package/dist/live-coding/platform-index.js +281 -0
  35. package/dist/live-coding/rust-analysis.d.ts +24 -0
  36. package/dist/live-coding/rust-analysis.d.ts.map +1 -0
  37. package/dist/live-coding/rust-analysis.js +375 -0
  38. package/dist/live-coding/rust-lsp-server.d.ts +43 -0
  39. package/dist/live-coding/rust-lsp-server.d.ts.map +1 -0
  40. package/dist/live-coding/rust-lsp-server.js +455 -0
  41. package/dist/live-coding/rust-lsp.worker.d.ts +2 -0
  42. package/dist/live-coding/rust-lsp.worker.d.ts.map +1 -0
  43. package/dist/live-coding/rust-lsp.worker.js +26 -0
  44. package/dist/live-coding/vfs.d.ts +41 -0
  45. package/dist/live-coding/vfs.d.ts.map +1 -0
  46. package/dist/live-coding/vfs.js +174 -0
  47. package/dist/live-coding/worker-transport.d.ts +63 -0
  48. package/dist/live-coding/worker-transport.d.ts.map +1 -0
  49. package/dist/live-coding/worker-transport.js +217 -0
  50. package/dist/mod-studio/controller.d.ts +188 -0
  51. package/dist/mod-studio/controller.d.ts.map +1 -0
  52. package/dist/mod-studio/controller.js +915 -0
  53. package/dist/mod-studio/diagnostics.d.ts +22 -0
  54. package/dist/mod-studio/diagnostics.d.ts.map +1 -0
  55. package/dist/mod-studio/diagnostics.js +141 -0
  56. package/dist/mod-studio/dom-shell.d.ts +55 -0
  57. package/dist/mod-studio/dom-shell.d.ts.map +1 -0
  58. package/dist/mod-studio/dom-shell.js +527 -0
  59. package/dist/mod-studio/editor.d.ts +17 -0
  60. package/dist/mod-studio/editor.d.ts.map +1 -0
  61. package/dist/mod-studio/editor.js +1 -0
  62. package/dist/mod-studio/index.d.ts +10 -0
  63. package/dist/mod-studio/index.d.ts.map +1 -0
  64. package/dist/mod-studio/index.js +9 -0
  65. package/dist/mod-studio/models.d.ts +149 -0
  66. package/dist/mod-studio/models.d.ts.map +1 -0
  67. package/dist/mod-studio/models.js +62 -0
  68. package/dist/mod-studio/monaco-editor.d.ts +16 -0
  69. package/dist/mod-studio/monaco-editor.d.ts.map +1 -0
  70. package/dist/mod-studio/monaco-editor.js +548 -0
  71. package/dist/mod-studio/mount.d.ts +17 -0
  72. package/dist/mod-studio/mount.d.ts.map +1 -0
  73. package/dist/mod-studio/mount.js +86 -0
  74. package/dist/mod-studio/starter-projects.d.ts +11 -0
  75. package/dist/mod-studio/starter-projects.d.ts.map +1 -0
  76. package/dist/mod-studio/starter-projects.js +102 -0
  77. package/dist/mod-studio/styles.d.ts +2 -0
  78. package/dist/mod-studio/styles.d.ts.map +1 -0
  79. package/dist/mod-studio/styles.js +14 -0
  80. package/dist/mod-studio/textarea-editor.d.ts +8 -0
  81. package/dist/mod-studio/textarea-editor.d.ts.map +1 -0
  82. package/dist/mod-studio/textarea-editor.js +71 -0
  83. package/package.json +18 -6
  84. package/dist/live-coding/ide.d.ts +0 -16
  85. package/dist/live-coding/ide.d.ts.map +0 -1
  86. package/dist/live-coding/ide.js +0 -399
  87. package/dist/live-coding/live-coding-controller.d.ts +0 -75
  88. package/dist/live-coding/live-coding-controller.d.ts.map +0 -1
  89. package/dist/live-coding/live-coding-controller.js +0 -141
  90. package/dist/live-coding/mount.d.ts +0 -26
  91. package/dist/live-coding/mount.d.ts.map +0 -1
  92. package/dist/live-coding/mount.js +0 -108
  93. package/dist/live-coding/templates.d.ts +0 -17
  94. package/dist/live-coding/templates.d.ts.map +0 -1
  95. package/dist/live-coding/templates.js +0 -59
@@ -0,0 +1,375 @@
1
+ import { Language, Parser, } from 'web-tree-sitter';
2
+ import { offsetAt } from './vfs.js';
3
+ const DECLARATION_KINDS = new Map([
4
+ ['function_item', 12],
5
+ ['function_signature_item', 12],
6
+ ['struct_item', 23],
7
+ ['enum_item', 10],
8
+ ['trait_item', 11],
9
+ ['type_item', 5],
10
+ ['const_item', 14],
11
+ ['static_item', 13],
12
+ ['mod_item', 2],
13
+ ['macro_definition', 12],
14
+ ]);
15
+ const RUST_KEYWORDS = [
16
+ 'as',
17
+ 'async',
18
+ 'await',
19
+ 'break',
20
+ 'const',
21
+ 'continue',
22
+ 'crate',
23
+ 'dyn',
24
+ 'else',
25
+ 'enum',
26
+ 'extern',
27
+ 'false',
28
+ 'fn',
29
+ 'for',
30
+ 'if',
31
+ 'impl',
32
+ 'in',
33
+ 'let',
34
+ 'loop',
35
+ 'match',
36
+ 'mod',
37
+ 'move',
38
+ 'mut',
39
+ 'pub',
40
+ 'ref',
41
+ 'return',
42
+ 'self',
43
+ 'static',
44
+ 'struct',
45
+ 'super',
46
+ 'trait',
47
+ 'true',
48
+ 'type',
49
+ 'unsafe',
50
+ 'use',
51
+ 'where',
52
+ 'while',
53
+ ];
54
+ const TARGET_SNIPPETS = {
55
+ server: [
56
+ {
57
+ label: 'server lifecycle',
58
+ kind: 15,
59
+ detail: 'SERVER init, tick, and invoke entry points',
60
+ documentation: 'Runs in the platform sandbox as the grid owner. Host effects remain permission checked and grid-clamped.',
61
+ insertText: 'fn on_init() {\n $1\n}\n\nfn on_tick(dt_ms: u32) {\n $2\n}\n\nfn on_invoke(payload: &[u8]) -> Vec<u8> {\n $3\n}\n\ncrowdy_compute_sdk::register_module!(init: on_init, tick: on_tick, invoke: on_invoke);',
62
+ sortText: '0-server-lifecycle',
63
+ },
64
+ {
65
+ label: 'server invoke export',
66
+ kind: 15,
67
+ detail: 'SERVER export callable from Mod Studio Invoke',
68
+ documentation: 'The caller and owned grid are supplied by the platform runtime; author identity is never authority.',
69
+ insertText: 'fn on_invoke(payload: &[u8]) -> Vec<u8> {\n ${1:payload.to_vec()}\n}',
70
+ sortText: '0-server-invoke',
71
+ },
72
+ ],
73
+ client: [
74
+ {
75
+ label: 'client lifecycle',
76
+ kind: 15,
77
+ detail: 'CLIENT init, tick, and invoke entry points',
78
+ documentation: 'Runs in the browser Rust sandbox. Page capabilities are exposed only through the broker allow-list.',
79
+ insertText: 'fn on_init() {\n $1\n}\n\nfn on_tick(dt_ms: u32) {\n $2\n}\n\nfn on_invoke(payload: &[u8]) -> Vec<u8> {\n $3\n}\n\ncrowdy_compute_sdk::register_module!(init: on_init, tick: on_tick, invoke: on_invoke);',
80
+ sortText: '0-client-lifecycle',
81
+ },
82
+ {
83
+ label: 'client presentation tick',
84
+ kind: 15,
85
+ detail: 'CLIENT tick for allow-listed HUD/presentation effects',
86
+ documentation: 'Presentation calls cross PlayerCodeBroker; the language worker and guest module never receive page credentials.',
87
+ insertText: 'fn on_tick(dt_ms: u32) {\n // Call an allow-listed presentation host function here.\n $1\n}',
88
+ sortText: '0-client-presentation',
89
+ },
90
+ ],
91
+ };
92
+ let parserInitialization = null;
93
+ export class RustAnalysis {
94
+ constructor(parser, platformIndex) {
95
+ this.parser = parser;
96
+ this.platformIndex = platformIndex;
97
+ this.cache = new Map();
98
+ }
99
+ static async create(options) {
100
+ parserInitialization ?? (parserInitialization = Parser.init({
101
+ locateFile: () => options.parserWasmUrl,
102
+ }));
103
+ await parserInitialization;
104
+ const language = await Language.load(options.grammarWasmUrl);
105
+ const parser = new Parser();
106
+ parser.setLanguage(language);
107
+ return new RustAnalysis(parser, options.platformIndex);
108
+ }
109
+ diagnostics(document) {
110
+ return this.analyze(document).diagnostics;
111
+ }
112
+ completions(document, position, workspace) {
113
+ const prefix = wordPrefixAt(document.text, position);
114
+ const local = this.workspaceSymbols(workspace);
115
+ const items = [];
116
+ const seen = new Set();
117
+ const add = (item) => {
118
+ if (seen.has(item.label) ||
119
+ (prefix && !item.label.toLowerCase().startsWith(prefix.toLowerCase()))) {
120
+ return;
121
+ }
122
+ seen.add(item.label);
123
+ items.push(item);
124
+ };
125
+ for (const symbol of local) {
126
+ add({
127
+ label: symbol.name,
128
+ kind: symbol.kind,
129
+ detail: symbol.detail,
130
+ sortText: `0-${symbol.name}`,
131
+ });
132
+ }
133
+ const target = targetForDocument(document);
134
+ if (target) {
135
+ for (const snippet of TARGET_SNIPPETS[target])
136
+ add(snippet);
137
+ }
138
+ for (const symbol of this.platformIndex.symbols) {
139
+ add(platformCompletion(symbol, this.platformIndex));
140
+ }
141
+ for (const keyword of RUST_KEYWORDS) {
142
+ add({ label: keyword, kind: 14, detail: 'Rust keyword', sortText: `2-${keyword}` });
143
+ }
144
+ return items.slice(0, 200);
145
+ }
146
+ hover(document, position, workspace) {
147
+ const word = wordAt(document.text, position);
148
+ if (!word)
149
+ return null;
150
+ const local = this.workspaceSymbols(workspace).find((symbol) => symbol.name === word);
151
+ if (local) {
152
+ const targetNote = targetLifecycleNote(document, word);
153
+ return {
154
+ contents: {
155
+ kind: 'markdown',
156
+ value: `\`\`\`rust\n${local.detail}\n\`\`\`\n\nDefined in \`${local.uri}\`.` +
157
+ (targetNote ? `\n\n${targetNote}` : ''),
158
+ },
159
+ range: wordRange(document.text, position),
160
+ };
161
+ }
162
+ const platform = this.platformIndex.symbols.find((symbol) => symbol.name.replace(/!$/u, '').split('::').at(-1) === word);
163
+ if (!platform)
164
+ return null;
165
+ const crate = platformCrateForSymbol(this.platformIndex, platform);
166
+ const provenance = crate
167
+ ? `Crate ${crate.name} ${crate.version} · source ${crate.sourceHash.slice(0, 12)}…\n\n`
168
+ : '';
169
+ return {
170
+ contents: {
171
+ kind: 'markdown',
172
+ value: `\`\`\`rust\n${platform.signature}\n\`\`\`\n\n` +
173
+ `${platform.docs || `Defined in \`${platform.module}\`.`}\n\n` +
174
+ provenance +
175
+ `SDK ${this.platformIndex.sdkVersion} · ABI ${this.platformIndex.abiVersion}`,
176
+ },
177
+ range: wordRange(document.text, position),
178
+ };
179
+ }
180
+ documentSymbols(document) {
181
+ return this.analyze(document).symbols.map((symbol) => ({
182
+ name: symbol.name,
183
+ detail: symbol.detail,
184
+ kind: symbol.kind,
185
+ range: symbol.range,
186
+ selectionRange: symbol.selectionRange,
187
+ }));
188
+ }
189
+ definition(document, position, workspace) {
190
+ const word = wordAt(document.text, position);
191
+ if (!word)
192
+ return null;
193
+ const symbol = this.workspaceSymbols(workspace).find((candidate) => candidate.name === word);
194
+ return symbol
195
+ ? { uri: symbol.uri, range: symbol.selectionRange }
196
+ : null;
197
+ }
198
+ invalidate(uri) {
199
+ this.cache.delete(uri);
200
+ }
201
+ dispose() {
202
+ this.cache.clear();
203
+ this.parser.delete();
204
+ }
205
+ workspaceSymbols(documents) {
206
+ return documents.flatMap((document) => this.analyze(document).symbols);
207
+ }
208
+ analyze(document) {
209
+ const cached = this.cache.get(document.uri);
210
+ if (cached?.version === document.version)
211
+ return cached;
212
+ const tree = this.parser.parse(document.text);
213
+ if (!tree)
214
+ throw new Error(`Rust parser did not produce a tree for ${document.path}`);
215
+ try {
216
+ const diagnostics = [];
217
+ const symbols = [];
218
+ visit(tree.rootNode, (node) => {
219
+ if ((node.isError || node.isMissing) && diagnostics.length < 100) {
220
+ diagnostics.push({
221
+ range: nodeRange(document.text, node),
222
+ severity: 1,
223
+ source: 'crowdy-rust',
224
+ code: node.isMissing ? 'missing-syntax' : 'syntax-error',
225
+ message: node.isMissing
226
+ ? `Expected ${node.type}`
227
+ : `Unexpected Rust syntax: ${bounded(node.text, 80) || node.type}`,
228
+ });
229
+ }
230
+ const kind = DECLARATION_KINDS.get(node.type);
231
+ if (kind === undefined)
232
+ return;
233
+ const nameNode = node.childForFieldName('name') ??
234
+ node.namedChildren.find((child) => child.type === 'identifier');
235
+ if (!nameNode)
236
+ return;
237
+ const name = nameNode.text.replace(/!$/u, '');
238
+ symbols.push({
239
+ name,
240
+ detail: declarationDetail(node),
241
+ kind: node.type === 'function_item' && node.parent?.type === 'declaration_list'
242
+ ? 6
243
+ : kind,
244
+ uri: document.uri,
245
+ range: nodeRange(document.text, node),
246
+ selectionRange: nodeRange(document.text, nameNode),
247
+ });
248
+ });
249
+ const result = { version: document.version, diagnostics, symbols };
250
+ this.cache.set(document.uri, result);
251
+ return result;
252
+ }
253
+ finally {
254
+ tree.delete();
255
+ }
256
+ }
257
+ }
258
+ function targetForDocument(document) {
259
+ const first = document.path.split('/', 1)[0]?.toLowerCase();
260
+ return first === 'server' || first === 'client' ? first : null;
261
+ }
262
+ function targetLifecycleNote(document, word) {
263
+ const target = targetForDocument(document);
264
+ if (!target || !['on_init', 'on_tick', 'on_invoke'].includes(word)) {
265
+ return null;
266
+ }
267
+ if (target === 'server') {
268
+ return word === 'on_invoke'
269
+ ? 'SERVER invoke exports execute as the current grid owner; host effects remain permission checked and grid-confined.'
270
+ : 'SERVER lifecycle code executes in the platform sandbox and is activated only after an authoritative compile succeeds.';
271
+ }
272
+ return word === 'on_tick'
273
+ ? 'CLIENT ticks execute inside the browser guest sandbox; all page effects cross the PlayerCodeBroker allow-list.'
274
+ : 'CLIENT lifecycle code is loaded from the exact hash-bound artifact produced for this project version.';
275
+ }
276
+ function visit(node, callback) {
277
+ callback(node);
278
+ for (const child of node.namedChildren)
279
+ visit(child, callback);
280
+ }
281
+ function declarationDetail(node) {
282
+ const firstBody = node.text.search(/[;{]/u);
283
+ return bounded((firstBody < 0 ? node.text : node.text.slice(0, firstBody)).trim(), 500);
284
+ }
285
+ function nodeRange(text, node) {
286
+ return {
287
+ start: pointToPosition(text, node.startPosition),
288
+ end: pointToPosition(text, node.endPosition),
289
+ };
290
+ }
291
+ function pointToPosition(text, point) {
292
+ const lines = text.split('\n');
293
+ const line = lines[point.row] ?? '';
294
+ let bytes = 0;
295
+ let character = 0;
296
+ for (const value of line) {
297
+ const width = new TextEncoder().encode(value).byteLength;
298
+ if (bytes + width > point.column)
299
+ break;
300
+ bytes += width;
301
+ character += value.length;
302
+ }
303
+ return { line: point.row, character };
304
+ }
305
+ function wordAt(text, position) {
306
+ const offset = offsetAt(text, position);
307
+ const left = text.slice(0, offset).match(/[A-Za-z_][A-Za-z0-9_]*$/u)?.[0] ?? '';
308
+ const right = text.slice(offset).match(/^[A-Za-z0-9_]*/u)?.[0] ?? '';
309
+ const word = left + right;
310
+ return /^[A-Za-z_][A-Za-z0-9_]*$/u.test(word) ? word : null;
311
+ }
312
+ function wordPrefixAt(text, position) {
313
+ const offset = offsetAt(text, position);
314
+ return text.slice(0, offset).match(/[A-Za-z_][A-Za-z0-9_]*$/u)?.[0] ?? '';
315
+ }
316
+ function wordRange(text, position) {
317
+ const offset = offsetAt(text, position);
318
+ const left = text.slice(0, offset).match(/[A-Za-z_][A-Za-z0-9_]*$/u)?.[0] ?? '';
319
+ const right = text.slice(offset).match(/^[A-Za-z0-9_]*/u)?.[0] ?? '';
320
+ return {
321
+ start: { line: position.line, character: position.character - left.length },
322
+ end: { line: position.line, character: position.character + right.length },
323
+ };
324
+ }
325
+ function platformCompletion(symbol, index) {
326
+ const crate = platformCrateForSymbol(index, symbol);
327
+ const label = symbol.kind === 'field'
328
+ ? symbol.name.split('::').at(-1)
329
+ : symbol.kind === 'macro' && !symbol.name.endsWith('!')
330
+ ? `${symbol.name}!`
331
+ : symbol.name;
332
+ return {
333
+ label,
334
+ kind: platformCompletionKind(symbol.kind),
335
+ detail: `${symbol.module} · ${symbol.signature}` +
336
+ (crate ? ` · ${crate.name}@${crate.version}` : ''),
337
+ documentation: symbol.docs,
338
+ insertText: label,
339
+ sortText: `1-${label}`,
340
+ };
341
+ }
342
+ function platformCompletionKind(kind) {
343
+ switch (kind) {
344
+ case 'function':
345
+ case 'method':
346
+ return 3;
347
+ case 'macro':
348
+ return 15;
349
+ case 'module':
350
+ return 9;
351
+ case 'const':
352
+ return 21;
353
+ case 'static':
354
+ return 6;
355
+ case 'field':
356
+ return 5;
357
+ case 'enum':
358
+ return 13;
359
+ case 'variant':
360
+ return 20;
361
+ case 'reexport':
362
+ return 9;
363
+ case 'struct':
364
+ case 'trait':
365
+ case 'type':
366
+ return 7;
367
+ }
368
+ }
369
+ function platformCrateForSymbol(index, symbol) {
370
+ const moduleRoot = symbol.module.split('::', 1)[0];
371
+ return index.crates.find((crate) => crate.name.replace(/-/gu, '_') === moduleRoot);
372
+ }
373
+ function bounded(value, length) {
374
+ return value.length <= length ? value : `${value.slice(0, length - 1)}…`;
375
+ }
@@ -0,0 +1,43 @@
1
+ import { type PlatformIndex } from './platform-index.js';
2
+ import { RustAnalysis } from './rust-analysis.js';
3
+ export interface RustLspServerOptions {
4
+ postMessage: (message: unknown) => void;
5
+ createAnalysis: (index: PlatformIndex) => Promise<RustAnalysis>;
6
+ diagnosticDebounceMs?: number;
7
+ requestTimeoutMs?: number;
8
+ }
9
+ export declare const MAX_PENDING_LSP_REQUESTS = 256;
10
+ export declare class RustLspServer {
11
+ private readonly options;
12
+ private vfs;
13
+ private analysis;
14
+ private initialized;
15
+ private shuttingDown;
16
+ private disposed;
17
+ private readonly requestStates;
18
+ private readonly diagnosticTimers;
19
+ private readonly diagnosticGenerations;
20
+ constructor(options: RustLspServerOptions);
21
+ handle(raw: unknown): Promise<void>;
22
+ /**
23
+ * Observes a worker message before it enters the serialized dispatch queue.
24
+ * Request state is bounded, and unknown cancellation ids are never retained.
25
+ */
26
+ observeIncoming(raw: unknown): boolean;
27
+ /** Backwards-compatible immediate cancellation hook for direct transports. */
28
+ handleImmediate(raw: unknown): boolean;
29
+ private cancelRequest;
30
+ dispose(): void;
31
+ private handleRequest;
32
+ private initialize;
33
+ private dispatchAnalysisRequest;
34
+ private handleNotification;
35
+ private scheduleDiagnostics;
36
+ private cancelDiagnostics;
37
+ private publishDiagnostics;
38
+ private requireVfs;
39
+ private requireAnalysis;
40
+ private sendResult;
41
+ private sendError;
42
+ }
43
+ //# sourceMappingURL=rust-lsp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-lsp-server.d.ts","sourceRoot":"","sources":["../../src/live-coding/rust-lsp-server.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,cAAc,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAiBD,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,qBAAa,aAAa;IAaZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZpC,OAAO,CAAC,GAAG,CAAkC;IAC7C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IACJ,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoD;IACrF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA6B;gBAEtC,OAAO,EAAE,oBAAoB;IAEpD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzC;;;OAGG;IACH,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IA8BtC,8EAA8E;IAC9E,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAItC,OAAO,CAAC,aAAa;IAQrB,OAAO,IAAI,IAAI;YAgBD,aAAa;YA8Eb,UAAU;YAwCV,uBAAuB;YAgEvB,kBAAkB;IAwFhC,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;CAYlB"}